public Caption(List <MarkSb> marksSB) { _db = HostApplicationServices.WorkingDatabase; _marksSB = marksSB; _captionLayer = Caption.GetLayerForMark(_db); _idTextstylePik = DbExtensions.GetTextStylePIK(_db); }
public void CaptionPanels() { _captionLayer = Caption.GetLayerForMark(_db); foreach (MarkSb markSb in _marksSB) { if (HostApplicationServices.Current.UserBreak()) { throw new Exception("Отменено пользователем."); } AddMarkToPanelBtr(markSb.MarkSbClean, markSb.IdBtr); foreach (MarkAr markAr in markSb.MarksAR) { AddMarkToPanelBtr(markAr.MarkARPanelFullName, markAr.IdBtrAr); } } }
// Покраска панелей в модели (по блокам зон покраски) public void PaintPanels() { // Запрос начальных значений - Аббревиатуры, Номера первого этажа, Номера первого листа //promptStartOptions(); StartOptions = StartOptions.PromptStartOptions(); // Определение марок покраски панелей (Марок АР). // Создание определениц блоков марок АР. // Покраска панелей в чертеже. // В Модели должны быть расставлены панели Марки СБ и зоны покраски. // сброс списка цветов. _colors = new List<Paint>(); // Определение зон покраски в Модели _colorAreas = ColorArea.GetColorAreas(SymbolUtilityServices.GetBlockModelSpaceId(_db), this); RTree<ColorArea> rtreeColorAreas = ColorArea.GetRTree(_colorAreas); // Бонус - покраска блоков плитки разложенных просто в Модели try { Tile.PaintTileInModel(rtreeColorAreas); } catch (System.Exception ex) { Logger.Log.Error(ex, "Tile.PaintTileInModel(rtreeColorAreas);"); } // Сброс блоков панелей Марки АР на панели марки СБ. ResetBlocks(); // Проверка чертежа Inspector.Clear(); CheckDrawing checkDrawing = new CheckDrawing(); checkDrawing.CheckForPaint(); if (Inspector.HasErrors) { throw new System.Exception("\nПокраска панелей не выполнена, в чертеже найдены ошибки в блоках панелей, см. выше."); } SelectionBlocks selBlocks = new SelectionBlocks(_db); selBlocks.SelectBlRefsInModel(StartOptions.SortPanels); // В чертеже не должно быть панелей марки АР if (selBlocks.IdsBlRefPanelAr.Count > 0) { Inspector.AddError($"Ошибка. При покраске в чертеже не должно быть блоков панелей марки АР. Найдено {selBlocks.IdsBlRefPanelAr.Count} блоков марки АР.", icon: System.Drawing.SystemIcons.Error); } Sections = Panels.Section.GetSections(selBlocks.SectionsBlRefs); // Определение покраски панелей. _marksSB = MarkSb.GetMarksSB(rtreeColorAreas, this, "Покраска панелей...", selBlocks.IdsBlRefPanelSb); if (_marksSB?.Count == 0) { throw new System.Exception("Не найдены блоки панелей в чертеже. Выполните команду AKR-Help для просмотра справки к программе."); } // Проверить всели плитки покрашены. Если есть непокрашенные плитки, то выдать сообщение об ошибке. if (Inspector.HasErrors) { throw new System.Exception("\nПокраска не выполнена, не все плитки покрашены. См. список непокрашенных плиток в форме ошибок."); } // Определение принадлежности блоков панелеи секциям Panels.Section.DefineSections(this); // Переименование марок АР панелей в соответствии с индексами архитекторов (Э2_Яр1) RenamePanelsToArchitectIndex(_marksSB); // Создание определений блоков панелей покраски МаркиАР CreatePanelsMarkAR(); // Замена вхождений блоков панелей Марки СБ на блоки панелей Марки АР. ReplaceBlocksMarkSbOnMarkAr(); //// Определение принадлежности блоков панелеи фасадам //Facade.DefineFacades(this); // Добавление подписей к панелям Caption caption = new Caption(_marksSB); caption.CaptionPanels(); }
// Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ public static void ResetBlocks() { // Для покраски панелей, нужно, чтобы в чертеже были расставлены блоки панелей Марки СБ. // Поэтому, при изменении зон покраски, перед повторным запуском команды покраски панелей и создания альбома, // нужно восстановить блоки Марки СБ (вместо Марок АР). // Блоки панелей Марки АР - удалить. Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (var t = db.TransactionManager.StartTransaction()) { var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; var ms = t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord; var checkedBlocks = new HashSet<string>(); foreach (ObjectId idEnt in ms) { if (idEnt.ObjectClass.Name == "AcDbBlockReference") { var blRef = t.GetObject(idEnt, OpenMode.ForRead, false, true) as BlockReference; if (MarkSb.IsBlockNamePanel(blRef.Name)) { // Если это панель марки АР, то заменяем на панель марки СБ. if (MarkSb.IsBlockNamePanelMarkAr(blRef.Name)) { string markSb = MarkSb.GetMarkSbName(blRef.Name);// может быть с суффиксом торца _тп или _тл string markSbBlName = MarkSb.GetMarkSbBlockName(markSb);// может быть с суффиксом торца _тп или _тл if (!bt.Has(markSbBlName)) { // Нет определения блока марки СБ. // Такое возможно, если после покраски панелей, сделать очистку чертежа (блоки марки СБ удалятся). MarkSb.CreateBlockMarkSbFromAr(blRef.BlockTableRecord, markSbBlName); string errMsg = "\nНет определения блока для панели Марки СБ " + markSbBlName + ". Оно создано из панели Марки АР " + blRef.Name + ". Если внутри блока Марки СБ были зоны покраски, то в блоке Марки АР они были удалены." + "Необходимо проверить блоки и заново запустить программу."; ed.WriteMessage("\n" + errMsg); // Надо чтобы проектировщик проверил эти блоки, может в них нужно добавить зоны покраски (т.к. в блоках марки АР их нет). } var idBtrMarkSb = bt[markSbBlName]; var blRefMarkSb = new BlockReference(blRef.Position, idBtrMarkSb); blRefMarkSb.SetDatabaseDefaults(); blRefMarkSb.Layer = blRef.Layer; ms.UpgradeOpen(); ms.AppendEntity(blRefMarkSb); t.AddNewlyCreatedDBObject(blRefMarkSb, true); // Перенос плитки на слой "АР_Плитка" if (checkedBlocks.Add(markSbBlName)) { Tile.TilesNormalize(idBtrMarkSb); } } // Перенос плитки на слой "АР_Плитка" if (checkedBlocks.Add(blRef.Name)) { Tile.TilesNormalize(blRef.BlockTableRecord); } } } } Caption captionPanels = new Caption(db); // Удаление определений блоков Марок АР. foreach (ObjectId idBtr in bt) { var btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord; if (MarkSb.IsBlockNamePanel(btr.Name)) { // Если это блок панели Марки АР if (MarkSb.IsBlockNamePanelMarkAr(btr.Name)) { // Удаление всех вхожденний бллока var idsBlRef = btr.GetBlockReferenceIds(true, true); foreach (ObjectId idBlRef in idsBlRef) { var blRef = t.GetObject(idBlRef, OpenMode.ForWrite, false, true) as BlockReference; blRef.Erase(true); } // Удаление определение блока Марки АР btr.UpgradeOpen(); btr.Erase(true); } else { // Подпись марки блока string panelMark = btr.Name.Substring(Settings.Default.BlockPanelAkrPrefixName.Length); captionPanels.AddMarkToPanelBtr(panelMark, idBtr); } } } t.Commit(); } }
public Caption(Database db) { _db = db; _captionLayer = Caption.GetLayerForMark(db); _idTextstylePik = DbExtensions.GetTextStylePIK(_db); }