public static void FindTouchedEdge(ObjectId[] polylineIds) { if (polylineIds.Length != 2) { return; } //var ids = CadUtils.FindAllPolylines(Application.DocumentManager.MdiActiveDocument); var database = Application.DocumentManager.MdiActiveDocument.Database; using (var tr = database.TransactionManager.StartTransaction()) { var reader = new DwgReader(); var entity1 = tr.GetObject(polylineIds[0], OpenMode.ForRead) as Curve; var lineString1 = reader.ReadCurveAsLineString(tr, entity1); lineString1.UserData = polylineIds[0]; var entity2 = tr.GetObject(polylineIds[1], OpenMode.ForRead) as Curve; var lineString2 = reader.ReadCurveAsLineString(tr, entity2); lineString2.UserData = polylineIds[1]; var isTouch = lineString1.Touches(lineString2); System.Diagnostics.Trace.WriteLine(isTouch); IGeometry intersections = lineString1.Intersection(lineString2); //IGeometry intersections = CommonUtils.GetIntersectionPoints(lineString, polygon1); if (intersections.Coordinates.Any()) { foreach (var Coordinate in intersections.Coordinates) { var dbpoint = new DBPoint(new Point3d(Coordinate.X, Coordinate.Y, 0)); CadUtils.DrawPoint(tr, database, dbpoint); } // Draw all var d = new DBPoint(new Point3d(intersections.Coordinates[0].X, intersections.Coordinates[0].Y, 0)); CadUtils.DrawPoint(tr, database, d, 2); var lastIndex = intersections.Coordinates[intersections.Coordinates.Length - 1]; var d1 = new DBPoint(new Point3d(lastIndex.X, lastIndex.Y, 0)); CadUtils.DrawPoint(tr, database, d1, 2); } tr.Commit(); } }
public static bool IsCcw(Curve curve, Transaction tr) { var reader = new DwgReader(); var geomerty = reader.ReadCurveAsLineString(tr, curve); /* * This check catches cases where the ring contains an A-B-A configuration of points. * This can happen if the ring does not contain 3 distinct points * (including the case where the input array has fewer than 4 elements), * or it contains coincident line segments. */ if (geomerty.CoordinateSequence.Count < 3) // To avoid exception from CGAlgorithms.IsCCW routine { return(false); } return(CGAlgorithms.IsCCW(geomerty.CoordinateSequence)); }
public static Dictionary <ObjectId, IList <Point3d> > LineStringSelfIntersectionsOp(IList <ObjectId> objectIds) { var dictionary = new Dictionary <ObjectId, IList <Point3d> >(); var database = objectIds[0].Database; using (var tr = database.TransactionManager.StartTransaction()) { var reader = new DwgReader(); foreach (ObjectId objectId in objectIds) { if (!objectId.IsValid) { continue; } var curve = tr.GetObject(objectId, OpenMode.ForRead) as Curve; var geom = reader.ReadCurveAsLineString(tr, curve) as LineString; var intersectGeom = LineStringSelfIntersectionsOp(geom); var points = new List <Point3d>(); foreach (var coordinate in intersectGeom.Coordinates) { // 如果是NaN直接设定为0 if (double.IsNaN(coordinate.Z)) { coordinate.Z = 0; } points.Add(new Point3d(coordinate.X, coordinate.Y, coordinate.Z)); } dictionary.Add(objectId, points); } tr.Commit(); } return(dictionary); }
public static void FindDanglingLine(Database database) { var polylineIds = CadUtils.FindAllPolylines(Application.DocumentManager.MdiActiveDocument); using (var tr = database.TransactionManager.StartTransaction()) { var pmFixed3 = new PrecisionModel(3); // 读入多边形数据 var lineStringList = new List <IGeometry>(); foreach (ObjectId polylineId in polylineIds) { var curve = tr.GetObject(polylineId, OpenMode.ForRead) as Curve; var reader = new DwgReader(); IGeometry lineString; try { lineString = reader.ReadCurveAsPolygon(tr, curve) as Polygon; } catch (Exception) { lineString = reader.ReadCurveAsLineString(tr, curve) as LineString; } if (lineString != null && lineString.IsEmpty == false) { lineString = SimpleGeometryPrecisionReducer.Reduce(lineString, pmFixed3); lineStringList.Add(lineString); } } // 开始做Union var nodedLineString = UnaryUnionOp.Union(lineStringList); var polygonizer = new Polygonizer(); polygonizer.Add(nodedLineString); var polys = polygonizer.GetPolygons(); var dangles = polygonizer.GetDangles(); var cuts = polygonizer.GetCutEdges(); var writer = new DwgWriter(); var modelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(database); var blockTableRecord = (BlockTableRecord)tr.GetObject(modelSpaceId, OpenMode.ForWrite, false); // 悬挂线 foreach (ILineString lineString in dangles) { //if (lineString != null) //{ // var polyline = writer.WritePolyline(lineString); // polyline.ColorIndex = 3; // //polyline.Layer = ""; // // 输出到CAD // blockTableRecord.AppendEntity(polyline); // tr.AddNewlyCreatedDBObject(polyline, true); //} } tr.Commit(); } }