Ejemplo n.º 1
0
        ///// <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);
        }
Ejemplo n.º 2
0
 /// <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);
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
        // Создание файла Марки СБ
        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);
        }
Ejemplo n.º 4
0
 public BlockWindow(BlockReference blRef, string blName, MarkSb markSb)
 {
     MarkSb = markSb;
     BlName = blName;
     defineWindow(blRef);
     checkWindow();
 }
Ejemplo n.º 5
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.");
            }
        }
Ejemplo n.º 6
0
        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);
                }
            });
        }
Ejemplo n.º 7
0
 // Конструктор
 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();
 }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        // Проверка, все ли плитки покрашены
        //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);
        }
Ejemplo n.º 11
0
 public PanelDescription(MarkSb markSB, Database db)
 {
     this.markSB = markSB;
     this.db     = db;
 }
Ejemplo n.º 12
0
        /// <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();
            }
        }
Ejemplo n.º 13
0
 public PanelDescription(MarkSb markSB, Database db)
 {
     this.markSB = markSB;
     this.db = db;
 }
Ejemplo n.º 14
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();
        }
Ejemplo n.º 15
0
        // Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ
        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();
            }
        }