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);
 }
Beispiel #4
0
        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;
            });
        }
Beispiel #5
0
        // Покраска панелей в модели (по блокам зон покраски)
        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();
        }
Beispiel #6
0
        // Проверка панелей на чертеже и панелей в памяти (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.");
            }
        }
Beispiel #7
0
        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;
            });
        }