乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 190|回复: 10

[编程交流] NetArx2010新特性-规则重定义

[复制链接]

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-13 21:30:00 | 显示全部楼层 |阅读模式
.NetArx终于在2010版实现了自定义实体的子集--规则重定义,算是个好消息,
虽然很晚,而且功能没有ObjectArx的自定义实体强,但好歹没有强:)
下面的例子利用多行文字重定义为序号球,
更多的相关例子请看

nnx4jfp0hci.JPG

nnx4jfp0hci.JPG

  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.GraphicsInterface;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. [assembly: CommandClass(typeof(TlsCad.XhqHelper))]
  8. [assembly: ExtensionApplication(typeof(TlsCad.TlsApplication))]
  9. namespace TlsCad
  10. {
  11.     class TlsApplication : IExtensionApplication
  12.     {
  13.         void IExtensionApplication.Initialize()
  14.         {
  15.             XhqHelper.OverruleStart();
  16.             Overrule.Overruling = true;
  17.         }
  18.         void IExtensionApplication.Terminate()
  19.         {
  20.             XhqHelper.OverruleEnd();
  21.             Overrule.Overruling = false;
  22.         }
  23.     }
  24.     #region Helper
  25.     static class XhqHelper
  26.     {
  27.         public readonly static string RegAppName = "TlsCad.Xhq";
  28.         public readonly static double Radius = 8;
  29.         public readonly static double TextHeight = 8;
  30.         //获取起点
  31.         public static Point3d GetPoint(MText mtxt)
  32.         {
  33.             ResultBuffer rb = mtxt.GetXDataForApplication(RegAppName);
  34.             return (Point3d)rb.AsArray()[1].Value;
  35.         }
  36.         //设置起点,注意这里使用1011组码保存点,支持Copy、Move、Mirror等命令时实时更新XData
  37.         public static void SetPoint(MText mtxt, Point3d point)
  38.         {
  39.             ResultBuffer rb = new ResultBuffer(new TypedValue[] { new TypedValue(1001, RegAppName), new TypedValue(1011, point) });
  40.             mtxt.XData = rb;
  41.         }
  42.         [CommandMethod("xh")]
  43.         public static void XHQ()
  44.         {
  45.             PromptIntegerResult res1 = CadHelper.Editor.GetInteger(new PromptIntegerOptions("\n请输入序号:"));
  46.             PromptPointResult res2 = CadHelper.Editor.GetPoint(new PromptPointOptions("\n请输入起点:"));
  47.             XhqJig jig = new XhqJig(res2.Value, res1.Value.ToString());
  48.             PromptResult res = CadHelper.Editor.Drag(jig);            if (res.Status == PromptStatus.OK)
  49.             {
  50.                 Database db = Application.DocumentManager.MdiActiveDocument.Database;
  51.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  52.                 {
  53.                     BlockTableRecord btr =
  54.                         (BlockTableRecord)tr.GetObject(
  55.                             db.CurrentSpaceId,
  56.                             OpenMode.ForWrite,
  57.                             false);
  58.                     MText mtxt = jig.GetEntity();
  59.                     btr.AppendEntity(mtxt);
  60.                     tr.AddNewlyCreatedDBObject(mtxt, true);
  61.                     RegAppTable rat =
  62.                         (RegAppTable)tr.GetObject(
  63.                             db.RegAppTableId,
  64.                             OpenMode.ForRead,
  65.                             false);
  66.                     if (!rat.Has(RegAppName))
  67.                     {
  68.                         rat.UpgradeOpen();
  69.                         RegAppTableRecord regapp = new RegAppTableRecord();
  70.                         regapp.Name = RegAppName;
  71.                         rat.Add(regapp);
  72.                         tr.AddNewlyCreatedDBObject(regapp, true);
  73.                     }
  74.                     SetPoint(mtxt, res2.Value);
  75.                     tr.Commit();
  76.                 }
  77.             }
  78.         }        public static void OverruleStart()
  79.         {
  80.             Overrule.AddOverrule(RXObject.GetClass(typeof(MText)), XhqDrawOverrule.TheOverrule, false);
  81.             Overrule.AddOverrule(RXObject.GetClass(typeof(MText)), XhqGripOverrule.TheOverrule, false);
  82.             Overrule.AddOverrule(RXObject.GetClass(typeof(MText)), XhqOsnapOverrule.TheOverrule, false);
  83.             Overrule.AddOverrule(RXObject.GetClass(typeof(MText)), XhqTransformOverrule.TheOverrule, false);
  84.         }
  85.         public static void OverruleEnd()
  86.         {
  87.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(MText)), XhqDrawOverrule.TheOverrule);
  88.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(MText)), XhqGripOverrule.TheOverrule);
  89.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(MText)), XhqOsnapOverrule.TheOverrule);
  90.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(MText)), XhqTransformOverrule.TheOverrule);
  91.         }
  92.     }
  93.     #endregion
  94.     #region Jig
  95.     //序号球拖动类
  96.     class XhqJig : DrawJig
  97.     {
  98.         Point3d m_Location;
  99.         Line m_Line;
  100.         MText m_MText;
  101.         Circle m_Circle;
  102.         public XhqJig(Point3d FirstPoint, string No)
  103.         {
  104.             m_MText = new MText();
  105.             m_MText.Attachment = AttachmentPoint.MiddleCenter;
  106.             m_MText.Location = FirstPoint;
  107.             m_MText.TextHeight = XhqHelper.TextHeight;
  108.             m_MText.Contents = No;
  109.             m_Line = new Line(FirstPoint, FirstPoint);
  110.             m_Circle = new Circle();
  111.             m_Circle.Center = FirstPoint;
  112.             m_Circle.Radius = XhqHelper.Radius;
  113.         }
  114.         protected override SamplerStatus Sampler(JigPrompts prompts)
  115.         {
  116.             JigPromptPointOptions jigOpts = new JigPromptPointOptions();
  117.             jigOpts.UserInputControls =
  118.                 UserInputControls.Accept3dCoordinates |
  119.                 UserInputControls.NoZeroResponseAccepted |
  120.                 UserInputControls.NoNegativeResponseAccepted;
  121.             jigOpts.Message = "\n请输入终点:";
  122.             PromptPointResult res = prompts.AcquirePoint(jigOpts);
  123.             Point3d positionTemp = res.Value;
  124.             if (positionTemp != m_Location)
  125.             {
  126.                 m_Location = positionTemp;
  127.             }
  128.             else
  129.                 return SamplerStatus.NoChange;
  130.             if (res.Status == PromptStatus.Cancel)
  131.                 return SamplerStatus.Cancel;
  132.             else
  133.                 return SamplerStatus.OK;
  134.         }        protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  135.         {
  136.             try
  137.             {
  138.                 Update();
  139.                 draw.Geometry.Draw(m_Circle);
  140.                 draw.Geometry.Draw(m_Line);
  141.                 draw.Geometry.Draw(m_MText);
  142.             }
  143.             catch (System.Exception)
  144.             {
  145.                 return false;
  146.             }
  147.             return true;
  148.         }
  149.         private void Update()
  150.         {
  151.             m_Circle.Center = m_Location;
  152.             Vector3d vec = m_Location - m_Line.StartPoint;
  153.             if (vec.Length  XhqHelper.Radius)
  154.             {
  155.                 vec = vec / vec.Length * XhqHelper.Radius;
  156.                 entitySet.Add(new Line(pt1, mtxt.Location - vec));
  157.             }
  158.         }
  159.     }
  160.     //MText->序号球
  161.     public class XhqDrawOverrule : DrawableOverrule
  162.     {
  163.         public static XhqDrawOverrule TheOverrule = new XhqDrawOverrule();
  164.         public XhqDrawOverrule()
  165.         {
  166.             SetXDataFilter(XhqHelper.RegAppName);
  167.         }
  168.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  169.         {
  170.             MText mtxt = (MText)drawable;
  171.             wd.Geometry.Circle(mtxt.Location, XhqHelper.Radius, new Vector3d(0, 0, 1));
  172.             Point3d pt1 = XhqHelper.GetPoint(mtxt);
  173.             Vector3d vec = mtxt.Location - pt1;
  174.             if (vec.Length > XhqHelper.Radius)
  175.             {
  176.                 vec = vec / vec.Length * XhqHelper.Radius;
  177.                 wd.Geometry.WorldLine(pt1, mtxt.Location - vec);
  178.             }
  179.             return base.WorldDraw(drawable, wd);
  180.         }
  181.     }
  182.     #endregion
  183. }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

