© 博学网 (Boxue58)

 Forgot password?
 注册register
Search
View: 5426|Reply: 1
Collapse the left

.NET版本的OPM(属性管理器)珍贵资料

[Copy link]
Post time 2009-6-6 10:15:04 | Show all posts |Read mode

I want to Be A member...

You have to Login for download or view attachment(s). No Account? Register

x
下面是C#代码(程序中展示的示例程序和需要用到的OPM.NET的DLL请到附件中下载):
  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. }
Copy the Code
复制代码代码中需要说明的一些问题:
代码定义了一个自定义动态属性(CustomProp),因此我们需要一个唯一的GUID,然后实现了不同的回调函数来表示属性的名字、类型、描述和可写性,也定义了获取和设置属性值的函数。对应于本例,我们的属性叫做“My integer property”,那么猜猜看它表示什么?——它是一个整型值,值被硬编码为4。当然我们没有通过这个属性来存储数据,但在初建的应用程序中,你可能会让它存储扩展数据、扩展记录或外部数据库。
在接下来的代码中,我们定义了一些函数,用于在这个模块被装载和AutoCAD退出时被调用。我们使用了Initialize()回调函数来装载我们的C++混合编程的模块(asdkOPMNetExt.dll),然后初始化我们的属性并把它附加到直线对象上去。
编译程序并装载DLL,请确保属性面板是可见的(使用PROPS命令或者双击直线对象),选择一条直线,你会看到下图所示的动态属性。

                               
Login/Register to enlarge


如果你没有看到动态属性,那么可能是程序调用asdkOPMNetExt.dll的出现了问题:你需要把asdkOPMNetExt.dll放到AutoCAD安装目录下。

opm.net.zip

89 KB, Downloads: 3

Post time 2018-2-8 13:41:00 | Show all posts
下载不了,还专门花钱注册了呢
You have to log in before you can reply Login | 注册register

Points Rules

QQ|Dark|Moble|博学网 (Boxue58/Boxuesky) ( wechat: boxuesky )

2020-9-27 16:01 GMT+8

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

Quick Reply To Top Return to the list