/// <summary> /// Получение фасадов из блоков монтажных планов и обозначений стороны фасада в чертеже /// </summary> /// <returns></returns> public static List <FacadeMounting> GetFacadesFromMountingPlans(PanelLibraryLoadService libLoadServ = null) { List <FacadeMounting> facades = new List <FacadeMounting>(); var db = HostApplicationServices.WorkingDatabase; using (var t = db.TransactionManager.StartTransaction()) { var ms = SymbolUtilityServices.GetBlockModelSpaceId(db).GetObject(OpenMode.ForRead) as BlockTableRecord; // Поиск всех блоков монтажных планов в Модели чертежа с соотв обозначением стороны фасада List <FloorMounting> floors = FloorMounting.GetMountingBlocks(libLoadServ, ms); // блоки сторон фасадов - Фасады List <FacadeFrontBlock> facadeFrontBlocks = FacadeFrontBlock.GetFacadeFrontBlocks(ms, floors); // Создание фасадов foreach (var front in facadeFrontBlocks) { FacadeMounting facade = new FacadeMounting(front); facades.Add(facade); } // определение уровней этажей Storey defineFloorStoreys(facades); t.Commit(); } return(facades); }
public FacadeMounting(FacadeFrontBlock front) { XMin = front.XMin; XMax = front.XMax; PosPtFrontBlock = front.Position; Panels = front.Panels; Floors = Panels.Select(p => p.Floor).GroupBy(g => g).Select(s => s.Key).ToList(); }
public static List <FacadeFrontBlock> GetFacadeFrontBlocks(BlockTableRecord ms, List <FloorMounting> floors) { List <FacadeFrontBlock> facadeFrontBlocks = new List <FacadeFrontBlock>(); foreach (ObjectId idEnt in ms) { var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (blRef == null) { continue; } // Если это блок обозначения стороны фасада - по имени блока if (string.Equals(blRef.GetEffectiveName(), Settings.Default.BlockFacadeName, StringComparison.CurrentCultureIgnoreCase)) { FacadeFrontBlock front = new FacadeFrontBlock(blRef); facadeFrontBlocks.Add(front); } } // Найти все блоки монтажных панелей входящих в фасад RTree <FloorMounting> rtreeFloors = new RTree <FloorMounting>(); foreach (var front in floors) { try { rtreeFloors.Add(front.RectangleRTree, front); } catch { } } foreach (var front in facadeFrontBlocks) { // найти соотв обозн стороны фасада var frontsIntersects = rtreeFloors.Intersects(front.RectangleRTree); // если нет пересечений фасадов - пропускаем блок монтажки - он не входит в // фасады, просто так вставлен if (frontsIntersects.Count == 0) { Inspector.AddError($"Для блока обозначения стороны фасада не найдены монтажные планы.", front.IdBlRef, System.Drawing.SystemIcons.Error); continue; } foreach (var item in frontsIntersects) { front.AddPanels(item); } front.DefineMinMax(); } return(facadeFrontBlocks); }
public static List<FacadeFrontBlock> GetFacadeFrontBlocks(BlockTableRecord ms, List<FloorMounting> floors) { List<FacadeFrontBlock> facadeFrontBlocks = new List<FacadeFrontBlock>(); foreach (ObjectId idEnt in ms) { var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference; if (blRef == null) { continue; } // Если это блок обозначения стороны фасада - по имени блока if (string.Equals(blRef.GetEffectiveName(), Settings.Default.BlockFacadeName, StringComparison.CurrentCultureIgnoreCase)) { FacadeFrontBlock front = new FacadeFrontBlock(blRef); facadeFrontBlocks.Add(front); } } // Найти все блоки монтажных панелей входящих в фасад RTree<FloorMounting> rtreeFloors = new RTree<FloorMounting>(); foreach (var front in floors) { try { rtreeFloors.Add(front.RectangleRTree, front); } catch { } } foreach (var front in facadeFrontBlocks) { // найти соотв обозн стороны фасада var frontsIntersects = rtreeFloors.Intersects(front.RectangleRTree); // если нет пересечений фасадов - пропускаем блок монтажки - он не входит в // фасады, просто так вставлен if (frontsIntersects.Count == 0) { Inspector.AddError($"Для блока обозначения стороны фасада не найдены монтажные планы.", front.IdBlRef, System.Drawing.SystemIcons.Error); continue; } foreach (var item in frontsIntersects) { front.AddPanels(item); } front.DefineMinMax(); } return facadeFrontBlocks; }