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); }