EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2052|回复: 24
打印 上一主题 下一主题

[即时预览] 动态创建引线

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 16:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

Creating a multileader in AutoCAD using a jig from .NET
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();
  •           }
  •         }
  •       }
  •     }
  •   }
  • }



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

4

主题

851

帖子

1307

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1307
推荐
发表于 2014-3-14 11:21:22 | 只看该作者
(*^__^*) 嘻嘻……

4

主题

832

帖子

1368

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1368
推荐
发表于 2014-3-14 11:18:24 | 只看该作者
(*^__^*) 嘻嘻……

11

主题

846

帖子

1772

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1772
推荐
发表于 2014-3-10 13:23:30 | 只看该作者
(*^__^*) 嘻嘻……

12

主题

854

帖子

1923

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1923
5F
发表于 2014-2-13 10:00:57 | 只看该作者
感谢楼主分享

16

主题

893

帖子

1485

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1485
6F
发表于 2014-2-18 12:07:59 | 只看该作者
(*^__^*) 嘻嘻……

30

主题

905

帖子

1486

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1486
9F
发表于 2014-3-11 11:16:38 | 只看该作者
谢谢BIM大神…

29

主题

977

帖子

1833

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1833
12F
发表于 2014-3-14 11:32:02 | 只看该作者
路过!!!
不发表意见……

4

主题

852

帖子

1381

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1381
14F
发表于 2014-5-13 10:22:56 | 只看该作者
顶...... 楼下跟上.....
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-27 06:52

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表