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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 784|回复: 0
打印 上一主题 下一主题

[即时预览] 使用向导创建圆JIG

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12404

社区QQ达人

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

AutoCAD .NET Addin Wizard (AcadNetAddinWizard) is far more than just some templates scattered around. It is a real-wizard-sense wizard, i.e. multi paged, configurable, flexible and intelligent. It also includes various project item wizards, coders, and widgets for AutoCAD .NET programming.
In this article, let us see how the Entity Jigger wizard of AutoCAD .NET Addin Wizard (AcadNetAddinWizard) can create a circle jigger automatically in no time for us.
The Entity Jigger wizard can be found from the Add New Item UI of both Visual C# and VB.NET of Visual Studio both full-fledged and Express in version both 2008 and 2010. Let’s take the C# of Visual Studio 2010 for an example. The AutoCAD Addin category will appear under the Visual C# Items node of the Installed Templates and its various item wizards including the Entity Jigger wizard appear in turn in the middle pane:

Here are wizard pages and some sample fill-outs of the Entity Jigger wizard:







  1. The auto-generated circle jig class and test command may look like the following:
  2. #region Namespaces
  3. using System;
  4. using System.Text;
  5. using System.Linq;
  6. using System.Xml;
  7. using System.Reflection;
  8. using System.ComponentModel;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. using System.Windows;
  12. using System.Windows.Media.Imaging;
  13. using System.Windows.Forms;
  14. using System.Drawing;
  15. using System.IO;
  16. using Autodesk.AutoCAD.ApplicationServices;
  17. using Autodesk.AutoCAD.DatabaseServices;
  18. using Autodesk.AutoCAD.Runtime;
  19. using Autodesk.AutoCAD.EditorInput;
  20. using Autodesk.AutoCAD.Geometry;
  21. using Autodesk.AutoCAD.Windows;
  22. using MgdAcApplication = Autodesk.AutoCAD.ApplicationServices.Application;
  23. using MgdAcDocument = Autodesk.AutoCAD.ApplicationServices.Document;
  24. using AcWindowsNS = Autodesk.AutoCAD.Windows;
  25. #endregion
  26. namespace Acad2012NetDemoAddinCS
  27. {
  28.     public class EntityJigger1 : EntityJig
  29.     {
  30.         #region Fields
  31.         public int mCurJigFactorIndex = 1;  // Jig Factor Index
  32.         public Autodesk.AutoCAD.Geometry.Point3d mCenter; // Jig Factor #1
  33.         public double mRadius; // Jig Factor #2

  34.         #endregion
  35.         #region Constructors
  36.         public EntityJigger1(Circle ent)
  37.             : base(ent)
  38.         {
  39.             // Initialize and transform the Entity.
  40.             Entity.SetDatabaseDefaults();
  41.             Entity.TransformBy(UCS);
  42.             Entity.Radius = 1e-10;  //Here is the code manually added to get rid of the degeration error.
  43.         }
  44.         #endregion
  45.         #region Properties
  46.         private Editor Editor
  47.         {
  48.             get
  49.             {
  50.                 return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
  51.             }
  52.         }
  53.         private Matrix3d UCS
  54.         {
  55.             get
  56.             {
  57.                 return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  58.             }
  59.         }
  60.         #endregion
  61.         #region Overrides
  62.         public new Circle Entity  // Overload the Entity property for convenience.
  63.         {
  64.             get
  65.             {
  66.                 return base.Entity as Circle;
  67.             }
  68.         }
  69.         protected override bool Update()
  70.         {
  71.             switch (mCurJigFactorIndex)
  72.             {
  73.                 case 1:
  74.                     Entity.Center = mCenter;
  75.                     //Entity.Center.TransformBy(UCS); //Turn it on for UCS transformation or tweak it if not compile.
  76.                     break;
  77.                 case 2:
  78.                     Entity.Radius = mRadius;
  79.                     //Entity.Radius.TransformBy(UCS); //Turn it on for UCS transformation or tweak it if not compile.
  80.                     break;
  81.                 default:
  82.                     return false;
  83.             }
  84.             return true;
  85.         }
  86.         protected override SamplerStatus Sampler(JigPrompts prompts)
  87.         {
  88.             switch (mCurJigFactorIndex)
  89.             {
  90.                 case 1:
  91.                     JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nCircle center:");
  92.                     // Set properties such as UseBasePoint and BasePoint of the prompt options object if necessary here.
  93.                     prOptions1.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.GovernedByUCSDetect | UserInputControls.UseBasePointElevation;
  94.                     PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
  95.                     if (prResult1.Status == PromptStatus.Cancel && prResult1.Status == PromptStatus.Error)
  96.                         return SamplerStatus.Cancel;
  97.                     if (prResult1.Value.Equals(mCenter))  //Use better comparison method if necessary.
  98.                     {
  99.                         return SamplerStatus.NoChange;
  100.                     }
  101.                     else
  102.                     {
  103.                         mCenter = prResult1.Value;
  104.                         return SamplerStatus.OK;
  105.                     }
  106.                 case 2:
  107.                     JigPromptDistanceOptions prOptions2 = new JigPromptDistanceOptions("\nRadius:");
  108.                     // Set properties such as UseBasePoint and BasePoint of the prompt options object if necessary here.
  109.                     prOptions2.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.GovernedByUCSDetect | UserInputControls.UseBasePointElevation;
  110.                   
  111.                     //Here is the code manully added to make the radius jigging effect better:
  112.                     prOptions2.BasePoint = mCenter;
  113.                     prOptions2.UseBasePoint = true;
  114.                   
  115.                     PromptDoubleResult prResult2 = prompts.AcquireDistance(prOptions2);
  116.                     if (prResult2.Status == PromptStatus.Cancel && prResult2.Status == PromptStatus.Error)
  117.                         return SamplerStatus.Cancel;
  118.                     if (prResult2.Value.Equals(mRadius))  //Use better comparison method if necessary.
  119.                     {
  120.                         return SamplerStatus.NoChange;
  121.                     }
  122.                     else
  123.                     {
  124.                         mRadius = prResult2.Value;
  125.                         return SamplerStatus.OK;
  126.                     }
  127.                 default:
  128.                     break;
  129.             }
  130.             return SamplerStatus.OK;
  131.         }

  132.         #endregion
  133.         #region Methods to Call
  134.         public static Circle Jig()
  135.         {
  136.             EntityJigger1 jigger = null;
  137.             try
  138.             {
  139.                 jigger = new EntityJigger1(new Circle());
  140.                 PromptResult pr;
  141.                 do
  142.                 {
  143.                     pr = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.Drag(jigger);
  144.                     if (pr.Status == PromptStatus.Keyword)
  145.                     {
  146.                         // Keyword handling code
  147.                     }
  148.                     else
  149.                     {
  150.                         jigger.mCurJigFactorIndex++;
  151.                     }
  152.                 } while (pr.Status != PromptStatus.Cancel && pr.Status != PromptStatus.Error && jigger.mCurJigFactorIndex <= 2);
  153.                 if (pr.Status == PromptStatus.Cancel || pr.Status == PromptStatus.Error)
  154.                 {
  155.                     if (jigger != null && jigger.Entity != null)
  156.                         jigger.Entity.Dispose();
  157.                     return null;
  158.                 }
  159.                 else
  160.                     return jigger.Entity;
  161.             }
  162.             catch
  163.             {
  164.                 if (jigger != null && jigger.Entity != null)
  165.                     jigger.Entity.Dispose();
  166.                 return null;
  167.             }
  168.         }
  169.         #endregion
  170.         #region Test Commands
  171.         [CommandMethod("TestEntityJigger1")]
  172.         public static void TestEntityJigger1_Method()
  173.         {
  174.             try
  175.             {
  176.                 Entity jigEnt = EntityJigger1.Jig();
  177.                 if (jigEnt != null)
  178.                 {
  179.                     Database db = HostApplicationServices.WorkingDatabase;
  180.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  181.                     {
  182.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  183.                         btr.AppendEntity(jigEnt);
  184.                         tr.AddNewlyCreatedDBObject(jigEnt, true);
  185.                         tr.Commit();
  186.                     }
  187.                 }
  188.             }
  189.             catch (System.Exception ex)
  190.             {
  191.                 MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  192.             }
  193.         }
  194.         #endregion
  195.     }
  196. }
  197. For this case, only two small changes need to be tweaked manually as commented in the above auto-generated code. One is to make the circle radius jig effect look better and the other one is to avoid the degeneration issue. All other stuffs complex or simpler are all taken care of well, including but not limited to honoring UCS, canceling jig input, and adding the entity to the right space.  
  198. Now we are ready to go. Press F5 to start up AutoCAD and type TestEntityJigger1 into the AutoCAD command line window and see what it will give you, either in WCS or UCS, either in Model Space or Paper Space, either finishing the jig to the end or canceling the jig in middle way, etc.
  199. The Entity Jigger wizard of the leading edge AutoCAD .NET Addin Wizard (AcadNetAddinWizard) can help you create EntityJig derivatives for various entity types automatically, quickly, reliably and professionally. You name it.
  200. The Entity Jigger wizard of the leading edge AutoCAD .NET Addin Wizard (AcadNetAddinWizard)can help you create various entity jiggers
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 15:54

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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