コード例 #1
0
 public static bool WithIn(ObjectId hole, ObjectId pacelId)
 {
     using (var tr = hole.Database.TransactionManager.StartTransaction())
     {
         // 读入多边形数据
         var reader   = new DwgReader();
         var polygon  = reader.ReadEntityAsPolygon(tr, hole) as IPolygon;
         var polygon2 = reader.ReadEntityAsPolygon(tr, pacelId) as IPolygon;
         if (polygon != null && polygon2 != null)
         {
             return(polygon.Within(polygon2));
         }
     }
     return(false);
 }
コード例 #2
0
        static TopoData BuildTopology()
        {
            var polylineIds = CadUtils.FindAllPolylines(Application.DocumentManager.MdiActiveDocument);
            var datebase    = Application.DocumentManager.MdiActiveDocument.Database;

            using (var tr = datebase.TransactionManager.StartTransaction())
            {
                // 读入多边形数据
                var reader   = new DwgReader();
                var polygons = new Dictionary <ObjectId, IPolygon>();
                var quadtree = new Quadtree <IGeometry>();

                // 构建拓扑
                foreach (ObjectId polylineId in polylineIds)
                {
                    var polygon = reader.ReadEntityAsPolygon(tr, polylineId) as IPolygon;
                    if (polygon != null)
                    {
                        polygons.Add(polylineId, polygon);
                        quadtree.Insert(polygon.EnvelopeInternal, polygon);
                    }
                }

                tr.Commit();

                return(new TopoData()
                {
                    Polygons = polygons,
                    Quadtree = quadtree,
                    Reader = reader,
                });
            }
        }
コード例 #3
0
        public static List <ObjectId> FindHoles()
        {
            var polylineIds = CadUtils.FindAllPolylines(Application.DocumentManager.MdiActiveDocument);
            var datebase    = Application.DocumentManager.MdiActiveDocument.Database;

            using (var tr = datebase.TransactionManager.StartTransaction())
            {
                // 读入多边形数据
                var reader   = new DwgReader();
                var polygons = new List <IPolygon>();
                var quadtree = new Quadtree <IGeometry>();

                foreach (ObjectId polylineId in polylineIds)
                {
                    var polygon = reader.ReadEntityAsPolygon(tr, polylineId) as IPolygon;
                    if (polygon != null)
                    {
                        polygons.Add(polygon);
                        quadtree.Insert(polygon.EnvelopeInternal, polygon);
                    }
                }

                var possibleHoleIds = new List <ObjectId>();

                // 便利多边形,如果有洞,开始计算
                foreach (var polygon in polygons)
                {
                    // 找洞
                    foreach (var geom in quadtree.Query(polygon.EnvelopeInternal))
                    {
                        var insidePolygon = geom as IPolygon;
                        if (insidePolygon != null &&
                            polygon.Within(insidePolygon) &&
                            insidePolygon.UserData != polygon.UserData)    // 不要是自己
                        {
                            possibleHoleIds.Add((ObjectId)insidePolygon.UserData);
                        }
                    }
                }
                tr.Commit();

                return(possibleHoleIds);
            }
        }
コード例 #4
0
        public static double FindHoleArea(ObjectId parcelId)
        {
            var polylineIds = CadUtils.FindAllPolylines(Application.DocumentManager.MdiActiveDocument);
            var datebase    = Application.DocumentManager.MdiActiveDocument.Database;
            var dictionary  = new Dictionary <ObjectId, double>();

            using (var tr = datebase.TransactionManager.StartTransaction())
            {
                // 读入多边形数据
                var reader   = new DwgReader();
                var polygons = new List <IPolygon>();
                var quadtree = new Quadtree <IGeometry>();

                foreach (ObjectId polylineId in polylineIds)
                {
                    var polygon = reader.ReadEntityAsPolygon(tr, polylineId) as IPolygon;
                    if (polygon != null)
                    {
                        polygons.Add(polygon);
                        quadtree.Insert(polygon.EnvelopeInternal, polygon);
                    }
                }

                // 遍历多边形,如果有洞,开始计算
                foreach (var polygon in polygons)
                {
                    // 找洞
                    var insidePolygons = new List <IPolygon>();
                    foreach (var geom in quadtree.Query(polygon.EnvelopeInternal))
                    {
                        var insidePolygon = geom as IPolygon;
                        if (insidePolygon != null &&
                            polygon.Contains(insidePolygon) &&
                            !insidePolygon.Equals(polygon) && // 不是同一个
                            insidePolygon.UserData != polygon.UserData)
                        {
                            insidePolygons.Add(insidePolygon);
                        }
                    }

                    // 算面积
                    var polygonId   = (ObjectId)polygon.UserData;
                    var linearRings = new List <ILinearRing>();
                    if (insidePolygons.Any())
                    {
                        foreach (var insidePolygon in insidePolygons)
                        {
                            ILinearRing linearRing = reader.GeometryFactory.CreateLinearRing(insidePolygon.ExteriorRing.CoordinateSequence);
                            if (!linearRing.IsCCW)
                            {
                                linearRing.Reverse();
                            }
                            linearRings.Add(linearRing);
                        }
                    }
                    IPolygon newPolygon = reader.GeometryFactory.CreatePolygon(polygon.Shell, linearRings.ToArray());
                    dictionary.Add(polygonId, newPolygon.Area);
                }
                tr.Commit();
            }

            return(dictionary[parcelId]);
        }
コード例 #5
0
        public static List <ObjectId> FindPotentialHoles(Document document)
        {
            var polylineIds   = CadUtils.FindAllPolylines(document);
            var datebase      = document.Database;
            var hashSetObjIds = new HashSet <ObjectId>(); // 避免重复的数据,用hashset

            using (var tr = datebase.TransactionManager.StartTransaction())
            {
                // 读入多边形数据
                var reader   = new DwgReader();
                var polygons = new List <IPolygon>();
                var quadtree = new Quadtree <IGeometry>();

                var possibleHoleIds = new List <ObjectId>();
                foreach (ObjectId polylineId in polylineIds)
                {
                    var polygon = reader.ReadEntityAsPolygon(tr, polylineId) as IPolygon;
                    if (polygon != null)
                    {
                        polygons.Add(polygon);
                        quadtree.Insert(polygon.EnvelopeInternal, polygon);
                    }

                    // ObjectIds
                    using (var ent = tr.GetObject(polylineId, OpenMode.ForRead) as Entity)
                    {
                        if (ent is Polyline2d || ent is Polyline)
                        {
                            // 如果是地块,直接跳过
                            string cassFlag = CadUtils.GetCassFlag(ent);
                            if (CassFlagName.ToLower() != cassFlag.ToLower())
                            {
                                possibleHoleIds.Add(polylineId);
                            }
                        }
                    }
                }

                // 遍历多边形,如果有洞,开始计算
                foreach (var polygon in polygons)
                {
                    //看看是否包含洞
                    //quadtree.Query()

                    // 找洞
                    foreach (var geom in quadtree.Query(polygon.EnvelopeInternal))
                    {
                        var hole = geom as IPolygon;
                        if (hole == null)
                        {
                            continue;
                        }

                        var holeId = (ObjectId)hole.UserData;
                        if (possibleHoleIds.Contains(holeId) && // 不是潜在的地块
                            !hole.Equals(polygon) && // 不是同一个多边形
                            hole.UserData != polygon.UserData && // 不是自己
                            hole.Within(polygon))      // 有洞!
                        {
                            hashSetObjIds.Add(holeId); //
                        }
                    }
                }
                tr.Commit();
                return(hashSetObjIds.ToList());
            }
        }