iCAx开思网

标题: [CAA]如何捕获CATIA事件 [打印本页]

作者: hick    时间: 2007-1-18 12:14
标题: [CAA]如何捕获CATIA事件
外部程序如何捕获CATIA事件消息,  例如 CATDeleteNotification ?
作者: cupcake    时间: 2007-1-18 13:15
不懂,帮忙顶,请高手指点
作者: hick    时间: 2007-1-21 23:02
AddCallBack or CATIMessageReceiver  or  CATICommunicator  ?

自己顶顶, 还是没解决.

高手过来看看
作者: nctusdk    时间: 2007-1-22 00:08
應該是::AddCallBack沒錯...只是不知道publisher該填什麼才好...也許試試看NULL吧...
我也沒用過...~.~



超久沒回來這裡看看了啦~
沒想到hick變版主了...

這段時間還是有在做CAA的開發...
不過一忙起來就忘記常上來了...

時間過的真快啊
作者: wuwenwu    时间: 2007-1-22 10:59
版主的问题怎么没人顶呢?
作者: hick    时间: 2007-1-22 14:30
nctusdk 兄,

确实是好久不见了,应该毕业了吧, 现在都在忙啥呢

唉,应工作需要,偶尔还做些catia的开发,
在这里逛的时间长了, 就是斑竹了. 比我厉害的高手多了去了,只是没我上网时间多而已.


addcallback, 嗯, 这个问题我研究了有些时间了,依然没解决


继续顶, 翘首期盼高手指点
作者: cupcake    时间: 2007-1-22 15:05
Send/Receive
CallBack
BackBone
三者的区别和联系是什么?
期盼高手告知
作者: horizan    时间: 2007-1-22 17:24
感觉CATIA消息有两种方式:
1、利用CATICommunicator来进行消息的传播,SendRequect来发布,AssociateHandler来获取。这种方式实际时一个向特定的另一方发表消息,类似于通知。
2、利用CATCallbackmanager来dispatchCallback,利用AddCallback来获取消息。这种方式实际是一方接听特定的另一方的消息。类似于广播。
实际上两种方式都要有sender和receiver。但是不知道楼主要求的向外部程序提供消息行不行,因为CAA把消息封装了,如何进行的封装不了解。
作者: horizan    时间: 2007-1-24 11:59
正常情况下,可以Addcallback到所有CATIA消息,但是有些消息的Publisher和消息名称需要查,Publisher用NUll肯定不行,因为每个消息有自己的Publisher;有些消息名也不好查,如鼠标移动的消息,只有鼠标移过某个组件或命令的消息,没有本身移动的消息,非常的奇怪。
作者: hick    时间: 2007-1-24 13:16
addcallback ,有消息的Publisher和消息名称. 但是如果用addcallback, 我该放在什么地方呢, 该有个地方来调用初始化他才可以。
作者: horizan    时间: 2007-1-24 18:27
原帖由 hick 于 2007-1-24 13:16 发表
addcallback ,有消息的Publisher和消息名称. 但是如果用addcallback, 我该放在什么地方呢, 该有个地方来调用初始化他才可以。

这个问题的答案是在你需要的地方。比如说,你自己定义了一个Class专门来添加 callback,以及处理消息。你可以在一个cmd的初始化函数中处理它,要知道你在Addin方式或其它方式添加Workshop/Workbench的时候会注册这个cmd,它就会同时将你的Class的一个实例创建出来,完成你的设定。当然你还可以在你需要的地方AdCallback。
不过我有一个问题,addcallback后,系统是否还能得到这个消息,也就是说是否现在你的callback托管了系统的这个消息?
作者: xyzhu    时间: 2007-1-24 22:30
我试了一下,用AddCallback应该可以:

#include <TIE_CATIPRDWorkshopAddin.h>
TIE_CATIPRDWorkshopAddin(MyAddin);

#include <TIE_CATIAssyWorkBenchAddin.h>
TIE_CATIAssyWorkBenchAddin(MyAddin);

在CreateCommands中:

CATCommandHeader * pAfrDeleteHeader = NULL;
HRESULT hr = ::CATAfrGetCommandHeader("CATAfrDeleteHdr", pAfrDeleteHeader);
if(NULL == pAfrDeleteHeader)
        std::cout << "null header\n";
