///// <summary> ///// Проверка есть ли в текущем чертеже фасада новые панели, которых нет в библиотеке ///// </summary> //public static void CheckNewPanels() //{ // var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; // var dbCur = doc.Database; // var ed = doc.Editor; // // список панелей (АКР-Панели марки СБ - без марки покраски) в текущем чертеже // List<PanelAkrFacade> panelsAkrFacade = GetPanelsAkrInDb(dbCur); // // исключение панелей с индексом электрики // removeElectricPanels(panelsAkrFacade); // // список панелей в бибилиотеке // List<PanelAkrLib> panelsAkrLib = GetPanelsInLib(); // // сравнение списков и поиск новых панелей, которых нет в бибилиотеке // List<string> panelsNotInLib = new List<string>(); // foreach (var panelInFacade in panelsAkrFacade) // { // if (!panelsAkrLib.Exists(p => string.Equals(p.BlName, panelInFacade.BlName, StringComparison.CurrentCultureIgnoreCase))) // { // panelsNotInLib.Add(panelInFacade.BlName); // } // } // if (panelsNotInLib.Count > 0) // { // ed.WriteMessage("\n!!!Важно!!! В чертеже есть новые блоки АКР-Панелей которых нет в библиотеке:"); // foreach (var panel in panelsNotInLib) // { // ed.WriteMessage("\n{0}", panel); // } // ed.WriteMessage("\nРекомендуется сохранить их в библиотеку - на палитре есть кнопка для сохранения панелей в библиотеку."); // Logger.Log.Error("Есть новые панели, которых нет в библиотеке: {0}", string.Join("; ", panelsNotInLib)); // } //} public static List <PanelAkrFacade> GetPanelsAkrInDb(Database db) { List <PanelAkrFacade> panels = new List <PanelAkrFacade>(); using (var t = db.TransactionManager.StartTransaction()) { var bt = t.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; foreach (ObjectId idBtr in bt) { if (!idBtr.IsValidEx()) { continue; } var btr = t.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord; if (!btr.IsLayout) { if (MarkSb.IsBlockNamePanel(btr.Name) && !MarkSb.IsBlockNamePanelMarkAr(btr.Name)) { panels.Add(new PanelAkrFacade(idBtr, btr.Name)); } } } t.Commit(); } return(panels); }
/// <summary> /// Выбор определений блоков панелей Марки АР и Марки СБ /// </summary> public void SelectAKRPanelsBtr() { IdsBtrPanelAr = new List <ObjectId>(); IdsBtrPanelSb = new List <ObjectId>(); using (var bt = _db.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (ObjectId idEnt in bt) { if (!idEnt.IsValidEx()) { continue; } using (var btr = idEnt.Open(OpenMode.ForRead) as BlockTableRecord) { if (btr == null) { continue; } if (MarkSb.IsBlockNamePanel(btr.Name)) { if (MarkSb.IsBlockNamePanelMarkAr(btr.Name)) { IdsBtrPanelAr.Add(idEnt); } else { IdsBtrPanelSb.Add(idEnt); } } } } } }
// Создание файла Марки СБ private string CreateFileMarkSB(MarkSb markSB, string albumFolder, string templateFileMarkSB, int count) { string fileDest = Path.Combine(albumFolder, count.ToString("00") + "_" + markSB.MarkSbName + ".dwg"); File.Copy(templateFileMarkSB, fileDest); return(fileDest); }
public BlockWindow(BlockReference blRef, string blName, MarkSb markSb) { MarkSb = markSb; BlName = blName; defineWindow(blRef); checkWindow(); }
// Проверка панелей на чертеже и панелей в памяти (this) public void CheckPanelsInDrawingAndMemory() { // Проверка зон покраски var colorAreasCheck = ColorArea.GetColorAreas(SymbolUtilityServices.GetBlockModelSpaceId(_db), this); // сравнение фоновых зон if (!colorAreasCheck.SequenceEqual(_colorAreas)) { throw new System.Exception("Изменились зоны покраски. Рекомендуется выполнить повторную покраску панелей командой PaintPanels."); } // Проверка панелей // Определение покраски панелей. var rtreeColorAreas = ColorArea.GetRTree(colorAreasCheck); SelectionBlocks selBlocks = new SelectionBlocks(_db); selBlocks.SelectBlRefsInModel(StartOptions.SortPanels); var marksSbCheck = MarkSb.GetMarksSB(rtreeColorAreas, this, "Проверка панелей...", selBlocks.IdsBlRefPanelAr); //RenamePanelsToArchitectIndex(marksSbCheck); if (!marksSbCheck.SequenceEqual(_marksSB)) { throw new System.Exception("Панели изменились после последнего выполнения команды покраски. Рекомендуется выполнить повторную покраску панелей командой PaintPanels."); } }
public void AKR_SelectPanels() { CommandStart.Start(doc => { Database db = doc.Database; Editor ed = doc.Editor; using (var DocLock = doc.LockDocument()) { Dictionary <string, List <ObjectId> > panels = new Dictionary <string, List <ObjectId> >(); int countMarkSbPanels = 0; int countMarkArPanels = 0; using (var t = db.TransactionManager.StartTransaction()) { var ms = t.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in ms) { if (idEnt.IsValidEx() && 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)) { countMarkArPanels++; } else { countMarkSbPanels++; } if (panels.ContainsKey(blRef.Name)) { panels[blRef.Name].Add(blRef.ObjectId); } else { List <ObjectId> idBlRefs = new List <ObjectId>(); idBlRefs.Add(blRef.ObjectId); panels.Add(blRef.Name, idBlRefs); } } } } t.Commit(); } foreach (var panel in panels) { ed.WriteMessage("\n" + panel.Key + " - " + panel.Value.Count); } ed.SetImpliedSelection(panels.Values.SelectMany(p => p).ToArray()); ed.WriteMessage("\nВыбрано блоков панелей в Модели: Марки СБ - {0}, Марки АР - {1}", countMarkSbPanels, countMarkArPanels); Logger.Log.Info("Выбрано блоков панелей в Модели: Марки СБ - {0}, Марки АР - {1}", countMarkSbPanels, countMarkArPanels); } }); }
// Конструктор public SheetMarkSB(MarkSb markSB) { _markSB = markSB; _sheetsMarkAR = new List <SheetMarkAr>(); // Обработка Марок АР foreach (var markAR in _markSB.MarksAR) { SheetMarkAr sheetAR = new SheetMarkAr(markAR); _sheetsMarkAR.Add(sheetAR); } // Сортировка листов Марок АР _sheetsMarkAR.Sort(); }
public static List <PanelAKR> GetAkrPanelLib(Database dbLib, bool defineFullPaneldata) { List <PanelAKR> panelsAkrLIb = new List <PanelAKR>(); using (var bt = dbLib.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { using (ProgressMeter progress = new ProgressMeter()) { List <Tuple <ObjectId, string> > idBtrPanels = new List <Tuple <ObjectId, string> >(); foreach (ObjectId idBtr in bt) { if (!idBtr.IsValidEx()) { continue; } using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { if (MarkSb.IsBlockNamePanel(btr.Name)) { idBtrPanels.Add(new Tuple <ObjectId, string>(idBtr, btr.Name)); } } } progress.SetLimit(idBtrPanels.Count); progress.Start("Считывание панелей из библиотеки..."); foreach (var idBtr in idBtrPanels) { if (HostApplicationServices.Current.UserBreak()) { throw new System.Exception(AcadLib.General.CanceledByUser); } PanelAKR panelAkr = new PanelAKR(idBtr.Item1, idBtr.Item2); if (defineFullPaneldata) { panelAkr.DefineGeom(idBtr.Item1); } panelsAkrLIb.Add(panelAkr); progress.MeterProgress(); } progress.Stop(); } } return(panelsAkrLIb); }
public PanelAKR(ObjectId idBtrAkrPanel, string blName) { IdBtrAkrPanel = idBtrAkrPanel; BlName = blName; Description = ""; var val = MarkSb.GetMarkSbName(blName); string windowSx; AkrHelper.GetMarkWithoutWindowsSuffix(val, out windowSx); WindowSuffix = windowSx; MarkAkr = MarkSb.GetMarkSbCleanName(val);//.Replace(' ', '-'); // Список объектов в блоке EntInfos = EntityInfo.GetEntInfoBtr(idBtrAkrPanel); }
// Проверка, все ли плитки покрашены //public static bool CheckAllTileArePainted(List<MarkSbPanel> marksSb) //{ // bool res = true; // //_notPaintedTilesInMarkAR = new List<ErrorObject>(); // foreach (var markSb in marksSb) // { // if (markSb.MarksAR.Count == 0) // { // // Такого не должно быть. Марка СБ есть, а марок АР нет. // Error err = new Error(string.Format("\nЕсть Марка СБ {0}, а Марки АР не определены. Ошибка в программе(.", markSb.MarkSb)); // } // foreach (var markAr in markSb.MarksAR) // { // bool isAllTilePainted = true; // foreach (var paint in markAr.Paints) // { // if (paint == null) // { // // Плитка не покрашена! // isAllTilePainted = false; // string errMsg = "Не вся плитка покрашена в блоке " + markSb.MarkSb; // ErrorObject errObj = new ErrorObject(errMsg, ObjectId.Null); // _notPaintedTilesInMarkAR.Add(errObj); // //_ed.WriteMessage("\n" + errMsg); // res = false; // break; // } // } // if (!isAllTilePainted) break; // } // } // return res; //} // Проверка наличия определений блоков Марки АР private List <string> checkBtrMarkAr() { List <string> markArBtrNames = new List <string>(); using (var bt = _db.BlockTableId.Open(OpenMode.ForRead) as BlockTable) { foreach (var idBtr in bt) { if (!idBtr.IsValidEx()) { continue; } using (var btr = idBtr.Open(OpenMode.ForRead) as BlockTableRecord) { if (MarkSb.IsBlockNamePanelMarkAr(btr.Name)) { markArBtrNames.Add(btr.Name); } } } } return(markArBtrNames); }
public PanelDescription(MarkSb markSB, Database db) { this.markSB = markSB; this.db = db; }
/// <summary> /// Выбор вхождений блоков панелей Марки АР и Марки СБ в Модели /// + выбор блоков Секций. /// + выбор фасадов /// </summary> public void SelectBlRefsInModel(bool sortPanels) { SectionsBlRefs = new List <ObjectId>(); FacadeBlRefs = new List <ObjectId>(); List <KeyValuePair <Point3d, ObjectId> > listPtsIdsBlRefMarkAr = new List <KeyValuePair <Point3d, ObjectId> >(); List <KeyValuePair <Point3d, ObjectId> > listPtsIdsBlRefMarkSb = new List <KeyValuePair <Point3d, ObjectId> >(); using (var t = _db.TransactionManager.StartTransaction()) { var lvs = new AcadLib.Layers.LayerVisibleState(_db); var ms = SymbolUtilityServices.GetBlockModelSpaceId(_db).GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in ms) { if (!idEnt.IsValidEx()) { continue; } var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (blRef == null || !lvs.IsVisible(blRef)) { continue; } // Блоки АКР-Панелей if (MarkSb.IsBlockNamePanel(blRef.Name)) { if (MarkSb.IsBlockNamePanelMarkAr(blRef.Name)) { listPtsIdsBlRefMarkAr.Add(new KeyValuePair <Point3d, ObjectId>(blRef.Position, idEnt)); } else { listPtsIdsBlRefMarkSb.Add(new KeyValuePair <Point3d, ObjectId>(blRef.Position, idEnt)); } continue; } if (blRef.IsDynamicBlock) { // Блоки Секций var blNameEff = blRef.GetEffectiveName(); if (string.Equals(blNameEff, Settings.Default.BlockSectionName, StringComparison.CurrentCultureIgnoreCase)) { SectionsBlRefs.Add(idEnt); } // Блоки Фасадов else if (string.Equals(blNameEff, Settings.Default.BlockFacadeName, StringComparison.CurrentCultureIgnoreCase)) { FacadeBlRefs.Add(idEnt); } } } t.Commit(); } if (sortPanels) { // сортировка блоков панелей IdsBlRefPanelAr = getSortedIdBlrefPanel(listPtsIdsBlRefMarkAr); IdsBlRefPanelSb = getSortedIdBlrefPanel(listPtsIdsBlRefMarkSb); } else { // Без сортировки панелей IdsBlRefPanelAr = listPtsIdsBlRefMarkAr.Select(p => p.Value).ToList(); IdsBlRefPanelSb = listPtsIdsBlRefMarkSb.Select(p => p.Value).ToList(); } }
// Покраска панелей в модели (по блокам зон покраски) 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.IsValidEx() && 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) { if (!idBtr.IsValidEx()) { continue; } 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(); } }