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

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

[实体对象] .NET版本的OPM(属性管理器)

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

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

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 14:41:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是C#代码:

  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.Windows.OPM;
  4. using System;
  5. using System.Reflection;
  6. using System.Runtime.InteropServices;
  7. namespace OPMNetSample
  8. {
  9.   #region Our Custom Property
  10.   [
  11.     Guid("F60AE3DA-0373-4d24-82D2-B2646517ABCB"),
  12.     ProgId("OPMNetSample.CustomProperty.1"),
  13.     // 这个类不会产生类接口,
  14.     // 没有接口被标识为缺省的。
  15.     // 要求用户通过此对象显式暴露的接口来暴露功能
  16.     // 这也就是说此对象只能暴露我们定义的接口
  17.     ClassInterface(ClassInterfaceType.None),
  18.     // 设置用来自动化的缺省COM接口。
  19.     // 类似于C#、C++和VB之类的语言允许你
  20.     //查询你所感兴趣的接口,但类似于javascript之类的只关心自动化的语言
  21.     //不允许查询接口并且只会产生缺省的接口。
  22.     ComDefaultInterface(typeof(IDynamicProperty2)),
  23.     ComVisible(true)
  24.   ]
  25.   public class CustomProp : IDynamicProperty2
  26.   {
  27.     private IDynamicPropertyNotify2 m_pSink = null;
  28.     // 唯一的属性ID
  29.     public void GetGUID(out Guid propGUID)
  30.     {
  31.       propGUID =
  32.         new Guid("F60AE3DA-0373-4d24-82D2-B2646517ABCB");
  33.     }
  34.     // 属性显示的名字
  35.     public void GetDisplayName(out string szName)
  36.     {
  37.       szName = "My integer property";
  38.     }
  39.     // 显示/隐藏OPM中的属性
  40.     public void IsPropertyEnabled(object pUnk, out int bEnabled)
  41.     {
  42.       bEnabled = 1;
  43.     }
  44.     // 属性是否显示为只读
  45.     public void IsPropertyReadOnly(out int bReadonly)
  46.     {
  47.       bReadonly = 0;
  48.     }
  49.     // 获取属性描述字符串
  50.     public void GetDescription(out string szName)
  51.     {
  52.       szName =
  53.         "This property is an integer";
  54.     }
  55.     // OPM通常会把这些显示在一个可编辑框中
  56.     // 可选:表示属性类型名称的元数据,如ACAD_ANGLE
  57.     public void GetCurrentValueName(out string szName)
  58.     {
  59.       throw new System.NotImplementedException();
  60.     }
  61.     // 属性类型What is the property type, ex. VT_R8
  62.     public void GetCurrentValueType(out ushort varType)
  63.     {
  64.       // 对于动态属性,属性管理器支持下列类型的数据:
  65.       // VT_I2, VT_I4, VT_R4, VT_R8,VT_BSTR, VT_BOOL
  66.       // 和 VT_USERDEFINED.
  67.       varType = 3; // VT_I4
  68.     }
  69.     // 获取属性值,输入参数为需要指定属性的对象
  70.     public void GetCurrentValueData(object pUnk, ref object pVarData)
  71.     {
  72.       // 获取值并返回给AutoCAD
  73.       // 因为我们上面说过值的类型是32位整数(VT_I4)
  74.       pVarData = (int)4;
  75.     }
  76.     // 设置属性值,输入参数为需要指定属性的对象
  77.     public void SetCurrentValueData(object pUnk, ref object varData)
  78.     {
  79.       // 保存返回给你值
  80.       //因为我们上面说过值的类型是32位整数(VT_I4)
  81.       int myVal = (int)varData;
  82.     }
  83.     // OPM传递实现自定义属性的IDynamicPropertyNotify接口,
  84.     // 你通知OPM你的属性值改变了
  85.     public void Connect(object pSink)
  86.     {
  87.       m_pSink = (IDynamicPropertyNotify2)pSink;
  88.     }
  89.     public void Disconnect() {
  90.       m_pSink = null;
  91.     }
  92.   }
  93.   #endregion
  94.   #region Application Entry Point
  95.   public class MyEntryPoint : IExtensionApplication
  96.   {
  97.     protected internal CustomProp custProp = null;
  98.     public void Initialize()
  99.     {
  100.       Assembly.LoadFrom("asdkOPMNetExt.dll");
  101.       // 添加动态属性
  102.       Dictionary classDict = SystemObjects.ClassDictionary;
  103.       RXClass lineDesc = (RXClass)classDict.At("AcDbLine");
  104.       IPropertyManager2 pPropMan =
  105.         (IPropertyManager2)xOPM.xGET_OPMPROPERTY_MANAGER(lineDesc);
  106.       custProp = new CustomProp();
  107.       pPropMan.AddProperty((object)custProp);
  108.     }
  109.     public void Terminate()
  110.     {
  111.       // 移除动态属性
  112.       Dictionary classDict = SystemObjects.ClassDictionary;
  113.       RXClass lineDesc = (RXClass)classDict.At("AcDbLine");
  114.       IPropertyManager2 pPropMan =
  115.         (IPropertyManager2)xOPM.xGET_OPMPROPERTY_MANAGER(lineDesc);
  116.       pPropMan.RemoveProperty((object)custProp);
  117.       custProp = null;
  118.     }
  119.   }
  120.   #endregion
  121. }
复制代码
代码中需要说明的一些问题:
代码定义了一个自定义动态属性(CustomProp),因此我们需要一个唯一的GUID,然后实现了不同的回调函数来表示属性的名字、类型、描述和可写性,也定义了获取和设置属性值的函数。对应于本例,我们的属性叫做“My integer property”,那么猜猜看它表示什么?——它是一个整型值,值被硬编码为4。当然我们没有通过这个属性来存储数据,但在初建的应用程序中,你可能会让它存储扩展数据、扩展记录或外部数据库。
在接下来的代码中,我们定义了一些函数,用于在这个模块被装载和AutoCAD退出时被调用。我们使用了Initialize()回调函数来装载我们的C++混合编程的模块(asdkOPMNetExt.dll),然后初始化我们的属性并把它附加到直线对象上去。
编译程序并装载DLL,请确保属性面板是可见的(使用PROPS命令或者双击直线对象),选择一条直线,你会看到下图所示的动态属性。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对
工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 11:14

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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