/// <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 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();
 }
Beispiel #4
0
        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;
        }