Author Topic: Copy mtext to new location  (Read 771 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 mtext to new location
« on: March 03, 2013, 03:09:42 PM »
      Reliable way to check every user input, the result should displayed
      in the command line after the command will end 


     C#

Code: [Select]
        [CommandMethod("AMMC", CommandFlags.UsePickSet)]     // copy mtext to new location
        public void testPlaceMtextBetween()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;
            Entity ent;
            bool isok = true;
            Transaction tr = db.TransactionManager.StartTransaction();
           
                BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
                try
                {
            PromptPointOptions ppo = new PromptPointOptions("\nLeft Point: ");
            PromptPointResult ppr = ed.GetPoint(ppo);
            Point3d p1 = ppr.Value;
            if (ppr.Status != PromptStatus.OK)
            {
                isok = false;
                return;
            }
            ppo = new PromptPointOptions("\nRight point: ");
            ppo.UseBasePoint = true;
            ppo.BasePoint = p1;
            PromptPointResult pcr = ed.GetPoint(ppo);
            if (pcr.Status != PromptStatus.OK)
            {
                isok = false;
                return;
            }
            Point3d p2 = pcr.Value;
            if (p1.X == p2.X || p1.Y == p2.Y)
            {
                ed.WriteMessage("\nInvalid coordinate specification");
                isok = false;
                return;
            }
            Point3d mp = new Point3d((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2, (p1.Z + p2.Z) / 2).TransformBy(Matrix3d.Identity);
            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.MessageForRemoval = "\nNot a mtext object, exit.";
            pso.MessageForAdding = "\nPick a single MText: ";
            pso.SingleOnly = true;
            pso.SinglePickInSpace = true;
             pso.PrepareOptionalDetails = true;

            SelectionFilter filter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "mtext") });
            PromptSelectionResult res = ed.GetSelection(pso, filter);
            SelectionSet sset = res.Value;
            if (sset.Count == 0) return;

           
                    SelectedObject sobj = res.Value[0];

                    if (!sobj.ObjectId.IsValid) return;

                    ent = (Entity)tr.GetObject(sobj.ObjectId, OpenMode.ForRead);

                    if (ent is MText)
                    {
                        ent.UpgradeOpen();
                        Plane plan = new Plane(Point3d.Origin, Vector3d.ZAxis);
                        MText mtxt = ent as MText;
                        Point3d ip = mtxt.Location.TransformBy(Matrix3d.Identity);

                        Entity clonen = (Entity)ent.Clone();
                        MText clon = (MText)clonen as MText;
                        if (clon == null) return;
                        if (!clon.IsWriteEnabled) clon.UpgradeOpen();
                        Matrix3d mx = Matrix3d.Displacement(mp.GetVectorTo(ip));
                        clon.TransformBy(mx);
                        clon.Rotation = 0.0;
                        double ang = p1.GetVectorTo(p2).AngleOnPlane(plan);
                        // justify mtext to be more readable
                        if ((ang > Math.PI / 2) && (ang < Math.PI * 1.5))
                            ang = ang + Math.PI;
                        mx = Matrix3d.Rotation(p1.GetVectorTo(p2).AngleOnPlane(plan), Vector3d.ZAxis, mp);
                        clon.TransformBy(mx);
                        clon.Location = mp;
                        clon.Attachment = AttachmentPoint.MiddleCenter;
                        clon.SetAttachmentMovingLocation(clon.Attachment);
                        PromptKeywordOptions pko = new PromptKeywordOptions
                            ("\nSave old text or create new one instead? " + "[Old/New]: ", "Old New");
                        pko.AllowNone = true;
                        // The default depends on our current settings
                        pko.Keywords.Default = "Old";
                        PromptResult pr = ed.GetKeywords(pko);
                        if (pr.Status != PromptStatus.OK) return;
                        if (pr.StringResult == "New")
                        {

                            PromptStringOptions psto =
                                 new PromptStringOptions("\nEnter text (use \\P to jump next line): ");
                            psto.AllowSpaces = true;
                           
                            PromptResult stres = ed.GetString(psto);
                            if (stres.Status != PromptStatus.OK)   return;
                            string cont = stres.StringResult;
                            if (string.IsNullOrEmpty(cont))
                            {
                                isok = false;
                                return;
                            }
                            else
                            clon.Contents = cont;
                        }
                        else
                        clon.Contents = mtxt.Contents;
                        clon.Width = clon.ActualWidth;
                        clon.Height = clon.ActualHeight;
                        btr.UpgradeOpen();
                        btr.AppendEntity(clon);
                        tr.AddNewlyCreatedDBObject(clon, true);

                        tr.Commit();
                        isok = true;
                    }
                }
                catch (System.Exception ex)
                {
                    isok = false;
                    ed.WriteMessage(ex.Message);
                    tr.Abort();
                }
                finally
                {
                    string result = isok == true ? "success" : "fail";
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage
                        ("\n\t---\tCommand is ended up with result of {0}.  \t---\n",result);
                    tr.Dispose();
                }
            }

 VB.NET

 
