Exemplo n.º 1
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();
            }
        }