// Сброс блоков панелей в чертеже. Замена панелей марки АР на панели марки СБ 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(); } }