iCAx开思工具箱

标题: 【求助】一个Catia二次开发的问题,大家帮忙看看 [打印本页]

作者: DragonSeraph    时间: 2004-10-13 22:04
标题: 【求助】一个Catia二次开发的问题,大家帮忙看看
我的程序现在通过Automation的方式(我用的C++,不是  
VB),能够启动Catia,并且能依次得到Catia的各级Automation对象:CATIAApplication->CATIADocuments  
->CATIADocument->CATIAPart。这些Automation的C++对象不同于CAA C++ API里提供的对象,比如说在CAA C++ API文档里我能  
看到的是CATDocument类而不是CATIADocument(在Catia的安装目录下,"CATDocument.h"位于  
B13\ObjectModelerBase\PublicInterfaces目录下,而"CATIADocument.h"位B13\InfInterfaces  
\PublicGenerated\intel_a目录下),同样对应零件的类CAA C++ API文档里是CATIPrtPart而不是  
CATIAPart(在Catia的安装目录下,"CATIPrtPart.h"位于B13\MecModInterfaces\PublicInterfaces  
目录下,而"CATIAPart.h"位B13\MecModInterfaces\PublicGenerated\intel_a目录下)。  
  
现在我需要从那些我已经得到的Automation对象中得到CAA C++ API提供的对象:CATDocument或者CATIPrtPart。我试过用CATIADocument和CATIAPart的QueryInterface(IID_CATIPrtPart,...)方法,看上去都没有成功。不知道大家有什么高见?  
  
另外: 我在用某个类的QueryInterface(...)方法时,怎么知道该类能Query哪些Interfaces呢?
作者: vontony    时间: 2004-10-18 08:49
个人认为:Automation于C++接口类是CAA的二种不同实现机制,实现的细节和方法也不同。因此二者并没有一对一的关系。同样的问题是JAVA与C++接口的对应?
作者: acoka    时间: 2004-10-18 15:34
vontony说得有道理
作者: acoka    时间: 2004-10-18 15:57
比如你要CATDocument
  
  HRESULT rc = S_OK;
  CATDocument* pDocument = NULL;
  do {
    CATFrmEditor* pEditor = GetEditor();
    if( !pEditor ) {
      break;
    }
    CATILinkableObject* pILinkableOnActive = NULL;
    rc = pEditor->GetUIActiveObject().Search(
      IID_CATILinkableObject,
      (void**)&pILinkableOnActive
    );
    if( FAILED(rc) || !pILinkableOnActive ) {
      break;
    }
    pDocument = pILinkableOnActive->GetDocument();
    pILinkableOnActive->Release();
    pILinkableOnActive = NULL;
  } while(FALSE);
  return pDocument;
作者: acoka    时间: 2004-10-18 16:07
CATIPrtPart了话
  
  CATIPrtPart_var spPart = NULL_var;
  do {
    CATIContainer_var spContainer = NULL_var;
    CATFrmEditor* pEditor = GetEditor();
    if( !pEditor ) {
      break;
    }
    CATISpecObject* pISpecOnActive = NULL;
    rc = pEditor->GetUIActiveObject().Search(
      IID_CATISpecObject,
      (void**)&pISpecOnActive
    );
    if( FAILED(rc) || !pISpecOnActive ) {
      break;
    }
    spContainer = pISpecOnActive->GetFeatContainer();
    pISpecOnActive->Release();
    pISpecOnActive = NULL;
    if( !spContainer ) {
      break;
    }
    CATIPrtContainer_var spPrtContainer = spContainer;
    if( !spPrtContainer ) {
      break;
    }
    spPart = spPrtContainer->GetPart();
  } while(FALSE);
  return spPart;
作者: cms_nuaa    时间: 2004-10-18 22:23
DragonSeraph wrote:  
  另外: 我在用某个类的QueryInterface(...)方法时,怎么知道该类能Query哪些Interfaces呢?  

  
这个问题我也早就想问了。对一些Interfaces不知道如何得到,这里有没有比较一般的规律?
作者: acoka    时间: 2004-10-19 11:00
举个简单例子
你画了个pad,它是个CATISpecObject
你对它按右键的contect menu里有copy,paste,等选项吧
你就可以对它query这些选项对应的interface
作者: DragonSeraph    时间: 2004-10-21 02:38
大家说得有道理,我也发现Automation的 API(C++)和CAA C++ API 不能混用,因为Automation的对象都集成了com对象的特征。看来要在Automation中调用CAA C++ API 写的dll,只能为这些dll编写Automation接口了。不知道大家有没有这方面的经验。
作者: acoka    时间: 2004-10-21 12:21
你可以用IDL
用C++建个automation IDL framework
这样可以用VB调用c++的函数了
作者: DragonSeraph    时间: 2004-10-23 03:30
用VC++可以调用吗?我一直用的VC++
  
对了acoka,你写过IDL吗?




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3