找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 22269|回复: 20
打印 上一主题 下一主题

[CAA] 关于CATIA消息响应(CATAttrNotification)

[复制链接]
跳转到指定楼层
1
发表于 2007-2-4 11:54:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

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

x
CATIA装配模块中, 当前打开的是product. 如果用户删除了其某一个组件. 通过消息响应获得其删除组件的名字(partNumber, instanceName) .
这里用的 CATAttrNotification 消息.

现在的问题是, 无法获得删除组件的名字?  
CATAttrNotification  方法: GetAttribute()  .  能否从 CATISpecAttribute 获得到 CATIProduct(被删除的组件) ?

代码如下:
......
CATIProduct_var spRootProduct = spSpec;
CATISpecEvents_var spEvents = spRootProduct ;   
MyEventSubscriber* pMyEventSubscriber = new MyEventSubscriber;
hr = ::AddCallback(pMyEventSubscriber ,
                               spEvents->GetCallbackManager(),
                               spEvents->GetAttrStructNotification(),
                               (CATSubscriberMethod)&MyEventSubscriber::OnDelete,
                  NULL);
......

void MyEventSubscriber::OnDelete    (  CATCallbackEvent  iPublishedEvent,
                                                   void             *ipPublishingObject,
                                            CATNotification  *ipPublishNotification,
                                    CATSubscriberData iUsefulData,
                                    CATCallback       iCallbackId )
{
   //这里的notification 为 CATAttrNotification
CATAttrNotification *pNot = (CATAttrNotification *)ipPublishNotification;
CATBaseUnknown_var pAttr = pNot->GetAttribute( );
CATISpecAttribute_var spSpecAttr = pAttr;
....
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 赞一下!赞一下!
2
发表于 2007-2-4 16:04:00 | 只看该作者
为何不用
spEvents->GetDeleteNotification(),
CATDeleteNotification *pNot = CATDeleteNotification *)ipPublishNotification;
CATBaseUnknown_var pAttr = pNot->GetObject();
这样应该更直接
另外:
hr = ::AddCallback(pMyEventSubscriber ,
                               spEvents->GetCallbackManager(),
                               spEvents->GetAttrStructNotification(),
                               (CATSubscriberMethod)&MyEventSubscriber::OnDelete,
                  NULL);
spEvents->GetCallbackManager()替换为spEvents行不行,我没有用过所以想请教。
3
发表于 2007-2-4 20:30:55 | 只看该作者
原帖由 horizan 于 2007-2-4 16:04 发表
为何不用
spEvents->GetDeleteNotification(),
CATDeleteNotification *pNot = CATDeleteNotification *)ipPublishNotification;
CATBaseUnknown_var pAttr = pNot->GetObject();
这样应该更直接


这样不可以. 因为我现在是删除product下的组件, 而不是删除该product.  
4
发表于 2007-2-5 12:38:37 | 只看该作者
哦,我的错,期待你的Demo共享。
5
发表于 2007-2-5 16:31:43 | 只看该作者
CATAttrNotification  是继承CATSpecNotification的, CATSpecNotification有个方法GetObject,按照CAA文档的解释:
Returns the impacted object (created, modified or deleted according to the notification type).
也许是你要的,但我没试过.
6
发表于 2007-2-6 11:19:28 | 只看该作者
原帖由 xyzhu 于 2007-2-5 16:31 发表
CATAttrNotification  是继承CATSpecNotification的, CATSpecNotification有个方法GetObject,按照CAA文档的解释:
Returns the impacted object (created, modified or deleted according to the notification ty ...


can't get object!   我都试过了.  这里是源代码 demo

to xyzhu:  CATCommandHeaderCommandStartedEvt 有什么方法,属性, 头文件? 我这里查不到

[ 本帖最后由 hick 于 2007-2-6 12:31 编辑 ]

本帖子中包含更多资源

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

x
7
发表于 2007-2-6 12:11:33 | 只看该作者
得到的消息是操作以后的消息,删除以后就不是specobject了,也许这是原因。
8
发表于 2007-2-6 12:46:03 | 只看该作者
试了你的test wprkspace了

或许你也已经发现当你添加一个组件的时候,可以取到instanace name.
而当你del掉它的时候,你的OnDel是在它被删除后被呼叫的,所以自然得不到它的point,

以前做ds的mold的replace的时候,遇到过类似问题,
我们想replace前后的组件里,如果有同名同类型的parameter,就保持它们的值不变
但ds的replace是 del then create, 后来我们就做了自己的replace, create then del, 在先做个新的组件,然后从旧组件里把值取过来后在del掉它
后来ds在R17之后,开始把一部分mold的replace改成create then del了。
9
发表于 2007-2-6 13:37:03 | 只看该作者
确实如此, 添加组件可以获得,删除就无法获得.  并且只能是direct children. 孙节点就不可以.
难道只能在属性改变(添加或者删除了组件)后, 必须遍历获得root product下所有组件all children. 然后对每个组件 addcallback它的GetDeleteNotification() ?   进行跌代?  或者不断比较all children list, 找出前后不同之处, 以此来判断用户删除的对象?

o GetAttribute()
Returns the concerned attribute.   这个方法有什么用?  从attribute 是无法获得到删除的对象吗?

[ 本帖最后由 hick 于 2007-2-6 13:49 编辑 ]
10
发表于 2007-2-6 19:40:49 | 只看该作者
有个笨方法

在addin里给每个asmproduct添加feature extension, 把他们的children的alias name以unicodestring形式保存

添加了children或删除后,你的ondel()会被呼叫,里头检测是否多了还是少了孩子,多了就登记,少了就注销对应的extension,并且显示warning dialog

但restriction太多,漏洞也太多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-24 20:36 , Processed in 0.040888 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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