Author Topic: Copy polyline segment  (Read 960 times)

0 Members and 1 Guest are viewing this topic.

Offline fixo

  • Full Member
  • ***
  • Posts: 135
  • Karma: +4/-0
  • Gender: Male
    • prefered language: C
    • Prog expertise: Good
    • View Profile
Copy polyline segment
« on: July 30, 2012, 07:20:52 PM »
 C#
Code: [Select]
    [CommandMethod("copyseg")]
        public void copySegment()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            PromptEntityOptions peo = new PromptEntityOptions("\nSelect the segment to copy: ");
            peo.SetRejectMessage("\nYou have to select polyline only!");
            peo.AllowNone = false;
            peo.AllowObjectOnLockedLayer = false;
            peo.AddAllowedClass(typeof(Polyline), true);
            PromptEntityResult per = ed.GetEntity(peo);
            if (per.Status == PromptStatus.OK)
            {
 
                ObjectId objId = per.ObjectId;
                try
                {
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        Polyline pline = tr.GetObject(objId, OpenMode.ForRead, false) as Polyline;
                        if (pline != null)
                        {
                            BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId,OpenMode.ForWrite, false) as BlockTableRecord;
                            Point3d pickPt = pline.GetClosestPointTo((Point3d)per.PickedPoint, false);
                            double param = pline.GetParameterAtPoint(pickPt);
                            int index = (int)param;
                          double swid=  pline.GetStartWidthAt(index);
                          double ewid = pline.GetEndWidthAt(index);

                          SegmentType stype=  pline.GetSegmentType(index);
                          if (stype == SegmentType.Line)
                          {
                             LineSegment2d lineseg= pline.GetLineSegment2dAt(index);
                              Polyline spoly = new Polyline();
                              Point2d sp = lineseg.StartPoint;
                              Point2d ep = lineseg.EndPoint;
                              spoly.AddVertexAt(0, sp, 0, swid, ewid);
                              spoly.AddVertexAt(1, ep,0,swid,ewid);
                              spoly.ColorIndex = 1;
                              btr.AppendEntity(spoly);
                              tr.AddNewlyCreatedDBObject(spoly, true);

                          }
                          if (stype == SegmentType.Arc)
                          {
                              CircularArc2d arcseg = pline.GetArcSegment2dAt(index);
                              Polyline spoly = new Polyline();
                              Point2d sp = arcseg.StartPoint;
                              Point2d ep = arcseg.EndPoint;
                              double boo = pline.GetBulgeAt(index);
                              spoly.AddVertexAt(0, sp, boo, swid, ewid);
                              spoly.AddVertexAt(1, ep, boo, swid, ewid);
                              spoly.ColorIndex = 2;
                              btr.AppendEntity(spoly);
                              tr.AddNewlyCreatedDBObject(spoly, true);

                          }
                        }
                        tr.Commit();
                    }
                }
                catch (System.Exception ex)
                {
   
                    ed.WriteMessage("\nError: {0}\nTrace: {1}" , ex.Message , ex.StackTrace);
                }
            }
        }


VB.NET
Code: [Select]
      <CommandMethod("copyseg")> _
        Public Sub copySegment()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim ed As Editor = doc.Editor
            Dim db As Database = doc.Database
            Dim peo As New PromptEntityOptions(vbLf & "Select the segment to copy: ")
            peo.SetRejectMessage(vbLf & "You have to select polyline only!")
            peo.AllowNone = False
            peo.AllowObjectOnLockedLayer = False
            peo.AddAllowedClass(GetType(Polyline), True)
            Dim per As PromptEntityResult = ed.GetEntity(peo)
            If per.Status = PromptStatus.OK Then

                Dim objId As ObjectId = per.ObjectId
                Try
                    Using tr As Transaction = db.TransactionManager.StartTransaction()
                        Dim pline As Polyline = TryCast(tr.GetObject(objId, OpenMode.ForRead, False), Polyline)
                        If pline IsNot Nothing Then
                            Dim btr As BlockTableRecord = TryCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, False), BlockTableRecord)
                            Dim pickPt As Point3d = pline.GetClosestPointTo(per.PickedPoint, False)
                            Dim param As Double = pline.GetParameterAtPoint(pickPt)
                            Dim index As Integer = CInt(Math.Truncate(param))
                            Dim swid As Double = pline.GetStartWidthAt(index)
                            Dim ewid As Double = pline.GetEndWidthAt(index)

                            Dim stype As SegmentType = pline.GetSegmentType(index)
                            If stype = SegmentType.Line Then
                                Dim lineseg As LineSegment2d = pline.GetLineSegment2dAt(index)
                                Dim spoly As New Polyline()
                                Dim sp As Point2d = lineseg.StartPoint
                                Dim ep As Point2d = lineseg.EndPoint
                                spoly.AddVertexAt(0, sp, 0, swid, ewid)
                                spoly.AddVertexAt(1, ep, 0, swid, ewid)
                                spoly.ColorIndex = 1
                                btr.AppendEntity(spoly)
                                tr.AddNewlyCreatedDBObject(spoly, True)
                            End If

                            If stype = SegmentType.Arc Then
                                Dim arcseg As CircularArc2d = pline.GetArcSegment2dAt(index)
                                Dim spoly As New Polyline()
                                Dim sp As Point2d = arcseg.StartPoint
                                Dim ep As Point2d = arcseg.EndPoint
                                Dim boo As Double = pline.GetBulgeAt(index)
                                spoly.AddVertexAt(0, sp, boo, swid, ewid)
                                spoly.AddVertexAt(1, ep, boo, swid, ewid)
                                spoly.ColorIndex = 2
                                btr.AppendEntity(spoly)
                                tr.AddNewlyCreatedDBObject(spoly, True)
                            End If

                        End If
                        tr.Commit()
                    End Using
                Catch ex As System.Exception

                    ed.WriteMessage(vbLf & "Error: {0}" & vbLf & "Trace: {1}", ex.Message, ex.StackTrace)
                End Try
            End If
        End Sub