private List <WindowRedefine> getRedefineBlocks(List <ObjectId> idsBtrPanels) { List <WindowRedefine> redefines = new List <WindowRedefine>(); foreach (var idBtrPanel in idsBtrPanels) { var btrPanel = idBtrPanel.GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in btrPanel) { if (!idEnt.IsValidEx()) { continue; } var blRefWindowOld = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (blRefWindowOld == null) { continue; } WindowTranslator translatorW; string blName = blRefWindowOld.GetEffectiveName(); bool isAkrBlWin = false; if (blName.Equals(Settings.Default.BlockWindowName, StringComparison.OrdinalIgnoreCase)) { translatorW = WindowTranslator.GetAkrBlWinTranslator(blRefWindowOld); isAkrBlWin = true; } else { translatorWindows.TryGetValue(blName, out translatorW); } if (translatorW != null) { WindowRedefine winRedefine = new WindowRedefine(isAkrBlWin, blRefWindowOld, translatorW); redefines.Add(winRedefine); } else { if (blName.Contains("окно", StringComparison.OrdinalIgnoreCase)) { Inspector.AddError($"Не определен транслятор для блока '{blName}'", System.Drawing.SystemIcons.Warning); } } } } return(redefines); }
public int Redefine() { int count = 0; doc = Application.DocumentManager.MdiActiveDocument; ed = doc.Editor; Db = doc.Database; using (Transaction = Db.TransactionManager.StartTransaction()) { WindowRedefine.Init(); // Блоки панелей АКР List <ObjectId> idsBtrPanels = getPanelsBtr(); // Транслятор имен блоков окон в параметр марки блока АКР_Окно if (translatorWindows == null) { translatorWindows = WindowTranslator.GetTranslatorWindows(); } // Сбор блоков окон для замены. List <WindowRedefine> redefines = getRedefineBlocks(idsBtrPanels); // Переопределение блоков окон из библиотеки string fileAkrWinBlocksTemplate = Path.Combine(Commands.CurDllDir, Settings.Default.TemplateBlocksAkrWindows); AcadLib.Blocks.Block.CopyBlockFromExternalDrawing( n => n.StartsWith(Settings.Default.BlockWindowName), fileAkrWinBlocksTemplate, Db, DuplicateRecordCloning.Replace); // Проверка наличия слоя для вставки окон. AcadLib.Layers.LayerExt.CheckLayerState(Settings.Default.LayerWindows); // Замена блоков окон foreach (var redefine in redefines) { try { redefine.Replace(); count++; } catch (Exception ex) { Inspector.AddError($"Не удалось обновить блок {redefine.BlNameOld} - {ex.Message}", System.Drawing.SystemIcons.Error); } } Transaction.Commit(); } return(count); }