// Определение зон покраски в определении блока public static List <ColorArea> GetColorAreas(ObjectId idBtr, Album album) { List <ColorArea> colorAreas = new List <ColorArea>(); using (var t = idBtr.Database.TransactionManager.StartTransaction()) { var lvs = new AcadLib.Layers.LayerVisibleState(idBtr.Database); IterateColorAreasInBtr(idBtr, album, colorAreas, Matrix3d.Identity, string.Empty, lvs); t.Commit(); } // Сортировка зон покраски по размеру colorAreas.Sort(); return(colorAreas); }
/// <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(); } }
private static void IterateColorAreasInBtr(ObjectId idBtr, Album album, List <ColorArea> colorAreas, Matrix3d matrix, string xrefName, AcadLib.Layers.LayerVisibleState lvs) { var btr = idBtr.GetObject(OpenMode.ForRead) as BlockTableRecord; foreach (ObjectId idEnt in btr) { if (idEnt.IsValidEx() && idEnt.ObjectClass.Name == "AcDbBlockReference") { var blRefColorArea = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (!lvs.IsVisible(blRefColorArea)) { continue; } var blName = getBlNameWithoutXrefPrefix(blRefColorArea.GetEffectiveName(), xrefName); if (blName.StartsWith(Settings.Default.BlockColorAreaName, StringComparison.InvariantCultureIgnoreCase)) { var colorArea = new ColorArea(blRefColorArea, album, matrix); colorAreas.Add(colorArea); } else { // Если это не блок Панели, то ищем вложенные в блоки зоны покраски if (!MarkSb.IsBlockNamePanel(blName)) { var btrInner = blRefColorArea.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord; // Обработка вложенных зон покраски в блок if (btrInner.IsFromExternalReference) { IterateColorAreasInBtr(btrInner.Id, album, colorAreas, blRefColorArea.BlockTransform.PostMultiplyBy(matrix), btrInner.Name, lvs); } else { IterateColorAreasInBtr(btrInner.Id, album, colorAreas, blRefColorArea.BlockTransform.PostMultiplyBy(matrix), xrefName, lvs); } } } } } }
/// <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(); } }