Code: [Select]
      ' copy mtext to new location
        <CommandMethod("AMMC", CommandFlags.UsePickSet)> _
        Public Sub testPlaceMtextBetween()
            Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
            Dim db As Database = doc.Database
            Dim ed As Editor = doc.Editor
            Dim ent As Entity
            Dim isok As Boolean = True
            Dim tr As Transaction = db.TransactionManager.StartTransaction()

            Dim btr As BlockTableRecord = DirectCast(tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead), BlockTableRecord)
            Try
                Dim ppo As New PromptPointOptions(vbLf & "Left Point: ")
                Dim ppr As PromptPointResult = ed.GetPoint(ppo)
                Dim p1 As Point3d = ppr.Value
                If ppr.Status <> PromptStatus.OK Then
                    isok = False
                    Return
                End If
                ppo = New PromptPointOptions(vbLf & "Right point: ")
                ppo.UseBasePoint = True
                ppo.BasePoint = p1
                Dim pcr As PromptPointResult = ed.GetPoint(ppo)
                If pcr.Status <> PromptStatus.OK Then
                    isok = False
                    Return
                End If
                Dim p2 As Point3d = pcr.Value
                If p1.X = p2.X OrElse p1.Y = p2.Y Then
                    ed.WriteMessage(vbLf & "Invalid coordinate specification")
                    isok = False
                    Return
                End If
                Dim mp As Point3d = New Point3d((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2, (p1.Z + p2.Z) / 2).TransformBy(Matrix3d.Identity)
                Dim pso As New PromptSelectionOptions()
                pso.MessageForRemoval = vbLf & "Not a mtext object, exit."
                pso.MessageForAdding = vbLf & "Pick a single MText: "
                pso.SingleOnly = True
                pso.SinglePickInSpace = True
                pso.PrepareOptionalDetails = True

                Dim filter As New SelectionFilter(New TypedValue() {New TypedValue(0, "mtext")})
                Dim res As PromptSelectionResult = ed.GetSelection(pso, filter)
                Dim sset As SelectionSet = res.Value
                If sset.Count = 0 Then
                    Return
                End If


                Dim sobj As SelectedObject = res.Value(0)

                If Not sobj.ObjectId.IsValid Then
                    Return
                End If

                ent = DirectCast(tr.GetObject(sobj.ObjectId, OpenMode.ForRead), Entity)

                If TypeOf ent Is MText Then
                    ent.UpgradeOpen()
                    Dim plan As New Plane(Point3d.Origin, Vector3d.ZAxis)
                    Dim mtxt As MText = TryCast(ent, MText)
                    Dim ip As Point3d = mtxt.Location.TransformBy(Matrix3d.Identity)

                    Dim clonen As Entity = DirectCast(ent.Clone(), Entity)
                    Dim clon As MText = TryCast(DirectCast(clonen, MText), MText)
                    If clon Is Nothing Then
                        Return
                    End If
                    If Not clon.IsWriteEnabled Then
                        clon.UpgradeOpen()
                    End If
                    Dim mx As Matrix3d = Matrix3d.Displacement(mp.GetVectorTo(ip))
                    clon.TransformBy(mx)
                    clon.Rotation = 0.0
                    Dim ang As Double = p1.GetVectorTo(p2).AngleOnPlane(plan)
                    ' justify mtext to be more readable
                    If (ang > Math.PI / 2) AndAlso (ang < Math.PI * 1.5) Then
                        ang = ang + Math.PI
                    End If
                    mx = Matrix3d.Rotation(p1.GetVectorTo(p2).AngleOnPlane(plan), Vector3d.ZAxis, mp)
                    clon.TransformBy(mx)
                    clon.Location = mp
                    clon.Attachment = AttachmentPoint.MiddleCenter
                    clon.SetAttachmentMovingLocation(clon.Attachment)
                    Dim pko As New PromptKeywordOptions(vbLf & "Save old text or create new one instead? " & "[Old/New]: ", "Old New")
                    pko.AllowNone = True
                    ' The default depends on our current settings
                    pko.Keywords.[Default] = "Old"
                    Dim pr As PromptResult = ed.GetKeywords(pko)
                    If pr.Status <> PromptStatus.OK Then
                        Return
                    End If
                    If pr.StringResult = "New" Then

                        Dim psto As New PromptStringOptions(vbLf & "Enter text (use \P to jump next line): ")
                        psto.AllowSpaces = True

                        Dim stres As PromptResult = ed.GetString(psto)
                        If stres.Status <> PromptStatus.OK Then
                            Return
                        End If
                        Dim cont As String = stres.StringResult
                        If String.IsNullOrEmpty(cont) Then
                            isok = False
                            Return
                        Else
                            clon.Contents = cont
                        End If
                    Else
                        clon.Contents = mtxt.Contents
                    End If
                    clon.Width = clon.ActualWidth
                    clon.Height = clon.ActualHeight
                    btr.UpgradeOpen()
                    btr.AppendEntity(clon)
                    tr.AddNewlyCreatedDBObject(clon, True)

                    tr.Commit()
                    isok = True
                End If
            Catch ex As System.Exception
                isok = False
                ed.WriteMessage(ex.Message)
                tr.Abort()
            Finally
                Dim result As String = If(isok = True, "success", "fail")
                Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(vbLf & vbTab & "---" & vbTab & "Command is ended up with result of {0}.  " & vbTab & "---" & vbLf, result)
                tr.Dispose()
            End Try
        End Sub