Beispiel #1
0
        private static TopologyData BuildTopology(ObjectId[] objectIds)
        {
            var topoData = new TopologyData();
            var database = objectIds[0].Database;

            using (var tr = database.TransactionManager.StartTransaction())
            {
                var reader = new DwgReader();
                foreach (ObjectId objectId in objectIds)
                {
                    // 如果没有
                    var curve = tr.GetObject(objectId, OpenMode.ForRead) as Curve;
                    if (curve == null || !curve.Visible)
                    {
                        continue;
                    }

                    // 图层关闭,继续,因为有可能是图幅层
                    var layer = (LayerTableRecord)tr.GetObject(curve.LayerId, OpenMode.ForRead);
                    if (layer.IsOff)
                    {
                        continue;
                    }

                    // 目前只处理封闭的和大于3的多边形
                    // http://192.168.0.6:8080/browse/LCLIBCAD-903
                    // 否则会弹出points must form a closed linestring异常
                    if (curve.Closed &&
                        reader.NumberOfVerticesMoreThan3(curve))
                    {
                        var geom = reader.ReadCurveAsPolygon(tr, curve) as IGeometry;
                        geom = geom.Buffer(0);
                        if (!geom.IsValid)
                        {
                            topoData.InvalidObjects.Add(objectId);
                            System.Diagnostics.Trace.WriteLine(geom.ToString());
                        }
                        // 没有包围盒,无法进入空间索引
                        else if (geom.EnvelopeInternal.IsNull)
                        {
                            topoData.WrongEnvelopeObjects.Add(objectId);
                        }
                        else
                        {
                            //geom = SimpleGeometryPrecisionReducer.Reduce(geom, pmFixed3);
                            geom.UserData = objectId;
                            topoData.Quadtree.Insert(geom.EnvelopeInternal, geom);
                            topoData.Geometries.Add(geom);
                            topoData.GeometryDictionary[objectId] = geom;
                        }
                    }
                }

                tr.Commit();
            }

            return(topoData);
        }
Beispiel #2
0
        public static Dictionary <Curve, IList <Curve> > GetNearGeometries(IEnumerable <Curve> curves, double buffer, bool forceClosed = true)
        {
            var dictionary = new Dictionary <Curve, IList <Curve> >();
            var quadtree   = new Quadtree <IGeometry>();
            var reader     = new DwgReader();
            var geometries = new List <IGeometry>();

            foreach (var curve in curves)
            {
                // 目前只处理封闭的和大于3的多边形
                // http://192.168.0.6:8080/browse/LCLIBCAD-903
                // 否则会弹出“points must form a closed linestring”异常
                if (forceClosed && !curve.Closed || !reader.NumberOfVerticesMoreThan3(curve))
                {
                    continue;
                }
                var geom = reader.ReadCurveAsPolygon(null, curve) as Polygon;
                if (geom == null)
                {
                    continue;
                }

                geom.UserData = curve;
                quadtree.Insert(geom.EnvelopeInternal, geom);
                geometries.Add(geom);
            }
            foreach (var geom in geometries)
            {
                var nearGeoms = GetNearGeometries(geom, quadtree, buffer);
                var curve     = (Curve)geom.UserData;

                var nearCurves = new List <Curve>();
                foreach (var geometry in nearGeoms)
                {
                    var nearCurve = (Curve)geometry.UserData;
                    if (nearCurve != curve)
                    {
                        nearCurves.Add(nearCurve);
                    }
                }

                dictionary[curve] = nearCurves;
            }
            return(dictionary);
        }
Beispiel #3
0
        public static Dictionary <ObjectId, IList <ObjectId> > GetNearGeometries(IList <ObjectId> objectIds, double buffer, bool forceClosed = true)
        {
            var dictionary = new Dictionary <ObjectId, IList <ObjectId> >();

            var database   = objectIds[0].Database;
            var quadtree   = new Quadtree <IGeometry>();
            var geometries = new List <IGeometry>();

            using (var tr = database.TransactionManager.StartTransaction())
            {
                var reader = new DwgReader();
                foreach (ObjectId objectId in objectIds)
                {
                    if (!objectId.IsValid)
                    {
                        continue;
                    }

                    Debug.WriteLine("{0}", objectId.Handle);

                    var curve = tr.GetObject(objectId, OpenMode.ForRead) as Curve;
                    if (curve == null)
                    {
                        continue;
                    }

                    // 目前只处理封闭的和大于3的多边形
                    // http://192.168.0.6:8080/browse/LCLIBCAD-903
                    // 否则会弹出“points must form a closed linestring”异常
                    if (forceClosed && !curve.Closed || !reader.NumberOfVerticesMoreThan3(curve))
                    {
                        continue;
                    }

                    var geom = reader.ReadCurveAsPolygon(tr, curve) as Polygon;
                    if (geom == null)
                    {
                        continue;
                    }

                    geom.UserData = objectId;
                    quadtree.Insert(geom.EnvelopeInternal, geom);
                    geometries.Add(geom);
                }

                foreach (var geom in geometries)
                {
                    var nearGeoms = GetNearGeometries(geom, quadtree, buffer);
                    var objectId  = (ObjectId)geom.UserData;

                    var ids = new List <ObjectId>();
                    foreach (var geometry in nearGeoms)
                    {
                        var nearId = (ObjectId)geometry.UserData;
                        if (nearId != objectId)
                        {
                            ids.Add(nearId);
                        }
                    }

                    dictionary[objectId] = ids;
                }
                tr.Commit();
            }

            return(dictionary);
        }