Creating a multileader in AutoCAD using a jig from .NET

转载 2007年10月15日 13:58:00


I'm now back from a fantastic break in Italy and am trying hard to catch back up. Next week I'm off again to San Diego (work, this time), which may cause further interruptions in blog postings.

This question came through from Genésio from Brazil:

I wish jig a leader with an bubble in the and of the leader, at the same time. Can you help me. Perhaps post the solution in your blog (through the interface).

It took me a while - frustratingly long, in fact, and probably this is not exactly what Genésio is after - but here's what I managed to come up with. The "bubble" is framed MText, but it should be modifiable to use a classic bubble block, instead. I drew heavily on this previous post for the jig code.

The positioning of the text took some work, but I'm reasonably happy with the results. If anyone has tweaks to suggest, please post a comment.

Here's the C# code:

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.Geometry;


namespace DimensionLibrary

{

  public class DimensionCmds

  {

    class MLeaderJig : EntityJig

    {

      Point3dCollection m_pts;

      Point3d m_tempPoint;

      string m_contents;

      int m_leaderIndex;

      int m_leaderLineIndex;


      public MLeaderJig(string contents)

        : base(new MLeader())

      {

        // Store the string passed in


        m_contents = contents;


        // Create a point collection to store our vertices


        m_pts = new Point3dCollection();


        // Create mleader and set defaults


        MLeader ml = Entity as MLeader;

        ml.SetDatabaseDefaults();


        // Set up the MText contents


        ml.ContentType = ContentType.MTextContent;

        MText mt = new MText();

        mt.SetDatabaseDefaults();

        mt.Contents = m_contents;

        ml.MText = mt;

        ml.TextAlignmentType =

          TextAlignmentType.LeftAlignment;

        ml.TextAttachmentType =

          TextAttachmentType.AttachmentMiddle;


        // Set the frame and landing properties


        ml.EnableDogleg = true;

        ml.EnableFrameText = true;

        ml.EnableLanding = true;


        // Reduce the standard landing gap


        ml.LandingGap = 0.05;


        // Add a leader, but not a leader line (for now)


        m_leaderIndex = ml.AddLeader();

        m_leaderLineIndex = -1;

      }


      protected override SamplerStatus Sampler(

        JigPrompts prompts

      )

      {

        JigPromptPointOptions opts =

          new JigPromptPointOptions();


        // Not all options accept null response

        opts.UserInputControls =

          (UserInputControls.Accept3dCoordinates |

          UserInputControls.NoNegativeResponseAccepted

          );


        // Get the first point

        if (m_pts.Count == 0)

        {

          opts.UserInputControls |=

            UserInputControls.NullResponseAccepted;

          opts.Message =

            "/nStart point of multileader: ";

          opts.UseBasePoint = false;

        }

        // And the second

        else if (m_pts.Count == 1)

        {

          opts.BasePoint = m_pts[m_pts.Count - 1];

          opts.UseBasePoint = true;

          opts.Message =

            "/nSpecify multileader vertex: ";

        }

        // And subsequent points

        else if (m_pts.Count > 1)

        {

          opts.UserInputControls |=

            UserInputControls.NullResponseAccepted;

          opts.BasePoint = m_pts[m_pts.Count - 1];

          opts.UseBasePoint = true;

          opts.SetMessageAndKeywords(

            "/nSpecify multileader vertex or [End]: ",

            "End"

          );

        }

        else // Should never happen

          return SamplerStatus.Cancel;


        PromptPointResult res =

          prompts.AcquirePoint(opts);


        if (res.Status == PromptStatus.Keyword)

        {

          if (res.StringResult == "End")

          {

            return SamplerStatus.Cancel;

          }

        }


        if (m_tempPoint == res.Value)

        {

          return SamplerStatus.NoChange;

        }

        else if (res.Status == PromptStatus.OK)

        {

          m_tempPoint = res.Value;

          return SamplerStatus.OK;

        }

        return SamplerStatus.Cancel;

      }


      protected override bool Update()

      {

        try

        {

          if (m_pts.Count > 0)

          {

            // Set the last vertex to the new value


            MLeader ml = Entity as MLeader;

            ml.SetLastVertex(

              m_leaderLineIndex,

              m_tempPoint

            );


            // Adjust the text location


            Vector3d dogvec =

              ml.GetDogleg(m_leaderIndex);

            double doglen =

              ml.DoglegLength;

            double landgap =

              ml.LandingGap;

            ml.TextLocation =

              m_tempPoint +

              ((doglen + landgap) * dogvec);

          }

        }

        catch (System.Exception ex)

        {

          Document doc =

            Application.DocumentManager.MdiActiveDocument;

          doc.Editor.WriteMessage(

            "/nException: " + ex.Message

          );

          return false;

        }

        return true;

      }


      public void AddVertex()

      {

        MLeader ml = Entity as MLeader;


        // For the first point...


        if (m_pts.Count == 0)

        {

          // Add a leader line


          m_leaderLineIndex =

            ml.AddLeaderLine(m_leaderIndex);


          // And a start vertex


          ml.AddFirstVertex(

            m_leaderLineIndex,

            m_tempPoint

          );


          // Add a second vertex that will be set

          // within the jig


          ml.AddLastVertex(

            m_leaderLineIndex,

            new Point3d(0, 0, 0)

          );

        }

        else

        {

          // For subsequent points,

          // just add a vertex


          ml.AddLastVertex(

            m_leaderLineIndex,

            m_tempPoint

          );

        }


        // Reset the attachment point, otherwise

        // it seems to get forgotten


        ml.TextAttachmentType =

          TextAttachmentType.AttachmentMiddle;


        // Add the latest point to our history


        m_pts.Add(m_tempPoint);

      }


