EaBIM

标题: 各AutoCAD版本在注册表中的位置 我们在编程的时候,如果要得到CAD版本,最简单直... [打印本页]

作者: 萧闫子    时间: 2014-1-8 14:09
标题: 各AutoCAD版本在注册表中的位置 我们在编程的时候,如果要得到CAD版本,最简单直...

  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.
复制代码






欢迎光临 EaBIM (https://eabim.net/) Powered by Discuz! X3.2