/// <summary> /// Копирование блоков сечений из шаблона блоков и доп списка блоков blNames /// </summary> /// <param name="fileBlocksTemplate"></param> /// <param name="service"></param> /// <param name="blNames"></param> /// <returns></returns> public static List <BlockSectionAbstract> LoadSections(string fileBlocksTemplate, BaseService service, List <string> blNames, out Dictionary <string, ObjectId> blNamesCopy) { blNamesCopy = new Dictionary <string, ObjectId>(); Dictionary <ObjectId, BlockSectionAbstract> blSecToCopy = new Dictionary <ObjectId, BlockSectionAbstract>(); using (var dbBlocks = new Database(false, true)) { dbBlocks.ReadDwgFile(fileBlocksTemplate, FileOpenMode.OpenForReadAndAllShare, false, ""); dbBlocks.CloseInput(true); using (var bt = dbBlocks.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (ObjectId idBtr in bt) { using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { var blNameToCopy = blNames.Find(n => n.Equals(btr.Name, StringComparison.OrdinalIgnoreCase)); if (!string.IsNullOrEmpty(blNameToCopy)) { blNamesCopy.Add(blNameToCopy, btr.Id); continue; } BlockSectionAbstract blSec = null; if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionVerticalPrefixName, StringComparison.OrdinalIgnoreCase)) { blSec = new BlockSectionVertical(btr.Name, service); } else if (btr.Name.StartsWith(Settings.Default.BlockPanelSectionHorizontalPrefixName, StringComparison.OrdinalIgnoreCase)) { blSec = new BlockSectionHorizontal(btr.Name, service); } if (blSec != null) { var resParse = blSec.ParseBlName(); if (resParse.Success) { blSecToCopy.Add(idBtr, blSec); //Определение ассоциативных штриховок и объектов с которыми они связаны blSec.getHatchAssociateIds(btr); } else { Inspector.AddError($"Не определены параметры блока сечения в файле шаблона блоков. {btr.Name}. {resParse.Error}", icon: System.Drawing.SystemIcons.Error); } } } } } if (blSecToCopy.Count > 0) { using (ObjectIdCollection ids = new ObjectIdCollection(blSecToCopy.Keys.ToArray())) { foreach (var item in blNamesCopy.Values) { ids.Add(item); } using (IdMapping map = new IdMapping()) { service.Db.WblockCloneObjects(ids, service.Db.BlockTableId, map, DuplicateRecordCloning.Replace, false); foreach (var item in blSecToCopy) { item.Value.IdBtr = map[item.Key].Value; if (item.Value._hatchsAssociatedIdsDictInTemplate != null) { item.Value.setHatchIdsMapping(map); //item.Value.ReplaceAssociateHatch(); } } foreach (var name in blNames) { ObjectId idBl; if (blNamesCopy.TryGetValue(name, out idBl)) { blNamesCopy[name] = map[idBl].Value; } } } } } else { Inspector.AddError("Не найдены блоки сечений панелей в файле шаблона блоков АКР. " + $"Файл шаблона {fileBlocksTemplate}. Префикс блоков {Settings.Default.BlockPanelSectionVerticalPrefixName} " + $"и {Settings.Default.BlockPanelSectionHorizontalPrefixName}", icon: System.Drawing.SystemIcons.Error); } } return(blSecToCopy.Values.ToList()); }