MyEventSubscriber* pMyEventSubscriber = new MyEventSubscriber;
//add callback
hr = ::AddCallback(pMyEventSubscriber ,pAfrDeleteHeader,
                "CATCommandHeaderCommandStartedEvt",
                (CATSubscriberMethod)&MyEventSubscriber::OnDelete,
                NULL);

MyEventSubscriber是一个继承CATBaseUnknown的类. 别忘了在dico中加入相应的Addin接口.
作者: horizan    时间: 2007-1-25 10:57
事实上,例程CAAObjectModelBase里面有相关的代码。
Add...CB在重复使用在同一个消息上的时候,两个处理函数都将执行。因此,AddCallback或Add...CB只是注册了消息处理函数,没有托管系统消息,自己注册消息处理函数可能(没有测试过)会在系统处理之前完成。
作者: hick    时间: 2007-1-25 18:47
xyzhu, 照你说的做, 为什么我的代码就不可以呢?  或许错在什么地方

MyEventSubscriber.h

class MyEventSubscriber: public CATBaseUnknown
{
  CATDeclareClass;

  public:

  // Standard constructors and destructors
  // -------------------------------------
     MyEventSubscriber ();
     virtual ~MyEventSubscriber ();

void OnDelete    (CATCallbackEvent  iPublishedEvent,
                           void             *ipPublishingObject,
                           CATNotification  *ipPublishNotification,
                           CATSubscriberData iUsefulData,
                           CATCallback       iCallbackId );

  // Copy constructor and equal operator
  // -----------------------------------
  MyEventSubscriber (MyEventSubscriber &);
  MyEventSubscriber& operator=(MyEventSubscriber&);

};

void MyEventSubscriber::OnDelete    (  CATCallbackEvent  iPublishedEvent,
                                     void             *ipPublishingObject,
                                              CATNotification  *ipPublishNotification,
                                                     CATSubscriberData iUsefulData,
                                                  CATCallback       iCallbackId )
{
      cout<<"OK, Delete"<<endl;

}

addin中用的你的代码,CreateCommands 执行正确.

[ 本帖最后由 hick 于 2007-1-26 13:29 编辑 ]
作者: horizan    时间: 2007-1-27 14:44
To hick:
hr = ::AddCallback(pMyEventSubscriber ,pAfrDeleteHeader,
                "CATCommandHeaderCommandStartedEvt",
                (CATSubscriberMethod)&MyEventSubscriber::OnDelete,
                NULL);
其中的"CATCommandHeaderCommandStartedEvt"应该替换为你所要Callback的消息,比如CATCommanderHeader::Actived()。
你的Callback没有执行,可能就是你的这个参数给的不对。
作者: xyzhu    时间: 2007-1-29 17:00
试试加入CATIPrsConfigurationAddin
作者: hick    时间: 2007-1-30 17:44
To horizan :
  同样的addcallback,我如果做个extension impl, 就运行正确,可以获得删除消息. 所以应该不是addcallback参数的问题

To xyzhu:
  换个addin接口,依然存在同样的问题.应该和addin没多大关系.不过我可以试下CATIPrsConfigurationAddin


非常感谢俩位!
作者: horizan    时间: 2007-1-30 19:55
直接addcallback的情况,我这里可以获得消息,没有问题。
搞不懂了。
作者: hick    时间: 2007-2-1 19:16
唉. 我也服了自己了, 陷入一个误区

改了个addin , CATIAssyWorkBenchAddin .  就可以监听我需要的消息了

再次感谢以上各位的热心帮助
作者: walkerjiang    时间: 2012-6-18 15:46
十分精彩,我想请问CATCommandHeaderCommandStartedEvt这个我怎么查不到?
作者: luolizhuiyuyun    时间: 2012-7-5 17:19
各位高手好,我想用实现一个用鼠标实现拖拽某个产品进行定位的功能,是鼠标长按,拖着Product,松开鼠标时,零件就定位在新的位置了。
如何实现?
多谢各位高手,现在做课题
作者: 青春的风    时间: 2012-7-5 20:59

作者: banyacaizi    时间: 2013-11-15 19:01
xyzhu 发表于 2007-1-24 22:30
我试了一下,用AddCallback应该可以:

#include

兄弟,用鼠标在一个dialog上画直线,该如何将鼠标按下、弹起消息得到?





欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3