1

主题

3

帖子

3

银币

初来乍到

Rank: 1

铜币
7
发表于 2022-7-14 17:18:00 | 显示全部楼层

这个例子 现在加载好像没有反应
回复

使用道具 举报

1

主题

4

帖子

1

银币

初来乍到

Rank: 1

铜币
8
发表于 2018-9-28 15:45:00 | 显示全部楼层
终于找到,我想要的东西了感谢感谢
回复

使用道具 举报

6

主题

21

帖子

3

银币

初来乍到

Rank: 1

铜币
45
发表于 2009-5-14 11:26:00 | 显示全部楼层
我正在弄标号,可惜我弄得的CAD2008
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-14 23:31:00 | 显示全部楼层
来自于Autodesk开发者网络课程上的例子,会变色的温度计
当你移动当中三个空心的圆圈时,对应的温度数值会自动变化。

用netload命令加载下面的文件体验一下
命令TestOn,然后选择直线
  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.GraphicsInterface;
  7. using Autodesk.AutoCAD.Runtime;
  8. [assembly: CommandClass(typeof(abc.TestOverrule))]
  9. [assembly: ExtensionApplication(typeof(abc.TestOverrule))]
  10. namespace abc
  11. {
  12.     #region "HelperClass"
  13.     // Global helper class (singleton). Contains central definitions of some global constants,
  14.     // and a few helper functions
  15.     public class HelperClass
  16.     {
  17.         const String mExtDictName = "SGP_MyDict";
  18.         // Defines Dictionary name for the Extension Dictionary demo
  19.         const String mXRecName = "SGP_MyDATA";
  20.         // Defines Dictionary name for the Extension Dictionary demo
  21.         private static HelperClass mMe;
  22.         // Name of our dictionary in extension dictionary
  23.         public String DictionaryName
  24.         {
  25.             get
  26.             {
  27.                 return mExtDictName;
  28.             }
  29.         }
  30.         // Name of our XRecord
  31.         public String XRecordName
  32.         {
  33.             get
  34.             {
  35.                 return mXRecName;
  36.             }
  37.         }
  38.         // Protected constructor - to enforce singleton behavior
  39.         protected HelperClass()
  40.         {
  41.         }
  42.         // static function to retrieve one and only instance of singleton
  43.         public static HelperClass GetSingleton
  44.         {
  45.             get
  46.             {
  47.                 if (mMe == null)
  48.                 {
  49.                     mMe = new HelperClass();
  50.                 }
  51.                 return mMe;
  52.             }
  53.         }
  54.         // Retrieve data (as resbuf) from or Xrecord.
  55.         // Returns null object if there's a problem
  56.         public ResultBuffer GetXRecordData(DBObject obj)
  57.         {
  58.             Xrecord xRec = null;
  59.             ObjectId id = obj.ExtensionDictionary;
  60.             // Make sure we have an ext dict befoore proceeding
  61.             if (id.IsValid)
  62.             {
  63.                 // Retrieve data using a transaction
  64.                 Database db = Application.DocumentManager.MdiActiveDocument.Database;
  65.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  66.                 {
  67.                     DBDictionary extDict = (DBDictionary)tr.GetObject(id, OpenMode.ForRead, false);
  68.                     if (extDict.Contains(DictionaryName))
  69.                     {
  70.                         // We're assuming that if my dictionary exists, then so will the XRecord in it.
  71.                         ObjectId dictId = extDict.GetAt((String)DictionaryName);
  72.                         DBDictionary myDict = (DBDictionary)tr.GetObject(dictId, OpenMode.ForRead);
  73.                         xRec = (Xrecord)tr.GetObject(myDict.GetAt((String)XRecordName),
  74.                             OpenMode.ForRead);
  75.                     }
  76.                 }
  77.             }
  78.             if (xRec == null)
  79.             {
  80.                 return null;
  81.             }
  82.             else
  83.             {
  84.                 return xRec.Data;
  85.             }
  86.         }
  87.         // Modifies data in our XRecord.
  88.         // (creates ou rdictionary and XRecoird if it doesn't already exist)
  89.         public void SetXRecordData(DBObject obj, ResultBuffer myData)
  90.         {
  91.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  92.             using (Transaction tr = db.TransactionManager.StartTransaction())
  93.             {
  94.                 DBDictionary myDict = default(DBDictionary);
  95.                 Xrecord xRec = null;
  96.                 ObjectId id = obj.ExtensionDictionary;
  97.                 if (id == ObjectId.Null)
  98.                 {
  99.                     obj.CreateExtensionDictionary();
  100.                     id = obj.ExtensionDictionary;
  101.                 }
  102.                 DBDictionary extDict = (DBDictionary)tr.GetObject(id, OpenMode.ForWrite);
  103.                 if (extDict.Contains(DictionaryName))
  104.                 {
  105.                     ObjectId dictId = extDict.GetAt((String)DictionaryName);
  106.                     myDict = (DBDictionary)tr.GetObject(dictId, OpenMode.ForWrite);
  107.                 }
  108.                 else
  109.                 {
  110.                     myDict = new DBDictionary();
  111.                     extDict.SetAt((String)DictionaryName, myDict);
  112.                     tr.AddNewlyCreatedDBObject(myDict, true);
  113.                 }
  114.                 if (myDict.Contains(XRecordName))
  115.                 {
  116.                     xRec = (Xrecord)tr.GetObject(myDict.GetAt((String)XRecordName),
  117.                         OpenMode.ForWrite);
  118.                 }
  119.                 else
  120.                 {
  121.                     xRec = new Xrecord();
  122.                     myDict.SetAt((String)XRecordName, xRec);
  123.                     tr.AddNewlyCreatedDBObject(xRec, true);
  124.                 }
  125.                 xRec.Data = myData;
  126.                 tr.Commit();
  127.             }
  128.         }
  129.     }
  130.     #endregion
  131.     // Grip overrule to add our custom grips to the line
  132.     public class MyGripOverrule : GripOverrule
  133.     {
  134.         public class MyGrip : GripData
  135.         {
  136.             private int mGripNum;
  137.             public int Ordinal
  138.             {
  139.                 get
  140.                 {
  141.                     return mGripNum;
  142.                 }
  143.                 set
  144.                 {
  145.                     mGripNum = value;
  146.                 }
  147.             }
  148.             // Call this to tell the grip to move itself
  149.             public void Move(Vector3d vec)
  150.             {
  151.                 GripPoint = GripPoint + vec;
  152.             }
  153.             public override bool ViewportDraw(ViewportDraw worldDraw, ObjectId entityId,
  154.                 GripData.DrawType type, Point3d? imageGripPoint, int gripSizeInPixels)
  155.             {
  156.                 Point2d unit = worldDraw.Viewport.GetNumPixelsInUnitSquare(GripPoint);
  157.                 worldDraw.Geometry.Circle(GripPoint, 1.5 * gripSizeInPixels / unit.X,
  158.                     worldDraw.Viewport.ViewDirection);
  159.                 return true;
  160.             }
  161.         }
  162.         // Array to hold our 3 grips
  163.         GripData[] mGripData = new GripData[3];
  164.         public override void GetGripPoints(Entity entity, GripDataCollection grips,
  165.             double curViewUnitSize, int gripSize, Vector3d curViewDir, GetGripPointsFlags bitFlags)
  166.         {
  167.             ResultBuffer rb = HelperClass.GetSingleton.GetXRecordData(entity);
  168.             // We assume entity is a line
  169.             Line myLine = (Line)entity;
  170.             // Set grip positions to represent temperatures (we're using Celsius)
  171.             // min temperature
  172.             int temp = (int)rb.AsArray()[1].Value;
  173.             double pos = myLine.StartParam + (temp / 100.0) * (myLine.EndParam - myLine.StartParam);
  174.             Point3d pt = myLine.GetPointAtParameter(pos);
  175.             MyGrip grip = new MyGrip();
  176.             grip.Ordinal = 0;
  177.             grip.GripPoint = pt;
  178.             mGripData[0] = grip;
  179.             // max temperature
  180.             temp = (int)rb.AsArray()[2].Value;
  181.             pos = myLine.StartParam + (temp / 100.0) * (myLine.EndParam - myLine.StartParam);
  182.             pt = myLine.GetPointAtParameter(pos);
  183.             grip = new MyGrip();
  184.             grip.Ordinal = 1;
  185.             grip.GripPoint = pt;
  186.             mGripData[1] = grip;
  187.             // current temperature
  188.             temp = (int)rb.AsArray()[3].Value;
  189.             pos = myLine.StartParam + (temp / 100.0) * (myLine.EndParam - myLine.StartParam);
  190.             pt = myLine.GetPointAtParameter(pos);
  191.             grip = new MyGrip();
  192.             grip.Ordinal = 2;
  193.             grip.GripPoint = pt;
  194.             mGripData[2] = grip;
  195.             // Add our grips to the list
  196.             foreach (MyGrip g in mGripData)
  197.             {
  198.                 grips.Add(g);
  199.             }
  200.             // Get the standard line grip points as well
  201.             base.GetGripPoints(entity, grips, curViewUnitSize, gripSize, curViewDir, bitFlags);
  202.             Point3d qq1 = grips[0].GripPoint;
  203.             Point3d qq2 = grips[1].GripPoint;
  204.         }
  205.         public override void MoveGripPointsAt(Entity entity, GripDataCollection grips,
  206.             Vector3d offset, MoveGripPointsFlags bitFlags)
  207.         {
  208.             // We only take action when we get this call on a database resident entity
  209.             // Dragging operation makes shallow clone of line,
  210.             // and setting clomeMeForDragging to false is generally a bad idea.
  211.             // (If you do set clone me for dragging to false, then don't call bae class overriden methods).
  212.             if (entity.Id.IsValid)
  213.             {
  214.                 // Cast to a Line so we can access properties
  215.                 Line myLine = (Line)entity;
  216.                 Vector3d lineDir = (myLine.EndPoint - myLine.StartPoint);
  217.                 lineDir = lineDir.GetNormal();
  218.                 // Direction of Line
  219.                 double offsetDist = lineDir.DotProduct(offset);
  220.                 // Component of mouse translation along like
  221.                 // Iterate through list of all grips being moved
  222.                 foreach (GripData g in grips)
  223.                 {
  224.                     if (g is MyGrip)
  225.                     {
  226.                         MyGrip grip = (MyGrip)g;
  227.                         // Cast to our grip type
  228.                         // Make sure offset never takes grip beyond either end of line
  229.                         if (offsetDist >= 0)
  230.                         {
  231.                             if (offsetDist > (myLine.EndPoint - grip.GripPoint).Length)
  232.                             {
  233.                                 offsetDist = (myLine.EndPoint - grip.GripPoint).Length;
  234.                             }
  235.                         }
  236.                         else
  237.                         {
  238.                             if (-offsetDist > (myLine.StartPoint - grip.GripPoint).Length)
  239.                             {
  240.                                 offsetDist = -(myLine.StartPoint - grip.GripPoint).Length;
  241.                             }
  242.                         }
  243.                         lineDir = lineDir * offsetDist;
  244.                         // retrieve stored data and edit the changed value
  245.                         ResultBuffer rb = HelperClass.GetSingleton.GetXRecordData(entity);
  246.                         TypedValue[] typeValue = rb.AsArray();
  247.                         String val1 = (String)typeValue[0].Value;
  248.                         int[] intVal = new int[3];
  249.                         intVal[0] = (int)typeValue[1].Value;
  250.                         // min
  251.                         intVal[1] = (int)typeValue[2].Value;
  252.                         // max
  253.                         intVal[2] = (int)typeValue[3].Value;
  254.                         // current
  255.                         // Tell grip to move itself long the line
  256.                         grip.Move(lineDir);
  257.                         // Calculate new temperature from grip position along the line
  258.                         double newParam = myLine.GetParameterAtPoint(grip.GripPoint);
  259.                         int newTemp = (int)(100 * (newParam - myLine.StartParam) / (myLine.EndParam - myLine.StartParam));
  260.                         // Don't let min temp value rise above max temp
  261.                         // And don't let max temp go below min temp
  262.                         if (grip.Ordinal == 0)
  263.                         {
  264.                             if (newTemp  intVal[0])
  265.                             {
  266.                                 intVal[1] = newTemp;
  267.                             }
  268.                             else
  269.                             {
  270.                                 intVal[1] = intVal[0] + 1;
  271.                             }
  272.                         }
  273.                         else
  274.                         {
  275.                             intVal[2] = newTemp;
  276.                         }
  277.                         // Create new resbuf with new data and put back in Xrecord
  278.                         ResultBuffer newRb = new ResultBuffer(new TypedValue((int)DxfCode.Text, val1),
  279.                             new TypedValue((int)DxfCode.Int32, intVal[0]),
  280.                             new TypedValue((int)DxfCode.Int32, intVal[1]),
  281.                             new TypedValue((int)DxfCode.Int32, intVal[2]));
  282.                         HelperClass.GetSingleton.SetXRecordData(myLine, newRb);
  283.                     }
  284.                 }
  285.             }
  286.             // Remove our grips from the list befroe calling base class function
  287.             // (Doesn't seem to like my grips)
  288.             for (int i = grips.Count - 1; i >= 0; i += -1)
  289.             {
  290.                 if (grips[i] is MyGrip)
  291.                 {
  292.                     grips.Remove(grips[i]);
  293.                 }
  294.             }
  295.             // If any grips left, then we call base class function
  296.             if (grips.Count > 0)
  297.             {
  298.                 base.MoveGripPointsAt(entity, grips, offset, bitFlags);
  299.             }
  300.         }
  301.     }
  302.     #region "Simple DrawableOverrule "
  303.     // This overrule adds our custom graphhics to the Line
  304.     // We're going to turn our Line into a Thermometer
  305.     public class MyDrawOverrule : DrawableOverrule
  306.     {
  307.         const int mSize = 30;
  308.         // Universal scaling constant - so I don't have to edit every calculation
  309.         // if I want the thermometer thicker or thinner
  310.         // This is the function that gets called to add/replace an entity's WorldDraw graphics
  311.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  312.         {
  313.             // Is it a line? (It should be)
  314.             if (!(drawable is Line))
  315.             {
  316.                 return base.WorldDraw(drawable, wd);
  317.             }
  318.             Line myLine = (Line)drawable;
  319.             Point3dCollection pts = new Point3dCollection();
  320.             // Read Xrecord values to populate prompt defauls
  321.             ResultBuffer resbuf = HelperClass.GetSingleton.GetXRecordData(myLine);
  322.             TypedValue[] typeValue = resbuf.AsArray();
  323.             // Room name
  324.             String myText = (String)typeValue[0].Value;
  325.             // Min temp
  326.             int lowerTemp = (int)typeValue[1].Value;
  327.             // max temp  
  328.             int upperTemp = (int)typeValue[2].Value;
  329.             // Current temp
  330.             int curTemp = (int)typeValue[3].Value;
  331.             double curPos = curTemp / 100.0;
  332.             Vector3d perpVec = (myLine.EndPoint - myLine.StartPoint).CrossProduct(myLine.Normal).GetNormal();
  333.             double startParam = myLine.GetParameterAtPoint(myLine.StartPoint);
  334.             double endParam = myLine.GetParameterAtPoint(myLine.EndPoint);
  335.             var oldColIndex = wd.SubEntityTraits.Color;
  336.             FillType oldFillType = wd.SubEntityTraits.FillType;
  337.             double posParam = 0;
  338.             IntPtr gsMarker = default(IntPtr);
  339.             // Draw thermometer body
  340.             wd.SubEntityTraits.FillType = FillType.FillNever;
  341.             // right body edge
  342.             pts.Clear();
  343.             pts.Add(myLine.StartPoint + perpVec * myLine.Length * 2.5 / mSize);
  344.             pts.Add(myLine.EndPoint + perpVec * myLine.Length * 2.5 / mSize);
  345.             gsMarker = (System.IntPtr)1;
  346.             wd.Geometry.Polyline(pts, myLine.Normal, gsMarker);
  347.             // left body edge
  348.             pts.Clear();
  349.             pts.Add(myLine.EndPoint - perpVec * myLine.Length * 2.5 / mSize);
  350.             pts.Add(myLine.StartPoint - perpVec * myLine.Length * 2.5 / mSize);
  351.             gsMarker = (System.IntPtr)2;
  352.             wd.Geometry.Polyline(pts, myLine.Normal, gsMarker);
  353.             // top body edge
  354.             wd.Geometry.CircularArc(myLine.EndPoint - perpVec * myLine.Length * 2.5 / mSize,
  355.                 myLine.EndPoint + (myLine.EndPoint - myLine.StartPoint) * 2.5 / mSize,
  356.                 myLine.EndPoint + perpVec * myLine.Length * 2.5 / mSize, ArcType.ArcSimple);
  357.             // bottom body edge
  358.             double theta = Math.PI / 6;
  359.             double rad = (myLine.Length * 2.5 / mSize) / Math.Sin(theta);
  360.             double a = (myLine.Length * 2.5 / mSize) / Math.Tan(theta);
  361.             Point3d bowlCenter = myLine.StartPoint + (myLine.StartPoint - myLine.EndPoint).GetNormal() * a;
  362.             wd.Geometry.CircularArc(myLine.StartPoint + perpVec * myLine.Length * 2.5 / mSize,
  363.                 myLine.StartPoint + (myLine.StartPoint - myLine.EndPoint).GetNormal() * (rad + a),
  364.                 myLine.StartPoint - perpVec * myLine.Length * 2.5 / mSize, ArcType.ArcSimple);
  365.             // Draw upper temperature marker (in red)
  366.             wd.SubEntityTraits.Color = 1;
  367.             posParam = startParam + (endParam - startParam) * (upperTemp / 100.0);
  368.             pts.Clear();
  369.             pts.Add(myLine.GetPointAtParameter(posParam) - perpVec * myLine.Length * 3 / mSize);
  370.             pts.Add(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 3 / mSize);
  371.             gsMarker = (System.IntPtr)3;
  372.             wd.Geometry.Polyline(pts, myLine.Normal, gsMarker);
  373.             wd.Geometry.Text(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 4 / mSize,
  374.                 myLine.Normal, perpVec, myLine.Length * 1.2 / mSize, 1, 0,
  375.                 "Max. Temp = " + upperTemp.ToString());
  376.             // Draw lower temperature marker (in blue)
  377.             wd.SubEntityTraits.Color = 5;
  378.             posParam = startParam + (endParam - startParam) * (lowerTemp / 100.0);
  379.             pts.Clear();
  380.             pts.Add(myLine.GetPointAtParameter(posParam) - perpVec * myLine.Length * 3 / mSize);
  381.             pts.Add(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 3 / mSize);
  382.             gsMarker = (System.IntPtr)3;
  383.             wd.Geometry.Polyline(pts, myLine.Normal, gsMarker);
  384.             wd.Geometry.Text(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 4 / mSize,
  385.                 myLine.Normal, perpVec, myLine.Length * 1.2 / mSize, 1, 0,
  386.                 "Min. Temp = " + lowerTemp.ToString());
  387.             // Draw current temperature marker in different color depending on position w.r.t. min and max temps
  388.             short colIndex = 0;
  389.             if (curTemp = upperTemp)
  390.             {
  391.                 colIndex = 1;
  392.                 // Red
  393.             }
  394.             else
  395.             {
  396.                 colIndex = 94;
  397.                 // Dark green
  398.             }
  399.             // Draw current Temperature marker
  400.             wd.SubEntityTraits.Color = colIndex;
  401.             posParam = startParam + (endParam - startParam) * (curTemp / 100.0);
  402.             pts.Clear();
  403.             pts.Add(myLine.GetPointAtParameter(posParam) - perpVec * myLine.Length * 3 / mSize);
  404.             pts.Add(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 3 / mSize);
  405.             gsMarker = (System.IntPtr)4;
  406.             wd.Geometry.Polyline(pts, myLine.Normal, gsMarker);
  407.             wd.Geometry.Text(myLine.GetPointAtParameter(posParam) + perpVec * myLine.Length * 4 / mSize,
  408.                 myLine.Normal, perpVec, myLine.Length * 1.2 / mSize, 1, 0,
  409.                 myText + " Temp = " + curTemp.ToString());
  410.             // We want to draw filled primitives (polygon and circle) to
  411.             // represent the mercury in the thermometer
  412.             wd.SubEntityTraits.FillType = FillType.FillAlways;
  413.             // drawable mercury - line first, then bowl
  414.             pts.Clear();
  415.             Vector3d offset = perpVec * myLine.Length / mSize;
  416.             Point3d pt1 = myLine.StartPoint + offset;
  417.             pts.Add(bowlCenter + offset);
  418.             pts.Add(bowlCenter - offset);
  419.             pts.Add(myLine.GetPointAtParameter(posParam) - offset);
  420.             pts.Add(myLine.GetPointAtParameter(posParam) + offset);
  421.             wd.Geometry.Polygon(pts);
  422.             // mercury bowl
  423.             theta = Math.PI / 6;
  424.             rad = 1.5 * (offset.Length) / Math.Sin(theta);
  425.             a = (offset.Length) / Math.Tan(theta);
  426.             wd.Geometry.Circle(bowlCenter, rad, myLine.Normal);
  427.             // Set old subentitytrait values, then call overriden class worlddraw fn
  428.             wd.SubEntityTraits.FillType = oldFillType;
  429.             wd.SubEntityTraits.Color = oldColIndex;
  430.             return base.WorldDraw(drawable, wd);
  431.         }
  432.     }
  433.     #endregion
  434.     #region "Implementation of the commands"
  435.     public class TestOverrule : IExtensionApplication
  436.     {
  437.         // Setup some global variables
  438.         static MyDrawOverrule mDrawOverrule;
  439.         // One and only instance of this DrawableOverrule
  440.         static MyGripOverrule mGripOverrule;
  441.         // One and only instance of this TransformOverrule
  442.         // Called when DLL is loaded by AutoCAD.
  443.         public void Initialize()
  444.         {
  445.             // Instantiate our global Overrule and set it to overrule lines with my data attached
  446.             mDrawOverrule = new MyDrawOverrule();
  447.             Overrule.AddOverrule(RXObject.GetClass(typeof(Line)), mDrawOverrule, false);
  448.             mDrawOverrule.SetExtensionDictionaryEntryFilter(HelperClass.GetSingleton.DictionaryName);
  449.             // Instantiate our global Overrule and set it to overrule lines with my data attached
  450.             mGripOverrule = new MyGripOverrule();
  451.             Overrule.AddOverrule(RXObject.GetClass(typeof(Line)), mGripOverrule, false);
  452.             mGripOverrule.SetExtensionDictionaryEntryFilter(HelperClass.GetSingleton.DictionaryName);
  453.             // Turn overruling on
  454.             Overrule.Overruling = true;
  455.         }
  456.         // Clean up after ourselves.
  457.         public void Terminate()
  458.         {
  459.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(Line)), mDrawOverrule);
  460.             mDrawOverrule = null;
  461.             Overrule.RemoveOverrule(RXObject.GetClass(typeof(Line)), mGripOverrule);
  462.             mDrawOverrule = null;
  463.         }
  464.         // Toggles all overrules on and off.
  465.         [CommandMethod("testoff")]
  466.         public void ToggleOverrule()
  467.         {
  468.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  469.             Overrule.Overruling = !Overrule.Overruling;
  470.             ed.WriteMessage("\n*** Overrule is now " + Overrule.Overruling.ToString() + " ***\n");
  471.             ed.Regen();
  472.         }
  473.         // Demo of Extension Dictionary filter.
  474.         // There's also an Xdata filter, but we won't demonstrate it here - its basically the same).
  475.         // This command needs tidying up to use HelperClass functions for XData access. (Currently does its own thing).
  476.         [CommandMethod("teston")]
  477.         public void AddXDictFilter()
  478.         {
  479.             // Select a line
  480.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  481.             PromptEntityOptions opts = new PromptEntityOptions("\nSelect a line to add Extension dictionary to:");
  482.             opts.SetRejectMessage("\nSorry dude! That's not a line\n");
  483.             opts.AddAllowedClass(typeof(Line), true);
  484.             PromptEntityResult res = ed.GetEntity(opts);
  485.             // Only continue if a circle was selected
  486.             if (res.Status != PromptStatus.OK)
  487.             {
  488.                 return;
  489.             }
  490.             // Open circle and make sure it has our dictionary in its extension dictionary
  491.             ObjectId objId = res.ObjectId;
  492.             Database db = objId.Database;
  493.             using (Transaction tr = db.TransactionManager.StartTransaction())
  494.             {
  495.                 Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
  496.                 ObjectId extId = ent.ExtensionDictionary;
  497.                 // Create ext dict if necessary
  498.                 if (extId == ObjectId.Null)
  499.                 {
  500.                     ent.UpgradeOpen();
  501.                     ent.CreateExtensionDictionary();
  502.                     extId = ent.ExtensionDictionary;
  503.                 }
  504.                 // Open ext dict
  505.                 DBDictionary extDict = (DBDictionary)tr.GetObject(extId, OpenMode.ForWrite);
  506.                 // make sure we clone data when entity is cloned for dragging
  507.                 extDict.TreatElementsAsHard = true;
  508.                 // If it doesn't contain our dictionary, we add one
  509.                 PromptIntegerOptions temp1Opts = new PromptIntegerOptions("\nEnter Lower Temperature:");
  510.                 PromptIntegerOptions temp2Opts = new PromptIntegerOptions("\nEnter Upper Temperature:");
  511.                 PromptIntegerOptions temp3Opts = new PromptIntegerOptions("\nEnter Current Temperature:");
  512.                 PromptStringOptions nameOpts = new PromptStringOptions("\nEnter Name:");
  513.                 temp1Opts.LowerLimit = 0;
  514.                 temp1Opts.UpperLimit = 100;
  515.                 temp2Opts.LowerLimit = 0;
  516.                 temp2Opts.UpperLimit = 100;
  517.                 temp3Opts.LowerLimit = 0;
  518.                 temp1Opts.UpperLimit = 100;                ObjectId xRecObjID;
  519.                 Xrecord xRec;
  520.                 DBDictionary myDict;
  521.                 if (!extDict.Contains(HelperClass.GetSingleton.XRecordName))
  522.                 {
  523.                     // If dict is not present, then we add it and set up default Xrec to be edited later
  524.                     extDict.UpgradeOpen();
  525.                     myDict = new DBDictionary();
  526.                     // make sure we clone data when entity is cloned for dragging
  527.                     myDict.TreatElementsAsHard = true;
  528.                     extDict.SetAt(HelperClass.GetSingleton.DictionaryName, myDict);
  529.                     tr.AddNewlyCreatedDBObject(myDict, true);
  530.                     temp1Opts.DefaultValue = 20;
  531.                     temp2Opts.DefaultValue = 30;
  532.                     temp3Opts.DefaultValue = 25;
  533.                     nameOpts.DefaultValue = "San Rafael";
  534.                     xRec = new Xrecord();
  535.                     xRec.Data = new ResultBuffer(new TypedValue((int)DxfCode.Text, nameOpts.DefaultValue),
  536.                         new TypedValue((int)DxfCode.Int32, temp1Opts.DefaultValue),
  537.                         new TypedValue((int)DxfCode.Int32, temp2Opts.DefaultValue),
  538.                         new TypedValue((int)DxfCode.Int32, temp3Opts.DefaultValue));
  539.                     xRecObjID = myDict.SetAt(HelperClass.GetSingleton.XRecordName, xRec);
  540.                     tr.AddNewlyCreatedDBObject(xRec, true);
  541.                 }
  542.                 else
  543.                 {
  544.                     // If dict exists, then we extract values from XRecord to populate default values from prompt
  545.                     // We're assuming that if my dictionary exists, then so will the XRecord in it.
  546.                     ObjectId dictId = extDict.GetAt(HelperClass.GetSingleton.DictionaryName);
  547.                     myDict = (DBDictionary)tr.GetObject(dictId, OpenMode.ForWrite, false);
  548.                     temp1Opts.DefaultValue = 20;
  549.                     temp1Opts.DefaultValue = 30;
  550.                     xRecObjID = myDict.GetAt(HelperClass.GetSingleton.XRecordName);
  551.                     xRec = (Xrecord)tr.GetObject(xRecObjID, OpenMode.ForRead, false);
  552.                 }
  553.                 // xRec now points to our XRecord, which is open for write.
  554.                 // Read Xrecord values to populate prompt defauls
  555.                 TypedValue[] typeValue = xRec.Data.AsArray();
  556.                 TypedValue val1 = typeValue[0];
  557.                 // Room name
  558.                 TypedValue val2 = typeValue[1];
  559.                 // Min temp
  560.                 TypedValue val3 = typeValue[2];
  561.                 // Max temp
  562.                 TypedValue val4 = typeValue[3];
  563.                 // Current temp
  564.                 nameOpts.DefaultValue = (String)val1.Value;
  565.                 temp1Opts.DefaultValue = (int)val2.Value;
  566.                 temp2Opts.DefaultValue = (int)val3.Value;
  567.                 temp3Opts.DefaultValue = (int)val4.Value;
  568.                 // Prompt for new values
  569.                 PromptResult nameRes = ed.GetString(nameOpts);
  570.                 if (nameRes.Status == PromptStatus.OK)
  571.                 {
  572.                     val1 = new TypedValue((int)DxfCode.Text, nameRes.StringResult);
  573.                 }
  574.                 PromptIntegerResult temp1Res = ed.GetInteger(temp1Opts);
  575.                 if (temp1Res.Status == PromptStatus.OK)
  576.                 {
  577.                     val2 = new TypedValue((int)DxfCode.Int32, temp1Res.Value);
  578.                 }
  579.                 PromptIntegerResult temp2Res = ed.GetInteger(temp2Opts);
  580.                 if (temp2Res.Status == PromptStatus.OK)
  581.                 {
  582.                     val3 = new TypedValue((int)DxfCode.Int32, temp2Res.Value);
  583.                 }
  584.                 PromptIntegerResult temp3Res = ed.GetInteger(temp3Opts);
  585.                 if (temp3Res.Status == PromptStatus.OK)
  586.                 {
  587.                     val4 = new TypedValue((int)DxfCode.Int32, temp3Res.Value);
  588.                 }
  589.                 // Now set Xrecord contents to new values
  590.                 xRec.Data = new ResultBuffer(val1, val2, val3, val4);
  591.                 tr.Commit();
  592.             }
  593.             // Display new results
  594.             ed.Regen();
  595.         }
  596.     }
  597.     #endregion
  598. }

