![]() |
【转帖】.net版本的opm(属性管理器)终于来了! - 精华帖集合
.net版本的opm(属性管理器)终于来了! - 精华帖集合
.net版本的opm(属性管理器)终于来了! 翻译自kean的博客: 下面是c#代码(程序中展示的示例程序和需要用到的opm.net的dll请到附件中下载): using autodesk.autocad.applicationservices; using autodesk.autocad.runtime; using autodesk.autocad.windows.opm; using system; using system.reflection; using system.runtime.interopservices; namespace opmnetsample { #region our custom property [ guid("f60ae3da-0373-4d24-82d2-b2646517abcb"), progid("opmnetsample.customproperty.1"), // 这个类不会产生类接口, // 没有接口被标识为缺省的。 // 要求用户通过此对象显式暴露的接口来暴露功能 // 这也就是说此对象只能暴露我们定义的接口 classinterface(classinterfacetype.none), // 设置用来自动化的缺省com接口。 // 类似于c#、c++和vb之类的语言允许你 //查询你所感兴趣的接口,但类似于javascript之类的只关心自动化的语言 //不允许查询接口并且只会产生缺省的接口。 comdefaultinterface(typeof(idynamicproperty2)), comvisible(true) ] public class customprop : idynamicproperty2 { private idynamicpropertynotify2 m_psink = null; // 唯一的属性id public void getguid(out guid propguid) { propguid = new guid("f60ae3da-0373-4d24-82d2-b2646517abcb"); } // 属性显示的名字 public void getdisplayname(out string szname) { szname = "my integer property"; } // 显示/隐藏opm中的属性 public void ispropertyenabled(object punk, out int benabled) { benabled = 1; } // 属性是否显示为只读 public void ispropertyreadonly(out int breadonly) { breadonly = 0; } // 获取属性描述字符串 public void getdescription(out string szname) { szname = "this property is an integer"; } // opm通常会把这些显示在一个可编辑框中 // 可选:表示属性类型名称的元数据,如acad_angle public void getcurrentvaluename(out string szname) { throw new system.notimplementedexception(); } // 属性类型what is the property type, ex. vt_r8 public void getcurrentvaluetype(out ushort vartype) { // 对于动态属性,属性管理器支持下列类型的数据: // vt_i2, vt_i4, vt_r4, vt_r8,vt_bstr, vt_bool // 和 vt_userdefined. vartype = 3; // vt_i4 } // 获取属性值,输入参数为需要指定属性的对象 public void getcurrentvaluedata(object punk, ref object pvardata) { // 获取值并返回给autocad // 因为我们上面说过值的类型是32位整数(vt_i4) pvardata = (int)4; } // 设置属性值,输入参数为需要指定属性的对象 public void setcurrentvaluedata(object punk, ref object vardata) { // 保存返回给你值 //因为我们上面说过值的类型是32位整数(vt_i4) int myval = (int)vardata; } // opm传递实现自定义属性的idynamicpropertynotify接口, // 你通知opm你的属性值改变了 public void connect(object psink) { m_psink = (idynamicpropertynotify2)psink; } public void disconnect() { m_psink = null; } } #endregion #region application entry point public class myentrypoint : iextensionapplication { protected internal customprop custprop = null; public void initialize() { assembly.loadfrom("asdkopmnetext.dll"); // 添加动态属性 dictionary classdict = systemobjects.classdictionary; rxclass linedesc = (rxclass)classdict.at("acdbline"); ipropertymanager2 ppropman = (ipropertymanager2)xopm.xget_opmproperty_manager(linedesc); custprop = new customprop(); ppropman.addproperty((object)custprop); } public void terminate() { // 移除动态属性 dictionary classdict = systemobjects.classdictionary; rxclass linedesc = (rxclass)classdict.at("acdbline"); ipropertymanager2 ppropman = (ipropertymanager2)xopm.xget_opmproperty_manager(linedesc); ppropman.removeproperty((object)custprop); custprop = null; } } #endregion } 复制代码 代码中需要说明的一些问题: 代码定义了一个自定义动态属性(customprop),因此我们需要一个唯一的guid,然后实现了不同的回调函数来表示属性的名字、类型、描述和可写性,也定义了获取和设置属性值的函数。对应于本例,我们的属性叫做“my integer property”,那么猜猜看它表示什么?——它是一个整型值,值被硬编码为4。当然我们没有通过这个属性来存储数据,但在初建的应用程序中,你可能会让它存储扩展数据、扩展记录或外部数据库。 在接下来的代码中,我们定义了一些函数,用于在这个模块被装载和autocad退出时被调用。我们使用了initialize()回调函数来装载我们的c++混合编程的模块(asdkopmnetext.dll),然后初始化我们的属性并把它附加到直线对象上去。 编译程序并装载dll,请确保属性面板是可见的(使用props命令或者双击直线对象),选择一条直线,你会看到下图所示的动态属性。 如果你没有看到动态属性,那么可能是程序调用asdkopmnetext.dll的出现了问题:你需要把asdkopmnetext.dll放到autocad安装目录下。 下载次数:67 9-3-17 08:44 am 才鸟老大发的帖子,必看 c#开发 收藏了 真是太好了,我正在找相关资料。 太好了,真的等了很久了 不知道2010是不是自带了啊? 希望不要再像这样打补丁了,麻烦 这个是支持哪个版本的cad啊? 还是通吃?? 那个新增加的属性值如果想把它保存在实体(实例中是一条直线)的扩展数据中,我如何获得这个实体(直线)的id? 强啊,顶起。。 我学故我在 |
所有的时间均为北京时间。 现在的时间是 04:45 AM. |