找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

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

【求助】一个Catia二次开发的问题,大家帮忙看看

[复制链接]
跳转到指定楼层
1
发表于 2004-10-13 22:04:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我的程序现在通过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呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2004-10-18 08:49:29 | 只看该作者
个人认为:Automation于C++接口类是CAA的二种不同实现机制,实现的细节和方法也不同。因此二者并没有一对一的关系。同样的问题是JAVA与C++接口的对应?
3
发表于 2004-10-18 15:34:27 | 只看该作者
vontony说得有道理
4
发表于 2004-10-18 15:57:43 | 只看该作者
比如你要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;
5
发表于 2004-10-18 16:07:01 | 只看该作者
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;
6
发表于 2004-10-18 22:23:33 | 只看该作者
DragonSeraph wrote:  
  另外: 我在用某个类的QueryInterface(...)方法时,怎么知道该类能Query哪些Interfaces呢?  

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

本版积分规则

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

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

GMT+8, 2024-12-23 21:59 , Processed in 0.025746 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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