明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15511|回复: 30

[重定义] [原创]用C#体会自定义实体的强大(2010年6月21日更新)

  [复制链接]
发表于 2010-5-23 14:29 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2010-6-21 8:16:49 编辑

自定义实体一直是ARX专利(现在还是),但我们还是可以在C#中体会它的强大。运行前请引用附件中的DLL,运行环境:AutoCAD 2008。
2010年6月21日更新:添加了一个新的DLL,可用于CAD2010及以上版本。
  1. using System;
  2. using Autodesk.ahlzl;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.Runtime;
  8. namespace CS_调用
  9. {
  10.     public class Class1
  11.     {
  12.         [CommandMethod("T1")] // 创建自定义实体
  13.         public void Test1()
  14.         {
  15.             Mgtriangle ent = new Mgtriangle();
  16.             ent.Direction = Vector3d.XAxis;
  17.             ent.CrankAngle = Math.PI / 6;
  18.             ent.CrankCenPt = new Point3d(100.0, 0.0, 0.0);
  19.             ent.CrankRadius = 10.0;
  20.             ent.LinkLength = 30.0;
  21.             ent.PistonSize = 5.0;
  22.             AppendEntity(ent);
  23.         }
  24.         [CommandMethod("T2")] // 编辑自定义实体
  25.         public void Test2()
  26.         {
  27.             Database db = HostApplicationServices.WorkingDatabase;
  28.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  29.             PromptEntityOptions opt = new PromptEntityOptions("\n请选择Mgtriangle自定义实体");
  30.             opt.SetRejectMessage("您选择的不是Mgtriangle自定义实体,请重新选择!");
  31.             opt.AddAllowedClass(typeof(Mgtriangle), true);
  32.             PromptEntityResult res = ed.GetEntity(opt);
  33.             if (res.Status != PromptStatus.OK)
  34.             {
  35.                 return;
  36.             }
  37.             using (Transaction trans = db.TransactionManager.StartTransaction())
  38.             {
  39.                 Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);
  40.                 ed.WriteMessage("\n您选择的对象是:" + ent.GetType().Name + ", 请您添加代码修改自定义实体!");
  41.             }   
  42.         }
  43.         private ObjectId AppendEntity(Entity ent)
  44.         {
  45.             ObjectId entId;
  46.             Database db = HostApplicationServices.WorkingDatabase;
  47.             using (Transaction trans = db.TransactionManager.StartTransaction())
  48.             {
  49.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,
  50.                     OpenMode.ForRead);
  51.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject
  52.                     (bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  53.                 entId = btr.AppendEntity(ent);
  54.                 trans.AddNewlyCreatedDBObject(ent, true);
  55.                 trans.Commit();
  56.             }
  57.             return entId;
  58.         }
  59.     }
  60. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +1 明经币 +2 金钱 +20 贡献 +5 激情 +5 收起 理由
雪山飞狐_lzh + 1 + 2 + 20 + 5 + 5 【精华】好程序

查看全部评分

发表于 2019-11-19 08:50 | 显示全部楼层
ahlzl 发表于 2010-5-23 20:28
这是学习SDK(\entity\SimpleSquare)的成果,以前没解决的问题是:Mgtriangle ent = (Mgtriangle)trans.Ge ...

因为获取的是数据库文档,类型不统一,所以需要强制转换类型
发表于 2019-10-15 17:42 | 显示全部楼层
不错  支持一下  
发表于 2019-10-29 21:34 | 显示全部楼层
为什么没有后续的更新了
发表于 2010-5-23 15:31 | 显示全部楼层

老卢,牛啊!

重定义要做的像自定义一样强大就好了

发表于 2010-5-23 15:38 | 显示全部楼层
好东西,下来学习一下.
 楼主| 发表于 2010-5-23 15:38 | 显示全部楼层

这是一个“子实体”例子,各部分颜色不同,拖动夹点时的效果很爽。

另,感觉重定义也能搞出这效果。

发表于 2010-5-23 20:09 | 显示全部楼层

