Dim and add multileader inside polyline

Dim and add multileader inside polyline

quangpt.tric
Advocate Advocate
322 Views
0 Replies
Message 1 of 1

Dim and add multileader inside polyline

quangpt.tric
Advocate
Advocate

Hi every body,

I have a polyline, I want to automatic dimension if linesegment <18m and then add multileader to this linesegment as the picture below.

I can make dimension, but I dont know how to add multileader inside polyline. So, can any body help me to solve it?

b668af72ed13184d4102.jpg

My code is:

public static void GetLineSegment(Polyline pline)
        {
            acad.Document doc = acad.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            using (Transaction _tr = db.TransactionManager.StartTransaction())
            {
                pline.ClosedPline();
                if (pline.Closed == true)
                {
                    var nbSegments = pline.NumberOfVertices;
                    for (int i = 1; i < nbSegments - 2; i++)
                    {
                        if (pline.GetSegmentType(i) == SegmentType.Line)
                        {
                            var line = pline.GetLineSegmentAt(i);
                            if (line.Length < 18)
                            {
                                var line1 = pline.GetLineSegmentAt(i - 1);
                                var line2 = pline.GetLineSegmentAt(i + 1);

                                Polyline pl1 = new Polyline();
                                pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
                                pl1.AddVertexAt(0, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);

                                Polyline pl2 = new Polyline();
                                pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
                                pl2.AddVertexAt(0, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
                                Point3dCollection point3DCollection = new Point3dCollection();
                                pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
                                foreach (Point3d pt in point3DCollection)
                                {
                                    var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
                                    var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
                                    var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                                    var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
                                    dal1.TransformBy(ed.CurrentUserCoordinateSystem);
                                    cSpace.AppendEntity(dal1);
                                    _tr.AddNewlyCreatedDBObject(dal1, true);
                                    var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
                                    dal2.TransformBy(ed.CurrentUserCoordinateSystem);

                                   
                                    cSpace.AppendEntity(dal2);
                                    _tr.AddNewlyCreatedDBObject(dal2, true);
                                }
                            }
                        }
                    }
                    if (pline.GetSegmentType(nbSegments - 1) == SegmentType.Line)
                    {
                        var lines = pline.GetLineSegmentAt(nbSegments - 1);
                        if (lines.Length < 18)
                        {
                            var line1 = pline.GetLineSegmentAt(nbSegments - 2);
                            var line2 = pline.GetLineSegmentAt(0);

                            Polyline pl1 = new Polyline();
                            pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
                            pl1.AddVertexAt(0, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);

                            Polyline pl2 = new Polyline();
                            pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
                            pl2.AddVertexAt(0, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
                            Point3dCollection point3DCollection = new Point3dCollection();
                            pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
                            foreach (Point3d pt in point3DCollection)
                            {
                                var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
                                var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
                                var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                                var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
                                dal1.TransformBy(ed.CurrentUserCoordinateSystem);
                                cSpace.AppendEntity(dal1);
                                _tr.AddNewlyCreatedDBObject(dal1, true);
                                var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
                                dal2.TransformBy(ed.CurrentUserCoordinateSystem);
                                cSpace.AppendEntity(dal2);
                                _tr.AddNewlyCreatedDBObject(dal2, true);
                            }
                        }
                    }
                }
                if (pline.Closed == false)
                {
                    var nbSegments = pline.NumberOfVertices-1;
                    for (int i = 1; i < nbSegments - 2; i++)
                    {
                        if (pline.GetSegmentType(i) == SegmentType.Line)
                        {
                            var line = pline.GetLineSegmentAt(i);
                            Polyline plcanh = new Polyline();
                            plcanh.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
                            plcanh.AddVertexAt(0, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
                            if (line.Length < 18)
                            {
                                var line1 = pline.GetLineSegmentAt(i - 1);
                                var line2 = pline.GetLineSegmentAt(i + 1);

                                Polyline pl1 = new Polyline();
                                pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
                                pl1.AddVertexAt(1, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);

                                Polyline pl2 = new Polyline();
                                pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
                                pl2.AddVertexAt(1, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
                                Point3dCollection point3DCollection = new Point3dCollection();
                                pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
                                foreach (Point3d pt in point3DCollection)
                                {
                                    var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
                                    var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
                                    var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                                    var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
                                    dal1.TransformBy(ed.CurrentUserCoordinateSystem);
                                    cSpace.AppendEntity(dal1);
                                    _tr.AddNewlyCreatedDBObject(dal1, true);
                                    var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
                                    dal2.TransformBy(ed.CurrentUserCoordinateSystem);
                                    cSpace.AppendEntity(dal2);
                                    _tr.AddNewlyCreatedDBObject(dal2, true);
                                    var kc1 = pt.DistanceTo(pt1);
                                    var kc2 = pt.DistanceTo(pt2);
                                    pline.VeLeader(line.StartPoint.Convert2d(new Plane()),line.EndPoint.Convert2d(new Plane()),line.Length,kc1,kc2);
                                }
                            }
                        }
                    }
                    if (pline.GetSegmentType(nbSegments - 2) == SegmentType.Line)
                    {
                        var lines = pline.GetLineSegmentAt(nbSegments - 2);
                        if (lines.Length < 18)
                        {
                            var line1 = pline.GetLineSegmentAt(nbSegments - 3);
                            var line2 = pline.GetLineSegmentAt(nbSegments-1);

                            Polyline pl1 = new Polyline();
                            pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
                            pl1.AddVertexAt(1, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);

                            Polyline pl2 = new Polyline();
                            pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
                            pl2.AddVertexAt(1, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
                            Point3dCollection point3DCollection = new Point3dCollection();
                            pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
                            foreach (Point3d pt in point3DCollection)
                            {
                                var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
                                var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
                                var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
                                var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
                                dal1.TransformBy(ed.CurrentUserCoordinateSystem);
                                cSpace.AppendEntity(dal1);
                                _tr.AddNewlyCreatedDBObject(dal1, true);
                                var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
                                dal2.TransformBy(ed.CurrentUserCoordinateSystem);
                                cSpace.AppendEntity(dal2);
                                _tr.AddNewlyCreatedDBObject(dal2, true);

                                var kc1 = pt.DistanceTo(pt1);
                                var kc2 = pt.DistanceTo(pt2);
                                pline.VeLeader(lines.StartPoint.Convert2d(new Plane()), lines.EndPoint.Convert2d(new Plane()), lines.Length, kc1, kc2);
                            }
                        }
                    }
                }
                _tr.Commit();
            }    
        }


        public static Point2d NearPoint(this Point2d p1, Point2d p2, Point2d p3)
        {
            return p1.GetDistanceTo(p2) < p1.GetDistanceTo(p3) ? p2 : p3;
        }
        public static Point3d NearPoint(this Point3d p1, Point3d p2, Point3d p3)
        {
            return p1.DistanceTo(p2) < p1.DistanceTo(p3) ? p2 : p3;
        }
        [CommandMethod("DimVat")]
        public static void DimVat()
        {
            acad.Document doc = acad.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            TypedValue[] _tv = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };
            SelectionFilter _ts = new SelectionFilter(_tv);

            PromptSelectionOptions _op = new PromptSelectionOptions();
            _op.MessageForAdding = "Chọn các Polyline";
            PromptSelectionResult _ops = ed.GetSelection(_op, _ts);

            if (_ops.Status != PromptStatus.OK)
                return;
            using (Transaction _tr = db.TransactionManager.StartTransaction())
            {
                foreach (ObjectId objectId in _ops.Value.GetObjectIds())
                {
                    Polyline pline = _tr.GetObject(objectId, OpenMode.ForWrite) as Polyline;
                    GetLineSegment(pline);
                }
                //pline.Closed = false;
                _tr.Commit();
            }
        }


        public static Point2d Polarpoint(this Point2d p1, double ang, double dist)
        {
            return new Point2d(p1.X + dist * Math.Cos(ang), p1.Y + dist * Math.Sin(ang));
        }
        public static Point3d ToPoint3d(this Point2d p1)
        {
            return new Point3d(p1.X, p1.Y, 0);
        }

        public static Point2d ToPoint2d(this Point3d p1)
        {
            return new Point2d(p1.X, p1.Y);
        }
public static void ClosedPline(this Polyline pline)
        {
            var sp = pline.StartPoint;
            var ep = pline.EndPoint;
            if (pline.Closed == false)
            {
                if (sp == ep)
                {
                    pline.RemoveVertexAt(pline.NumberOfVertices);
                    pline.Closed = true;
                }
            }
        }
0 Likes
323 Views
0 Replies
Replies (0)