Author Topic: Copy Text to MultiLeader  (Read 597 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 Text to MultiLeader
« on: July 23, 2012, 08:50:02 AM »
Code: [Select]
      // tested on AutoCAD 2010
      [CommandMethod("TextToLeader", "ttm", CommandFlags.Redraw)]
        public void TextToMleader()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            Database db = doc.Database;
            // save current DIMBLK variable
            string dblk = Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("DIMBLK").ToString();
            try
            {
                PromptEntityOptions peo =
                 new PromptEntityOptions("\nSelect Text / MText: ");
                peo.SetRejectMessage("\nMust be select type of Text or MText.");
                peo.AddAllowedClass(typeof(DBText), false);
                peo.AddAllowedClass(typeof(MText), false);
                PromptEntityResult per = ed.GetEntity(peo);
                if (per.Status != PromptStatus.OK) return;
                ObjectId txtId = per.ObjectId;
                PromptPointOptions opt = new PromptPointOptions("\nSpecify mleader arrowhead location: ");
                PromptPointResult res = ed.GetPoint(opt);

                if (res.Status != PromptStatus.OK) return;

                Point3d pt = res.Value;

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
                    ObjectId blkid = ObjectId.Null;
                    DBObject obj = (DBObject)tr.GetObject(txtId, OpenMode.ForWrite) as DBObject;
                    ed.WriteMessage("\nType\t{0}\n", obj.GetRXClass().DxfName);
                    DBText txtobj = null;
                    MText mtxtobj = null;
                    Point3d tp = new Point3d();
                    if (obj.GetRXClass().DxfName == "TEXT")
                    {
                        txtobj = obj as DBText;
                        if (txtobj == null) return;
                        tp = txtobj.Position;
                    }
                    if (obj.GetRXClass().DxfName == "MTEXT")
                    {
                        mtxtobj = obj as MText;
                        if (mtxtobj == null) return;
                        tp = mtxtobj.Location;
                    }

                    MLeader leader = new MLeader();
                    leader.ContentType = ContentType.MTextContent;
                    MText annomtx = new MText();
                    if (mtxtobj != null)
                    {
                        leader.MText = mtxtobj;
                        leader.TextHeight = mtxtobj.TextHeight;
                    }
                    if (txtobj != null)
                    {
                        annomtx = new MText();
                        annomtx.Location = txtobj.Position;
                        annomtx.Contents = txtobj.TextString;
                        leader.MText = annomtx;
                        leader.TextHeight = txtobj.Height;
                    }

                    // set arrow head block to DOT
                    if (!bt.Has("_DOT"))
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", "_DOT");

                    }
                    leader.ArrowSymbolId = bt["_DOT"];
                    leader.ArrowSize = leader.TextHeight * 0.2;
                    leader.DoglegLength = leader.TextHeight * 0.25;
                    leader.LeaderLineType = LeaderType.StraightLeader;
                    int ld = leader.AddLeader();
                    int ln = leader.AddLeaderLine(ld);
                    leader.AddFirstVertex(ln, pt);
                    leader.AddLastVertex(ln, tp);
                   
                    btr.AppendEntity(leader);
                    tr.AddNewlyCreatedDBObject(leader, true);
                    // erase prototypes
                    if (mtxtobj != null) mtxtobj.Erase();
                    if (txtobj != null) txtobj.Erase();

                    tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nError: {0}\nTrace: {1}", ex.Message, ex.StackTrace);
            }
            finally
            {
                // reset DIMBLK
                if (dblk != "")
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", dblk);
                }
                else
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("DIMBLK", ".");
                }
            }
        }

~'J'~