示例#1
0
        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();
            }
        }
示例#2
0
        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);
        }
示例#4
0
        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();
            }
        }