几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-14, 02:33 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】.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?
强啊,顶起。。
我学故我在
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 05:37 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多