重定义确实可以实现,不过属性框里显示的还是原实体

想办法把Cad的属性框用自己的偷换掉,应该就差不多了,呵呵

 楼主| 发表于 2010-5-23 20:28 | 显示全部楼层
这是学习SDK(\entity\SimpleSquare)的成果,以前没解决的问题是:Mgtriangle ent = (Mgtriangle)trans.GetObject(res.ObjectId, OpenMode.ForWrite);转换会失败(小狼也碰到过类似的情况)。
发表于 2010-5-25 21:43 | 显示全部楼层

老兄,能提供自定义实体的代码吗。

 楼主| 发表于 2010-5-25 22:22 | 显示全部楼层
代码,请看SDK的例子:\samples\entity\SimpleSquare
发表于 2010-5-29 17:13 | 显示全部楼层
运行出错。提示
有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.MissingFieldException: 找不到字段:“Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace”。
   在 SimpleSquareUI.SquareCommands.JigSquare()
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   在 System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 AcMgPerDocumentCommandClass.Invoke(AcMgPerDocumentCommandClass* , gcroot<System::Reflection::MethodInfo __gc \*>* mi)
   在 Autodesk.AutoCAD.Runtime.SEHExceptionFilter.InvokeWorker()
   在 Autodesk.AutoCAD.Runtime.ExceptionFilter.Invoke()


************** 已加载的程序集 **************
mscorlib
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3603 (GDR.050727-3600)
    基本代码: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
AcDbMgdHost
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/AcdbMgdHost.DLL
----------------------------------------
System
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Xml
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Drawing
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Windows.Forms
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
acmgd
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/acmgd.DLL
----------------------------------------
acdbmgd
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/acdbmgd.DLL
----------------------------------------
AcDxUi
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/AcDxUi.DLL
----------------------------------------
AcDx
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/AcDx.DLL
----------------------------------------
AcDxUi.resources
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/zh-CN/AcDxUi.resources.DLL
----------------------------------------
AcMgdShared
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/AcMgdShared.DLL
----------------------------------------
AcLayer
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/AcLayer.DLL
----------------------------------------
AcLayer.resources
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/zh-CN/AcLayer.resources.DLL
----------------------------------------
Microsoft.VisualC
    程序集版本: 8.0.0.0
    Win32 版本: 8.00.50727.3053
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualC/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualC.dll
----------------------------------------
BzLocation
    程序集版本: 16.2.54.0
    Win32 版本: 16.2.54.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/BzLocation.DLL
----------------------------------------
PROJECTPOINTCLIENTLib
    程序集版本: 1.0.0.0
    Win32 版本: 6.1.1158.0
    基本代码: file:///D:/Program%20Files/AutoCAD%202006/PROJECTPOINTCLIENTLib.DLL
----------------------------------------
SimpleSquareUI
    程序集版本: 0.0.0.0
    Win32 版本: 0.0.0.0
    基本代码: file:///F:/资料/ObjectARX_2008_32Bit/samples/entity/SimpleSquare/SimpleSquareUI/bin/Debug/SimpleSquareUI.dll
----------------------------------------
Microsoft.VisualBasic
    程序集版本: 8.0.0.0
    Win32 版本: 8.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
mscorlib.resources
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3603 (GDR.050727-3600)
    基本代码: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Windows.Forms.resources
    程序集版本: 2.0.0.0
    Win32 版本: 2.0.50727.3053 (netfxsp.050727-3000)
    基本代码: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHS_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** JIT 调试 **************
要启用实时(JIT)调试,
该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
jitDebugging 值。
编译应用程序时还必须启用
调试。

例如: 

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

启用 JIT 调试后,任何无法处理的异常
都将被发送到在此计算机上注册的 JIT 调试器,
而不是由此对话框处理。

我用的2008sdk中的例子。用vs2008+cad2006
 楼主| 发表于 2010-5-29 22:13 | 显示全部楼层

CAD2006,不行。

要VS2005 + CAD07、08、09或VS2008SP1 + CAD10、11

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 00:33 , Processed in 0.307659 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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