      public void RemoveLastVertex()

      {

        // We don't need to actually remove

        // the vertex, just reset it


        MLeader ml = Entity as MLeader;

        if (m_pts.Count >= 1)

        {

          Vector3d dogvec =

            ml.GetDogleg(m_leaderIndex);

          double doglen =

            ml.DoglegLength;

          double landgap =

            ml.LandingGap;

          ml.TextLocation =

            m_pts[m_pts.Count - 1] +

            ((doglen + landgap) * dogvec);

        }

      }


      public Entity GetEntity()

      {

        return Entity;

      }

    }


    [CommandMethod("MYML")]

    public void MyMLeaderJig()

    {

      Document doc =

        Application.DocumentManager.MdiActiveDocument;

      Editor ed = doc.Editor;

      Database db = doc.Database;


      // Get the text outside of the jig


      PromptStringOptions pso =

        new PromptStringOptions(

          "/nEnter text: "

        );

      pso.AllowSpaces = true;

      PromptResult pr =

        ed.GetString(pso);

      if (pr.Status == PromptStatus.OK)

      {

        // Create MleaderJig


        MLeaderJig jig =

          new MLeaderJig(pr.StringResult);


        // Loop to set vertices


        bool bSuccess = true, bComplete = false;

        while (bSuccess && !bComplete)

        {

          PromptResult dragres = ed.Drag(jig);

          bSuccess =

            (dragres.Status == PromptStatus.OK);

          if (bSuccess)

            jig.AddVertex();

          bComplete =

            (dragres.Status == PromptStatus.None);

          if (bComplete)

            jig.RemoveLastVertex();

        }


        if (bComplete)

        {

          // Append entity


          Transaction tr =

            db.TransactionManager.StartTransaction();

          using (tr)

          {

            BlockTable bt =

              (BlockTable)tr.GetObject(

                db.BlockTableId,

                OpenMode.ForRead,

                false

              );

            BlockTableRecord btr =

              (BlockTableRecord)tr.GetObject(

                bt[BlockTableRecord.ModelSpace],

                OpenMode.ForWrite,

                false

              );

            btr.AppendEntity(jig.GetEntity());

            tr.AddNewlyCreatedDBObject(

              jig.GetEntity(),

              true

            );

            tr.Commit();

          }

        }

      }

    }

  }

}

Here's what you get when you run the MYML command:

Jigged_mleader

 

两种方法在.Net中调用AutoCAD中的命令

两种方法在.Net中调用AutoCAD中的命令 1.using wrapper RunCommand: using System; using System.Linq....
  • jingxuan84
  • jingxuan84
  • 2014年07月14日 17:26
  • 2752

转自AutoCAD .NET 开发人员手册——Dimension各参数含义

Each dimension has the capability of overriding the settings assigned to it by a dimension style. Th...
  • u011511587
  • u011511587
  • 2013年12月08日 00:15
  • 1473

AutoCAD for .Net 开发环境配置

AutoCAD for . Net
  • sx341125
  • sx341125
  • 2015年11月13日 17:22
  • 3229

AutoCAD .Net 使用扩展字典存储自定义数据

每个 AutoCAD 数据库元素对象(DBObject)都可以使用扩展字典来存储自定义数据。 通常这一机制用来为图元对象(比如:线、圆等)存储非图形数据。 以下示例代码实现: AddXRecor...
  • wangyao1052
  • wangyao1052
  • 2017年12月13日 21:37
  • 112

AutoCAD二次开发——AutoCAD.NET API开发环境搭建

通过这篇文章,终于实现了第一个基于C#和autocad2010开发第一个小程序 AutoCAD二次开发——AutoCAD.NET API开发环境搭建 AutoCAD二次开发工具:1986年Auto...
  • hailiannanhai
  • hailiannanhai
  • 2016年08月18日 16:43
  • 4335

.NET AutoCAD二次开发之路(一、基础篇)

学习AutoCAD二次开发已经有一段时间了,磕磕碰碰,十分的艰辛枯燥。但回想一下还是会有些小激动,嘿嘿!最近这段时间一直都有这么个想法,就是将我学习CAD二次开发的过程用文字的方式记录下来,形成系列,...
  • zefllj
  • zefllj
  • 2016年01月01日 22:53
  • 3223

AutoCAD二次开发之.net API学习笔记

1、用户交互
  • liupeng_qwert
  • liupeng_qwert
  • 2015年05月07日 10:07
  • 428

AutoCAD界面移植到VB.net应用程序窗体中

最近因为需要将AutoCAD界面移植到VB.net应用程序窗体中,琢磨、搜索了很久,终于搞清楚,贴出来。。。 1.首先涉及两个按钮,第一个是启动CAD进程,第二个是打开图形界面 2.第一个按...
  • HeWaiZhiXing
  • HeWaiZhiXing
  • 2015年12月15日 10:46
  • 1172

auto CAD 二次开发 c#.net 之JIG画多段线(polyline)

在CAD 命令中画多段线的命令为:pline。下面将介绍一种JIG画多段线的方法。 首先,来介绍一下JIG这个东西。 EntityJig(实体动态预览),按照指定步骤模仿特定类型的单个实体对象。首...
  • luckysiesteven
  • luckysiesteven
  • 2013年09月22日 13:14
  • 4962

spring接入swagger后单元测试报错

spring接入swagger后单元测试报错
  • zheng0518
  • zheng0518
  • 2016年08月15日 19:12
  • 11292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Creating a multileader in AutoCAD using a jig from .NET
举报原因:
原因补充:

(最多只允许输入30个字)