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

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 22267|回复: 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 分享淘帖 赞一下!赞一下!
21
发表于 2007-4-29 11:53:46 | 只看该作者
我想响应文档保存消息,请问AddCallback参数应该怎么给呢?以下是我的代码,请高手指教。
CATCommandHeader * pAfrSaveHeader = NULL;
HRESULT hr = ::CATAfrGetCommandHeader("CATAfrFileSaveHdr", pAfrSaveHeader);
MyEventSubscriber* pMyEventSubscriber = new MyEventSubscriber;
hr = ::AddCallback(pMyEventSubscriber ,pAfrSaveHeader,
                "CATCommandHeaderCommandStartedEvt",
                (CATSubscriberMethod)&MyEventSubscriber::OnSave,
                NULL);
20
发表于 2007-2-8 10:18:06 | 只看该作者
"CATCommandHeaderCommandStartedEvt"是CATCommandHeader宏CATDeclareCb(CommandStarted)的展开。
惭愧呀,偶压根没有想到去callback到delete这个command,还是太嫩了。
向xyzhu, acoka学习!
19
发表于 2007-2-7 21:24:06 | 只看该作者
非常感谢xyzhu, acoka ,horizan(排名不分先后, )

确实是用, CATCommandHeaderCommandStartedEvt + CATHSO. 可以满足我的要求,解决问题!

先前放弃了CATCommandHeaderCommandStartedEvt ,是因为对这个事件不了解,手头查不到这个事件任何方法说明. 既然start是在active之前,
HSO是应该可以捕获到用户选择的对象

现在用这个方法已经可以解决问题了,也许还有别的方法....

再次感谢各位的大力热心帮助
18
发表于 2007-2-7 20:42:21 | 只看该作者
可以用呀,只要你不坚持用attribute变化的notify

稍微修改一下就可以用

本帖子中包含更多资源

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

x
17
发表于 2007-2-7 19:28:53 | 只看该作者
要我说干脆Entention接口lifeCyCleObject.
16
发表于 2007-2-7 19:21:01 | 只看该作者
CommandStarted必须对应的是CommandHeader,而一个SpecObject根本没有这个Event。
15
发表于 2007-2-7 17:48:43 | 只看该作者
这个OnDelete响应的是CATCommandHeaderCommandStartedEvt,这时Delete应该还未被执行,因为事件CATCommandHeaderActivateEvt在CATCommandHeaderCommandStartedEvt之后产生.
14
发表于 2007-2-7 17:23:27 | 只看该作者
这个ondel是在del完成后被呼叫的
object已经没了,取它的属性是不可能的吧

最好的解决方法就是可以找到一个catia在delete之前会先呼叫的断点
(CATIMechnicalCPP里的CanBeDel()会在被删除前呼叫,但MechnicalPart或ASMProduct好像没有这个I/F)
但即使有,这个东西也只是被呼叫来确认这个obj是不是被禁止删除,而不保证呼叫后它会被删除
13
发表于 2007-2-7 16:34:43 | 只看该作者
Use the highlighting:

void MySubscriber::OnDelete(CATCallbackEvent iEvent,
                void *iFrom,
                CATNotification *iNotification, //CATCommandHeaderCommandStartedEvt
                CATSubscriberData iData,
                CATCallback iCallBack)
{
        CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor();
        if(pEditor)
        {
                CATHSO* pHso = pEditor->GetHSO();
                if(pHso)
                {
                        int size = pHso->GetSize();
                        if(size)
                        {
                                CATBaseUnknown* pBase = (*pHso)[0];
                                CATPathElement* pPath = (CATPathElement*)pBase;
                                if(pPath)               
                                {
                                        size = pPath->GetSize();
                                        for(int i=0; i<size; i++)
                                        {
                                                CATIProduct_var spPrd ((*pPath));
                                                if(!!spPrd)
                                                {
                                                        CATUnicodeString instName;
                                                        spPrd->GetPrdInstanceName(instName);
                                                        std::cout << "Delete: " << instName.ConvertToChar() << std::endl;
                                                }
                                        }
                                }
                        }
                }
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2024-12-24 07:50 , Processed in 0.032982 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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