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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 765|回复: 9
打印 上一主题 下一主题

[用户交互] 关键字设置

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12406

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 16:36:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
This post extends the polyline-creation jig shown in the previous entry to support the use of keywords both for arc segments and for undo.
A few notes:
I removed the use of a separate vertex list, as it proved to be less necessary than needed
This implementation supports Undo, and the toggling between Line segment and Arc segment entry
Arc segments have a fixed bulge of 1.0, which is actually quite useful if drawing a cloud, but not really useful for much else. Generally the bulge should be adjusted according to the position of the cursor relative to the previous point, which may be something I attempt in a future post
I've also streamlined some of the other parts of code (such as using the basepoint in the jig - which we don't actually need, as we allow the polyline to draw itself)
The code has become quite a bit more complex, and could probably do with some additional performance tuning, but it should allow you to get the idea of what can be done (and one way of approaching it). I should also say that - and this holds true for any of the code samples posted in this blog - it should be thoroughly tested before being integrated into your own application. Hopefully that goes without saying...
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 MyPlineApp
  • {
  •   public class MyPlineCmds
  •   {
  •     class PlineJig : EntityJig
  •     {
  •       // Use a separate variable for the most recent point...
  •       // Again, not strictly necessary, but easier to reference
  •       Point3d m_tempPoint;
  •       Plane m_plane;
  •       bool m_isArcSeg = false;
  •       bool m_isUndoing = false;
  •       // At this stage, weour arc segments will
  •       // have a fixed bulge of 1.0...
  •       // Later we may update the routine to determine
  •       // the bulge based on the relative location
  •       // of the cursor
  •       const double kBulge = 1.0;
  •       public PlineJig(Matrix3d ucs)
  •         : base(new Polyline())
  •       {
  •         // Create a temporary plane, to help with calcs
  •         Point3d origin = new Point3d(0, 0, 0);
  •         Vector3d normal = new Vector3d(0, 0, 1);
  •         normal = normal.TransformBy(ucs);
  •         m_plane = new Plane(origin, normal);
  •         // Create polyline, set defaults, add dummy vertex
  •         Polyline pline = Entity as Polyline;
  •         pline.SetDatabaseDefaults();
  •         pline.Normal = normal;
  •         AddDummyVertex();
  •       }
  •       protected override SamplerStatus Sampler(JigPrompts prompts)
  •       {
  •         JigPromptPointOptions jigOpts =
  •           new JigPromptPointOptions();
  •         jigOpts.UserInputControls =
  •           (UserInputControls.Accept3dCoordinates |
  •           UserInputControls.NullResponseAccepted |
  •           UserInputControls.NoNegativeResponseAccepted
  •           );
  •         m_isUndoing = false;
  •         Polyline pline = Entity as Polyline;
  •         if (pline.NumberOfVertices == 1)
  •         {
  •           // For the first vertex, just ask for the point
  •           jigOpts.Message =
  •             "\nStart point of polyline: ";
  •         }
  •         else if (pline.NumberOfVertices > 1)
  •         {
  •           // For subsequent vertices, use a base point
  •           if (m_isArcSeg)
  •           {
  •             jigOpts.SetMessageAndKeywords(
  •               "\nSpecify endpoint of arc or [Line/Undo]: ",
  •               "Line Undo"
  •             );
  •           }
  •           else
  •           {
  •             jigOpts.SetMessageAndKeywords(              "\nSpecify next point or [Arc/Undo]: ",              "Arc Undo"            );          }
  •         }
  •         else // should never happen
  •           return SamplerStatus.Cancel;
  •         // Get the point itself
  •         PromptPointResult res =
  •           prompts.AcquirePoint(jigOpts);
  •         if (res.Status == PromptStatus.Keyword)
  •         {
  •           if (res.StringResult == "Arc")
  •           {
  •             m_isArcSeg = true;
  •           }
  •           else if (res.StringResult == "Line")
  •           {
  •             m_isArcSeg = false;
  •           }
  •           else if (res.StringResult == "Undo")
  •           {
  •             m_isUndoing = true;
  •           }
  •           return SamplerStatus.OK;
  •         }
  •         else if (res.Status == PromptStatus.OK)
  •         {
  •           // Check if it has changed or not
  •           // (reduces flicker)
  •           if (m_tempPoint == res.Value)
  •           {
  •             return SamplerStatus.NoChange;
  •           }
  •           else
  •           {
  •             m_tempPoint = res.Value;
  •             return SamplerStatus.OK;
  •           }
  •         }
  •         return SamplerStatus.Cancel;
  •       }
  •       protected override bool Update()
  •       {
  •         // Update the dummy vertex to be our
  •         // 3D point projected onto our plane
  •         Polyline pline = Entity as Polyline;
  •         pline.SetPointAt(
  •           pline.NumberOfVertices - 1,
  •           m_tempPoint.Convert2d(m_plane)
  •         );
  •         // If it's supposed to be an arc segment,
  •         // set the bulge appropriately
  •         if (m_isArcSeg)
  •         {
  •           pline.SetBulgeAt(
  •             pline.NumberOfVertices-1,
  •             kBulge
  •           );
  •         }
  •         // Otherwise, it's a line, so set the bulge
  •         // to zero
  •         else
  •         {
  •           pline.SetBulgeAt(
  •             pline.NumberOfVertices-1,
  •             0
  •           );
  •         }
  •         return true;
  •       }
  •       public Entity GetEntity()
  •       {
  •         return Entity;
  •       }
  •       public bool IsArcSegment()
  •       {
  •         return m_isArcSeg;
  •       }
  •       public bool IsUndoing()
  •       {
  •         return m_isUndoing;
  •       }
  •       public void AddDummyVertex()
  •       {
  •         // Create a new dummy vertex...
  •         // can have any initial value
  •         Polyline pline = Entity as Polyline;
  •         pline.AddVertexAt(
  •           pline.NumberOfVertices,
  •           new Point2d(0,0),
  •           0,0,0
  •         );
  •       }
  •       public void RemoveDummyVertex()
  •       {
  •         Polyline pline = Entity as Polyline;
  •         // Let's first remove our dummy vertex
  •         if (pline.NumberOfVertices > 0)
  •         {
  •           pline.RemoveVertexAt(pline.NumberOfVertices - 1);
  •         }
  •         // And then check the type of the last segment
  •         if (pline.NumberOfVertices >= 2)
  •         {
  •           double blg =
  •             pline.GetBulgeAt(pline.NumberOfVertices - 2);
  •           m_isArcSeg = (blg != 0);
  •         }
  •       }
  •       public void AdjustSegmentType(bool isArc)
  •       {
  •         // Change the bulge of the previous segment,
  •         // if necessary
  •         double bulge = 0.0;
  •         if (isArc)
  •           bulge = kBulge;
  •         Polyline pline = Entity as Polyline;
  •         if (pline.NumberOfVertices >= 2)
  •           pline.SetBulgeAt(pline.NumberOfVertices - 2, bulge);
  •       }
  •     }
  •     [CommandMethod("MYPOLY")]
  •     public void MyPolyJig()
  •     {
  •       Document doc =
  •         Application.DocumentManager.MdiActiveDocument;
  •       Editor ed = doc.Editor;
  •       // Get the current UCS, to pass to the Jig
  •       Matrix3d ucs =
  •         ed.CurrentUserCoordinateSystem;
  •       // Create our Jig object
  •       PlineJig jig = new PlineJig(ucs);
  •       // Loop to set the vertices directly on the polyline
  •       bool bPoint = false;
  •       bool bKeyword = false;
  •       bool bComplete = false;
  •       do
  •       {
  •         PromptResult res = ed.Drag(jig);
  •         bPoint =
  •           (res.Status == PromptStatus.OK);
  •         // A new point was added
  •         if (bPoint)
  •           jig.AddDummyVertex();
  •         bKeyword =
  •           (res.Status == PromptStatus.Keyword);
  •         if (bKeyword)
  •         {
  •           if (jig.IsUndoing())
  •           {
  •             jig.RemoveDummyVertex();
  •           }
  •           else
  •           {
  •             jig.AdjustSegmentType(jig.IsArcSegment());
  •           }
  •         }
  •         // Null input terminates the command
  •         bComplete =
  •           (res.Status == PromptStatus.None);
  •         if (bComplete)
  •           // Let's clean-up the polyline before adding it
  •           jig.RemoveDummyVertex();
  •       } while ((bPoint || bKeyword) && !bComplete);
  •       // If the jig completed successfully,
  •       // add the polyline
  •       if (bComplete)
  •       {
  •         Polyline pline = jig.GetEntity() as Polyline;
  •         if (pline.NumberOfVertices > 1)
  •         {
  •           // Append entity
  •           Database db = doc.Database;
  •           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(pline);
  •             tr.AddNewlyCreatedDBObject(pline, true);
  •             tr.Commit();
  •           }
  •         }
  •       }
  •     }
  •   }
  • }



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

12

主题

876

帖子

1510

积分

BIM经理

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

积分
1510
3F
发表于 2014-3-11 11:06:12 | 只看该作者
谢谢BIM大神…

15

主题

899

帖子

1462

积分

BIM经理

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

积分
1462
7F
发表于 2014-3-14 11:23:46 | 只看该作者
(*^__^*) 嘻嘻……
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 12:36

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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