回复

使用道具 举报

29

主题

503

帖子

8

银币

中流砥柱

Rank: 25

铜币
619
发表于 2009-5-14 23:51:00 | 显示全部楼层
问个问题,2010能不能存成低版本的,如果可以,存成低版本后,自定义实体会变成什么样子的,是否会消失?
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-15 07:45:00 | 显示全部楼层
可以存成低版本的,但别说存低版本,就是不加载Dll,Overrule就会还原
注意Overrule是规则重定义,采取的手段只是在现有的实体上附加数据(XData或LData),然后由dll读取数据解释为重定义后形式
感觉这一版的Overrule要么是自动桌子的一次尝试,可能下一版本会推出真的自定义实体(严重怀疑)
要么就是内部开发人员在Net这块出现了分歧,不打算支持自定义实体(自己猜的)
不过现阶段真正的自定义实体可以用ObjectArx实现,然后NetArx去调用
Overrule的用途现在想到的只有图纸加密:重要的东西规则重定义,别人没有我的Dll就看不见,:)
回复

使用道具 举报

1

主题

13

帖子

2

银币

初来乍到

Rank: 1

铜币
17
发表于 2009-7-24 09:59:00 | 显示全部楼层
GripOverrule...需要引用什么才可以用?
我用的是2008!
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-7-24 10:42:00 | 显示全部楼层
注意AutoCad要2010版本
回复

使用道具 举报

0

主题

4

帖子

2

银币

初来乍到

Rank: 1

铜币
4
发表于 2009-8-26 10:12:00 | 显示全部楼层
GripOverrule...需要引用什么才可以用?
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-1-31 12:47 , Processed in 0.254579 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表