找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1326|回复: 13

[弹指神通]:OPM的实现,希望对大家有所帮助

[复制链接]
发表于 2004-5-8 18:12:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
OPM在arx的开发中有重要的用途。本文简要描述如何实现自定义实体的OPM,看了好几天才看明白呀。和大家交流交流了。

第一步:定义自定义实体
        自定义实体应该以*.dbx文件作为输出文件
        dbx中的自定义实体和arx中自定义实体的写法相同。

第二步:定义好了一个自定义实体后,在vc中建立一个ALT工程。(同arx的例程AsdkSquareWrapper一样了,这里不

       多说,这里参照讲解的代码都取自AsdkSquareWrapper例程)
       这里先介绍一下相关的知识。
       CAD系统已经预定义了一些属性的分类,以PROPCAT_为前缀的就是。数值范围是-1~-25。所以用户自己定义的分类不要用这些数字。
       AsdkSquareWrapper.h中有如下代码。
       BEGIN_OPMPROP_MAP()
           OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, \
             0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
           OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, \
             0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
       END_OPMPROP_MAP()

       这段代码说明,自定义的属性有2个类,你需要自己分类的属性也有2个。一类是PROPCAT_Data,另一类是PROPCAT_Geometry,0x00000001和0x00000003是分别属性的DISPID。如果不定义上面的代码,那么新的属性将被系统按照通用属性处理。当然,如果有多个属性要放到1个类中就多写几行就可以了。比如有3个属性被分到PROPCAT_Data
类中,你就写3行  
       OPMPROP_ENTRY(0, 编号, PROPCAT_Data, \
             0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "") 那么这3个属性就都会显示在data类中了。

       当用户选择自定义实体时COM的标准接口会调用这段代码,当用户的属性分类不属于系统自定义的分类时,
       系统就会调用在OPM中必须实现的一个函数GetCategoryName()函数,在这个函数中根据用户的要求加入自己的属性分类。
      AsdkSquareWrapper例程中,我想把Squaresize分类改到SQSize类中。只要做如下修改
      BEGIN_OPMPROP_MAP()
         OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, \
            0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
         OPMPROP_ENTRY(0, 0x00000002, 1, \
            0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
         OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, \
            0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
      END_OPMPROP_MAP()        //加入了一个属性,DISPID是0x00000002,分类号是1

     当执行这段代码时,cad发现1不是他预定义的分类,所以执行GetCategoryName获得分类的名称
     所以我们改写GetCategoryName函数
    在头文件中改为
   STDMETHODIMP GetCategoryName(
                           /* [in]  */ PROPCAT propcat,
                           /* [in]  */ LCID lcid,
                           /* [out] */ BSTR* pbstrName);
   cpp文件中改为
    STDMETHODIMP CAsdkSquareWrapper::GetCategoryName(
                           /* [in]  */ PROPCAT propcat,
                           /* [in]  */ LCID lcid,
                           /* [out] */ BSTR* pbstrName)
    {
     if (propcat == 1)
     {
      *pbstrName = ::SysAllocString(L"SQSize");
      return S_OK;
     }
     else
      return S_FALSE;
    }
    注意看原来例程的写法,按照那个写法程序不会调用这个函数。我也不知道为什么。
   
    执行完这个函数后,GetElementStrings函数被调用。
    这个函数的作用就是分解复杂的属性,如当你所描述的属性是一个点时,你需要将x,y,z的坐标同时显示在属性窗
    口中。 这个函数就是你实现如何分解这些属性。当然也可以不实现它。
    AsdkSquareWrapper例程里没写清楚地好像就是这些了。我的表达能力不好,希望大家能看明白。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-8 22:04:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
谢谢楼上的兄弟!我以前也研究过,但是没什么成果。有空了还是想再看看,我觉得用它给自己的程序“锦上添花”很不错!
希望继续研究,再接再厉!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-8 23:07:52 | 显示全部楼层
什么是OPM?有什么用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-5-9 09:21:17 | 显示全部楼层
对象属性管理器
作用就是,你自定义的实体被选中后,你可以在CAD的属性窗口中修改它的属性
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-5-9 13:04:48 | 显示全部楼层
quickly


看文字还是不是很理解 有没有自己研究的例程? OPM觉得应该是一个很好东东
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-5-9 13:14:00 | 显示全部楼层
自己没写,拿AsdkSquareWrapper改的。主要是把《Autocad objectarx 2000》没说清楚的地方补充了一些。程序的改动都在上面写了。如果不懂的话看看这本书吧,另外还要先学习一下com技术
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-3 13:32:32 | 显示全部楼层
关于AsdkSquareWrapper例程中的GetCategoryName函数, 在自己实现这个函数时,注意要去掉头文件的 “{ return S_FALSE;}”。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-18 13:45:53 | 显示全部楼层
楼主是强人
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-12-16 10:52:24 | 显示全部楼层
MapPropertyToPage(DISPID dispID,CLSID*pclsid))是将dispID代表的属性,映射到由pclsid指定的属性页,我的自定义实体用了这个接口后,属性右边是出现了一个按钮,但点按钮后没反应,不知道还要什么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-11-2 22:37:35 | 显示全部楼层
请问GetElementStrings函数在什么情况会被调用呢?我写的程序不会被调用,不知道为什么,请教各位.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-11-3 12:01:21 | 显示全部楼层
GetElementStrings
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-11-13 15:49:47 | 显示全部楼层
开眼界了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-11-17 17:56:38 | 显示全部楼层
收藏了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-11-20 00:54:07 | 显示全部楼层
不错,支持一下!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-12 10:41 , Processed in 0.290657 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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