public void ClearPanelsAkrFromDrawing(Database db) { SelectionBlocks sel = new SelectionBlocks(db); sel.SelectAKRPanelsBtr(); List<ObjectId> idsBtrPanelsAkr = sel.IdsBtrPanelAr.ToList(); idsBtrPanelsAkr.AddRange(sel.IdsBtrPanelSb); List<ObjectId> idsBtrOther = new List<ObjectId>(); foreach (ObjectId idBtrPanel in idsBtrPanelsAkr) { using (var btrPanel = idBtrPanel.Open(OpenMode.ForRead) as BlockTableRecord) { foreach (ObjectId idBlRefPanel in btrPanel.GetBlockReferenceIds(false, true)) { using (var blRefPanel = idBlRefPanel.Open(OpenMode.ForWrite, false, true) as BlockReference) { blRefPanel.Erase(); } } foreach (ObjectId idEnt in btrPanel) { using (var blRef = idEnt.Open(OpenMode.ForRead, false, true) as BlockReference) { if (blRef == null) continue; idsBtrOther.Add(blRef.BlockTableRecord); } } } } eraseIdsDbo(idsBtrPanelsAkr); eraseIdsDbo(idsBtrOther); }
/// <summary> /// Экспорт фасада для АР /// </summary> public void Export() { // Список панелей для экспорта SelectPanels = new SelectionBlocks(); SelectPanels.SelectBlRefsInModel(false); if (SelectPanels.IdsBlRefPanelSb.Count > 0) { Inspector.AddError("В текущем чертеже в Модели не должно быть панелей Марки СБ (только Марки АР).", icon: System.Drawing.SystemIcons.Error); return; } if (SelectPanels.IdsBlRefPanelAr.Count == 0) { Inspector.AddError("Не найдены панели Марки АР в Моделе текущего чертежа.", icon: System.Drawing.SystemIcons.Error); return; } // Определить файл в который экспортировать фасад _fileExport = new FileExport(); _fileExport.DefineFile(); // определение фасадов (вокруг панелей АКР) var facades = Facade.GetFacades(SelectPanels.FacadeBlRefs); // Определение экспортируемых панелей и фасадов CPS = new ConvertPanelService(this); CPS.DefinePanels(facades); using (var dbExport = new Database(!_fileExport.IsExistsFileExport, true)) { if (_fileExport.IsExistsFileExport) { // удалить старые панели из файла экспорта try { dbExport.ReadDwgFile(_fileExport.FileExportFacade.FullName, FileShare.Read, true, ""); } catch (Exception ex) { // файл занят. warningMessageBusyFileExportFacade(ex, _fileExport.FileExportFacade.FullName); throw; } // сделать копию файла _fileExport.Backup(); dbExport.CloseInput(true); deletePanels(dbExport); } dbExport.CloseInput(true); CPS.DbExport = dbExport; // Копирование панелей АР в экспортный файл copyPanelToExportFile(dbExport); // Переопределение блока плитки из файла шаблона блоков для Экспорта фасадов. redefineBlockTile(dbExport); using (AcadLib.WorkingDatabaseSwitcher switchDb = new AcadLib.WorkingDatabaseSwitcher(dbExport)) { using (var t = dbExport.TransactionManager.StartTransaction()) { // Преобразования определений блоков CPS.ConvertBtr(); // Преобразования торцов фасадов CPS.ConvertEnds(); t.Commit(); } } CPS.Purge(); dbExport.SaveAs(_fileExport.FileExportFacade.FullName, DwgVersion.Current); } }
private void deletePanels(Database dbExport) { // Удаление блоков панелей из существующего чертежа экпорта фасадов SelectionBlocks selPanels = new SelectionBlocks(dbExport); selPanels.SelectBlRefsInModel(false); deleteBlRefs(selPanels.IdsBlRefPanelAr); // Панелей СБ не должно быть, но на всякий случай удалю. deleteBlRefs(selPanels.IdsBlRefPanelSb); }
public void AKR_PaintPanels() { CommandStart.Start(doc => { //// Принудительное сохранение файла //if (File.Exists(doc.Name)) //{ // object obj = AcAp.GetSystemVariable("DBMOD"); // // Проверка значения системной переменной DBMOD. Если 0 - значит чертёж не был изменён // if (Convert.ToInt16(obj) != 0) // { // var db = doc.Database; // try // { // db.SaveAs(db.Filename, true, DwgVersion.Current, db.SecurityParameters); // } // catch (System.Exception ex) // { // doc.Editor.WriteMessage($"Ошибка сохранения файла. {ex.Message}"); // Logger.Log.Error(ex, "Ошибка при сохранении чертеже перед покраской"); // } // } //} string commandName = nameof(AKR_PaintPanels); if (string.Equals(_lastStartCommandName, commandName)) { if ((DateTime.Now - _lastStartCommandDateTime).Seconds < 5) { doc.Editor.WriteMessage("Между запусками команды прошло меньше 5 секунд. Отмена."); return; } } // Проверка дубликатов блоков Select.SelectionBlocks sel = new Select.SelectionBlocks(doc.Database); sel.SelectBlRefsInModel(false); var panelsToCheck = sel.IdsBlRefPanelAr; panelsToCheck.AddRange(sel.IdsBlRefPanelSb); CheckDublicateBlocks.Check(panelsToCheck); Inspector.Clear(); if (_album == null) { _album = new Album(); } else { // Повторный запуск программы покраски панелей. // Сброс данных _album.ResetData(); } // Покраска _album.PaintPanels(); doc.Editor.Regen(); doc.Editor.WriteMessage("\nПокраска панелей выполнена успешно."); Logger.Log.Info("Покраска панелей выполнена успешно. {0}", doc.Name); _lastStartCommandName = commandName; _lastStartCommandDateTime = DateTime.Now; }); }
// Покраска панелей в модели (по блокам зон покраски) 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(); }
// Проверка панелей на чертеже и панелей в памяти (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_PaintPanels() { CommandStart.Start(doc => { //// Принудительное сохранение файла //if (File.Exists(doc.Name)) //{ // object obj = AcAp.GetSystemVariable("DBMOD"); // // Проверка значения системной переменной DBMOD. Если 0 - значит чертёж не был изменён // if (Convert.ToInt16(obj) != 0) // { // var db = doc.Database; // try // { // db.SaveAs(db.Filename, true, DwgVersion.Current, db.SecurityParameters); // } // catch (System.Exception ex) // { // doc.Editor.WriteMessage($"Ошибка сохранения файла. {ex.Message}"); // Logger.Log.Error(ex, "Ошибка при сохранении чертеже перед покраской"); // } // } //} string commandName = nameof(AKR_PaintPanels); if (string.Equals(_lastStartCommandName, commandName)) { if ((DateTime.Now - _lastStartCommandDateTime).Seconds < 5) { doc.Editor.WriteMessage("Между запусками команды прошло меньше 5 секунд. Отмена."); return; } } // Проверка дубликатов блоков Select.SelectionBlocks sel = new Select.SelectionBlocks (doc.Database); sel.SelectBlRefsInModel(false); var panelsToCheck = sel.IdsBlRefPanelAr; panelsToCheck.AddRange(sel.IdsBlRefPanelSb); CheckDublicateBlocks.Check(panelsToCheck); Inspector.Clear(); if (_album == null) { _album = new Album(); } else { // Повторный запуск программы покраски панелей. // Сброс данных _album.ResetData(); } // Покраска _album.PaintPanels(); doc.Editor.Regen(); doc.Editor.WriteMessage("\nПокраска панелей выполнена успешно."); Logger.Log.Info("Покраска панелей выполнена успешно. {0}", doc.Name); _lastStartCommandName = commandName; _lastStartCommandDateTime = DateTime.Now; }); }