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