Beispiel #1
0
        public static void Check(Map map)
        {
            dictChecked = new Dictionary <ObjectId, HashSet <ObjectId> >();
            using (var regions = new DisposableSet <Region>())
                using (var contours = new DisposableSet <Polyline>())
                {
                    foreach (var build in map.Buildings)
                    {
                        dictChecked.Add(build.Building.IdEnt, new HashSet <ObjectId>());
                        build.InitContour();
                        if (build.Contour == null)
                        {
                            Inspector.AddError($"Не определен контур здания - {NetLib.StringExt.ClearString(build.GetInfo())}, слой '{build.Building.Layer}'. Проверка наложения зданий.",
                                               build.Building.IdEnt, System.Drawing.SystemIcons.Error);
                            continue;
                        }
                        contours.Add(build.Contour);
                        try
                        {
                            var reg = BrepExtensions.CreateRegion(build.Contour);
                            build.Region = reg;
                            regions.Add(reg);
                        }
                        catch (Exception ex)
                        {
                            Inspector.AddError($"Ошибка определения контура здания - '{NetLib.StringExt.ClearString(build.GetInfo())}', слой '{build.Building.Layer}'. {ex.Message}. Проверка наложения зданий.",
                                               build.Building.IdEnt, System.Drawing.SystemIcons.Error);
                        }
                    }
                    foreach (var build in map.Buildings.Where(w => w.Region != null))
                    {
                        // здания в границах текущего здания
                        var nearest = map.GetBuildingsInExtents(build.ExtentsInModel);
                        if (!nearest.Any())
                        {
                            continue;
                        }
                        nearest.Remove(build);
                        // Проверка наложение с каждым ближайшим зданием
                        foreach (var nearBuild in nearest)
                        {
                            // Чтобы не проверять два взаимно пересекающихся дома 2 раза
                            if (dictChecked[build.Building.IdEnt].Contains(nearBuild.Building.IdEnt))
                            {
                                continue;
                            }
                            dictChecked[nearBuild.Building.IdEnt].Add(build.Building.IdEnt);

                            CheckIntersect(build, nearBuild);
                        }
                    }
                }
        }
        public ObjectId CreateContour2(BlockTableRecord btr)
        {
            if (panelBtr.ExtentsByTile.Diagonal() < endOffset)
            {
                return(ObjectId.Null);
            }

            // из всех плиток отделить торцевые плитки????
            // дерево границ плиток
            TreeTiles = new RTree <Tuple <ObjectId, Extents3d> >();
            foreach (var item in panelBtr.Tiles)
            {
                try
                {
                    var r = new Rectangle(Math.Round(item.Item2.MinPoint.X, 1), Math.Round(item.Item2.MinPoint.Y, 1),
                                          Math.Round(item.Item2.MaxPoint.X, 1), Math.Round(item.Item2.MaxPoint.Y, 1), 0, 0);
                    TreeTiles.Add(r, item);
                }
                catch { }
            }

            // Отфильтровать плитки - панели от торцевых.
            using (var colPlTiles = new DisposableSet <Polyline>())
            {
                //List<Polyline> colPlTile = new List<Polyline>();
                foreach (var item in panelBtr.Tiles)
                {
                    // Проверить наличие плиток справа и слева - если есть плитка с одной из сторон то это плитка панели а не торца
                    // Проверка наличия плиток слева от этой
                    double yCenter      = ((Math.Round(item.Item2.MaxPoint.Y, 1) - Math.Round(item.Item2.MinPoint.Y, 1)) * 0.5);
                    var    ptCenterLeft = new Point(Math.Round(item.Item2.MinPoint.X, 1), yCenter, 0);
                    var    finds        = TreeTiles.Nearest(ptCenterLeft, distTileMinInPanel);
                    if (!finds.Skip(1).Any())
                    {
                        // Нет плиток слева, проверка плиток справа
                        var ptCenterRight = new Point(Math.Round(item.Item2.MaxPoint.X, 1), yCenter, 0);
                        finds = TreeTiles.Nearest(ptCenterRight, distTileMinInPanel);
                        if (!finds.Skip(1).Any())
                        {
                            // Нет плиток справа
                            // Проверка - торцевые плитки могут быть только у граней панели
                            if ((item.Item2.MinPoint.X - panelBtr.ExtentsByTile.MinPoint.X) < distTileMinInPanel ||
                                panelBtr.ExtentsByTile.MaxPoint.X - item.Item2.MaxPoint.X < distTileMinInPanel ||
                                item.Item2.MinPoint.Y - panelBtr.ExtentsByTile.MinPoint.Y < distTileMinInPanel ||
                                panelBtr.ExtentsByTile.MaxPoint.Y - item.Item2.MaxPoint.Y < distTileMinInPanel)
                            {
                                continue;
                            }
                        }
                    }
                    // Плитка панели, а не торца
                    Polyline pl = item.Item2.GetPolyline();
                    colPlTiles.Add(pl);
                }

                using (var regUnion = BrepExtensions.Union(colPlTiles, null))
                {
                    var plUnion = regUnion.GetPolylines().FirstOrDefault(f => f.Value == BrepLoopType.LoopExterior);
                    //var pl3d = colPlTiles.GetExteriorContour();
                    if (plUnion.Key != null)
                    {
                        if (panelBtr.CPS != null)
                        {
                            plUnion.Key.LayerId = panelBtr.CPS.IdLayerContour;
                        }
                        btr.AppendEntity(plUnion.Key);
                        btr.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(plUnion.Key, true);

                        panelBtr.ExtentsNoEnd = plUnion.Key.GeometricExtents;
                        return(plUnion.Key.Id);
                    }
                }
            }
            return(ObjectId.Null);
        }