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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

各AutoCAD版本在注册表中的位置 我们在编程的时候,如果要得到CAD版本,最简单直...

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12404

社区QQ达人

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

  1. AutoCAD .NET API provides two concrete Jig classes for us to jig different entities in different circumstances, EntityJig and DrawJig. EntityJig is to jig a specific entity as its name indicates and the DrawJig is to jig anything that has graphics to draw, which can be a single entity, a group of entities, or something that is not available natively in AutoCAD.
  2. We have demonstrated jigging a line segment or multiple segments using the same line jig earlier. In this article, let us see how to add the dynamic dimension support for line jigging.
  3. Here is the core code of the DynDimLineJigger along with a test command:
  4. #region Namespaces
  5. using System;
  6. using System.Text;
  7. using System.Linq;
  8. using System.Xml;
  9. using System.Reflection;
  10. using System.ComponentModel;
  11. using System.Collections;
  12. using System.Collections.Generic;
  13. using System.Windows;
  14. using System.Windows.Media.Imaging;
  15. using System.Windows.Forms;
  16. using System.Drawing;
  17. using System.IO;
  18. using Autodesk.AutoCAD.ApplicationServices;
  19. using Autodesk.AutoCAD.DatabaseServices;
  20. using Autodesk.AutoCAD.Runtime;
  21. using Autodesk.AutoCAD.EditorInput;
  22. using Autodesk.AutoCAD.Geometry;
  23. using Autodesk.AutoCAD.Windows;
  24. using MgdAcApplication = Autodesk.AutoCAD.ApplicationServices.Application;
  25. using MgdAcDocument = Autodesk.AutoCAD.ApplicationServices.Document;
  26. using AcWindowsNS = Autodesk.AutoCAD.Windows;
  27. #endregion

  28. namespace AcadNetAddinWizard_Namespace
  29. {
  30.     public class DynDimLineJigger : EntityJig
  31.     {
  32.         #region Fields
  33.         public int mCurJigFactorIndex = 1;  // Jig Factor Index
  34.         public Point3d mStartPoint; // Jig Factor #1
  35.         public Point3d mEndPoint;   // Jig Factor #2
  36.         private DynamicDimensionDataCollection dddCollection = new DynamicDimensionDataCollection();
  37.         #endregion
  38.         #region Constructors
  39.         public DynDimLineJigger(Line ent)
  40.             : base(ent)
  41.         {
  42.             // Initialize and transform the Entity.
  43.             Entity.SetDatabaseDefaults();
  44.             Entity.TransformBy(UCS);
  45.             // Build up the Dynamic Dimension objects.
  46.             Dimension dim1 = new AlignedDimension();
  47.             dim1.SetDatabaseDefaults();
  48.             dim1.TransformBy(UCS);
  49.             dddCollection.Add(new DynamicDimensionData(dim1, true, true));
  50.             dddCollection[0].Focal = false;
  51.             dddCollection[0].Editable = false;
  52.         }
  53.         #endregion
  54.         #region Properties
  55.         private Editor Editor
  56.         {
  57.             get
  58.             {
  59.                 return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
  60.             }
  61.         }
  62.         private Matrix3d UCS
  63.         {
  64.             get
  65.             {
  66.                 return MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  67.             }
  68.         }
  69.         #endregion
  70.         #region Overrides
  71.         public new Line Entity  // Overload the Entity property for convenience.
  72.         {
  73.             get
  74.             {
  75.                 return base.Entity as Line;
  76.             }
  77.         }
  78.         protected override bool Update()
  79.         {
  80.             switch (mCurJigFactorIndex)
  81.             {
  82.                 case 1:
  83.                     Entity.StartPoint = Entity.EndPoint = mStartPoint;
  84.                     Entity.StartPoint.TransformBy(UCS);
  85.                     Entity.EndPoint.TransformBy(UCS);
  86.                     break;
  87.                 case 2:
  88.                     Entity.EndPoint = mEndPoint;
  89.                     Entity.EndPoint.TransformBy(UCS);
  90.                     // Change the Dynamic Dimension data below if necessary
  91.                     AlignedDimension dim1 = (AlignedDimension)dddCollection[0].Dimension;
  92.                     dim1.XLine1Point = mStartPoint;
  93.                     dim1.XLine1Point.TransformBy(UCS);
  94.                     dim1.XLine2Point = mEndPoint;
  95.                     dim1.XLine2Point.TransformBy(UCS);
  96.                     dim1.DimLinePoint = mEndPoint.RotateBy(Math.PI/10, Vector3d.ZAxis, mStartPoint);
  97.                     dim1.DimLinePoint.TransformBy(UCS);
  98.                     break;
  99.                 default:
  100.                     return false;
  101.             }
  102.             return true;
  103.         }
  104.         protected override SamplerStatus Sampler(JigPrompts prompts)
  105.         {
  106.             switch (mCurJigFactorIndex)
  107.             {
  108.                 case 1:
  109.                     JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\nStart point:");
  110.                     prOptions1.UseBasePoint = false;
  111.                                     
  112.                     PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);
  113.                     if (prResult1.Status == PromptStatus.Cancel) return SamplerStatus.Cancel;
  114.                     if (prResult1.Status == PromptStatus.Error) return SamplerStatus.Cancel;
  115.                     if (prResult1.Value.Equals(mStartPoint))  //Use better comparison method if necessary.
  116.                     {
  117.                         return SamplerStatus.NoChange;
  118.                     }
  119.                     else
  120.                     {
  121.                         mStartPoint = prResult1.Value;
  122.                         return SamplerStatus.OK;
  123.                     }
  124.                 case 2:
  125.                     JigPromptPointOptions prOptions2 = new JigPromptPointOptions("\nEnd point:");
  126.                     prOptions2.BasePoint = Entity.StartPoint;
  127.                     prOptions2.UseBasePoint = true;
  128.                     
  129.                     PromptPointResult prResult2 = prompts.AcquirePoint(prOptions2);
  130.                     if (prResult2.Status == PromptStatus.Cancel) return SamplerStatus.Cancel;
  131.                     if (prResult2.Status == PromptStatus.Error) return SamplerStatus.Cancel;
  132.                     if (prResult2.Value.Equals(mEndPoint))  //Use better comparison method if necessary.
  133.                     {
  134.                         return SamplerStatus.NoChange;
  135.                     }
  136.                     else
  137.                     {
  138.                         mEndPoint = prResult2.Value;
  139.                         return SamplerStatus.OK;
  140.                     }
  141.                 default:
  142.                     break;
  143.             }
  144.             return SamplerStatus.OK;
  145.         }
  146.         protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
  147.         {
  148.             base.GetDynamicDimensionData(dimScale);
  149.             return dddCollection;
  150.         }
  151.         #endregion
  152.         #region Method to Call
  153.         public static Line Jig()
  154.         {
  155.             DynDimLineJigger jigger = null;
  156.             try
  157.             {
  158.                 Editor ed = MgdAcApplication.DocumentManager.MdiActiveDocument.Editor;
  159.                 jigger = new DynDimLineJigger(new Line());
  160.                 PromptResult pr;
  161.                 do
  162.                 {
  163.                     pr = ed.Drag(jigger);
  164.                     if (pr.Status == PromptStatus.Keyword)
  165.                     {
  166.                         // Add keyword handling code below
  167.                     }
  168.                     else
  169.                     {
  170.                         jigger.mCurJigFactorIndex++;
  171.                     }
  172.                 } while (pr.Status != PromptStatus.Cancel && pr.Status != PromptStatus.Error && jigger.mCurJigFactorIndex <= 2);
  173.                 return jigger.Entity;
  174.             }
  175.             catch
  176.             {
  177.                 if( jigger != null && jigger.Entity != null ) jigger.Entity.Dispose();
  178.                 return null;
  179.             }
  180.         }
  181.         #endregion
  182.         #region Test Command
  183.         [CommandMethod("TestDynDimLineJigger")]
  184.         public static void TestDynDimLineJigger_Method()
  185.         {
  186.             try
  187.             {
  188.                 Entity jigEnt = DynDimLineJigger.Jig();
  189.                 if (jigEnt != null)
  190.                 {
  191.                     Database db = HostApplicationServices.WorkingDatabase;
  192.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  193.                     {
  194.                         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  195.                         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  196.                         btr.AppendEntity(jigEnt);
  197.                         tr.AddNewlyCreatedDBObject(jigEnt, true);
  198.                         tr.Commit();
  199.                     }
  200.                 }
  201.             }
  202.             catch (System.Exception ex)
  203.             {
  204.                 MgdAcApplication.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  205.             }
  206.         }
  207.         #endregion
  208.     }
  209. }
  210. Here is what the dynamic dimension looks like in AutoCAD when the line is being jigged:


  211. A few highlights about the code may be helpful:
  212. • An entity type needs to be specified in the EntityJig derivative, as Line here.
  213. • A DynamicDimensionDataCollection instance needs to be created and initialized in the constructor of the EntityJig.
  214. • The DynamicDimensionDataCollection instance needs to be returned in the GetDynamicDimensionData override.
  215. • The DynamicDimensionDataCollection has to be populated with good DynamicDimensionData elements such as the AlignedDimension as demonstrated and properly indexed.
  216. • Each DynamicDimensionData element should be updated accordingly in the Update() call if its relevant factors have changed.
  217. • The Sampler() override is to acquire input for line points in a certain order.
  218. • If the input is the same as the stored variable, we’d better return SamplerStatus.NoChange to avoid unnecessary flashing; if not, return SamplerStatus.OK.
  219. • The keywords can be added easily through the Keywords collection of the JigPromptPointOptions or other similar prompt options objects.
  220. • Please do not forget to handle the cancel/escape circumstance as demonstrated.
  221. • The Update() override is to update the point properties of the line in the same order as set in the Sampler().
  222. • The Editor.Draw() is the power to fire the jig. If two properties need to be set, the jig needs to be fired off twice. That is why a while loop is used.
  223. • The while loop needs to think about the PromptStatus.Keyword case of the PromptResult after each Jig Drag.
  224. • Only after the jig succeeds should the circle be added to the database to avoid database corruption.
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对

相关帖子

工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 12:50

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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