CATIA Automation 编程初探
最近开始对 CATIA 进行一些自动化的开发,本来想找 CAA 来进行研究,可惜一直没时间和机会去找,暂时就利用 CATIA Automation 来开发了。
由于利用 VB 或 VB.NET 将CATIA 脚本转化为程序确实方便,不过利用C++来操作更适合于我这种开发者。
方法有好多种,这里以画圆作为一个简单例子。
1 利用 IDispatch 接口来编程
- HRESULT hr;
- CLSID AppClsid;
- IDispatch *pApp;
- ::CoInitialize(NULL);
- //
- ::CLSIDFromProgID (L"CATIA.Application", &AppClsid); //get the unique id of CATIA
- //
- hr = CoCreateInstance(AppClsid,NULL,CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pApp);
- VARIANT result, buffer;
- VariantInit(&result);
- VARIANT arg2;
- VariantInit(&arg2);
- arg2.vt = VT_BOOL;
- arg2.boolVal = TRUE;
- hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, pApp, L"Visible", 1, arg2);
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pApp, L"Documents", 0);//here there is no argument, so we put 0
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *documents = buffer.pdispVal;
- VARIANT arg1;
- VariantInit(&arg1);
- arg1.vt = VT_BSTR;
- arg1.bstrVal = ::SysAllocString(L"Part");
- //VARIANT result, buffer;
- VariantInit(&result);
- hr = AutoWrap(DISPATCH_METHOD, &result, documents, L"Add", 1 , arg1);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *partDocument = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, partDocument, L"Part", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *part = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Bodies", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *bodies = buffer.pdispVal;
- //
- VARIANT arg;
- VariantInit(&arg);
- arg.vt = VT_BSTR;
- arg.bstrVal = ::SysAllocString(L"PartBody");
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, bodies, L"Item", 1, arg);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *body = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, body, L"Sketches", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *sketches1 = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"OriginElements", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *originElements = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, originElements, L"PlaneXY", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *reference1 = buffer.pdispVal;
- //
- VARIANT arg3;
- VariantInit(&arg3);
- arg3.vt = VT_DISPATCH;
- arg3.pdispVal = reference1;
- hr = AutoWrap(DISPATCH_METHOD, &result, sketches1, L"Add", 1, arg3);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *sketch1 = buffer.pdispVal;
- //SAFEARRAY * psa;
- //SAFEARRAYBOUND rgsabound[1];
- //rgsabound[0].lLbound = 0;
- //rgsabound[0].cElements = 9;
- //psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
- //
- //hr = SafeArrayAccessData(psa);
- //hr = SafeArrayUnaccessData(psa);
- //VARIANT array;
- //VariantInit(&array);
- //array.vt = VT_ARRAY;
- //array.pparray = &psa;
- //
- //hr = AutoWrap(DISPATCH_METHOD, &result, sketch1, L"SetAbsoluteAxisData", 1, array);
- VARIANT arg4;
- VariantInit(&arg4);
- arg4.vt = VT_DISPATCH;
- arg4.pdispVal = sketch1;
- hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, part, L"InWorkObject", 1, arg4);
- //buffer.vt = VT_DISPATCH;
- //buffer.pdispVal = result.pdispVal;
- //IDispatch *sketch1 = buffer.pdispVal;
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"OpenEdition", 0);
- buffer.vt = VT_DISPATCH;
- buffer.pdispVal = result.pdispVal;
- IDispatch *factory2D1 = buffer.pdispVal;
- //
- VARIANT a1, a2, a3;
- VariantInit(&a1);
- VariantInit(&a2);
- VariantInit(&a3);
- a1.vt = VT_R4;a1.fltVal = 50.f;
- a2.vt = VT_R4;a2.fltVal = 0.f;
- a3.vt = VT_R4;a3.fltVal = 0.f;
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, factory2D1, L"CreateClosedCircle", 3, a1, a2, a3);
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"CloseEdition", 0);
- //
- hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Update", 0);
- if (pApp) pApp->Release();
- ::CoUninitialize();
HRESULT hr;CLSID AppClsid;IDispatch *pApp;::CoInitialize(NULL);//::CLSIDFromProgID (L"CATIA.Application", &AppClsid); //get the unique id of CATIA//hr = CoCreateInstance(AppClsid,NULL,CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pApp);VARIANT result, buffer;VariantInit(&result);VARIANT arg2;VariantInit(&arg2);arg2.vt = VT_BOOL;arg2.boolVal = TRUE;hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, pApp, L"Visible", 1, arg2);hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pApp, L"Documents", 0);//here there is no argument, so we put 0buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *documents = buffer.pdispVal;VARIANT arg1;VariantInit(&arg1);arg1.vt = VT_BSTR;arg1.bstrVal = ::SysAllocString(L"Part");//VARIANT result, buffer;VariantInit(&result);hr = AutoWrap(DISPATCH_METHOD, &result, documents, L"Add", 1 , arg1);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *partDocument = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, partDocument, L"Part", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *part = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Bodies", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *bodies = buffer.pdispVal;//VARIANT arg;VariantInit(&arg);arg.vt = VT_BSTR;arg.bstrVal = ::SysAllocString(L"PartBody");hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, bodies, L"Item", 1, arg);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *body = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, body, L"Sketches", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *sketches1 = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"OriginElements", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *originElements = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, originElements, L"PlaneXY", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *reference1 = buffer.pdispVal;//VARIANT arg3;VariantInit(&arg3);arg3.vt = VT_DISPATCH;arg3.pdispVal = reference1;hr = AutoWrap(DISPATCH_METHOD, &result, sketches1, L"Add", 1, arg3);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *sketch1 = buffer.pdispVal;//SAFEARRAY * psa;//SAFEARRAYBOUND rgsabound[1];//rgsabound[0].lLbound = 0;//rgsabound[0].cElements = 9;//psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);////hr = SafeArrayAccessData(psa);//hr = SafeArrayUnaccessData(psa);//VARIANT array;//VariantInit(&array);//array.vt = VT_ARRAY;//array.pparray = &psa;////hr = AutoWrap(DISPATCH_METHOD, &result, sketch1, L"SetAbsoluteAxisData", 1, array);VARIANT arg4;VariantInit(&arg4);arg4.vt = VT_DISPATCH;arg4.pdispVal = sketch1;hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, part, L"InWorkObject", 1, arg4);//buffer.vt = VT_DISPATCH;//buffer.pdispVal = result.pdispVal;//IDispatch *sketch1 = buffer.pdispVal;//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"OpenEdition", 0);buffer.vt = VT_DISPATCH;buffer.pdispVal = result.pdispVal;IDispatch *factory2D1 = buffer.pdispVal;//VARIANT a1, a2, a3;VariantInit(&a1);VariantInit(&a2);VariantInit(&a3);a1.vt = VT_R4;a1.fltVal = 50.f;a2.vt = VT_R4;a2.fltVal = 0.f;a3.vt = VT_R4;a3.fltVal = 0.f;hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, factory2D1, L"CreateClosedCircle", 3, a1, a2, a3);//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"CloseEdition", 0);//hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Update", 0);if (pApp) pApp->Release();::CoUninitialize();
2 利用CATIA自带的TLB转化成 tlh/tli 来编程
先用VC的 #import 功能进行转化,主要的几个 TLB 为:
InfTypeLib.tlb
KweTypeLib.tlb
PSTypeLib.tlb
MecModTypeLib.tlb
CATGitTypeLib.tlb
试验的 CATIA V5 R18 版本在转换之后有些小错误,之后就可以方便地写代码了。VC6的话,需要把转换后的UTF8编码文件转换成ANSI。
- int main(int argc, char* argv[])
- {
- ::CoInitialize(NULL);
- ApplicationPtr catia;
- HRESULT hr = S_OK;
- hr = catia.GetActiveObject("CATIA.Application");
- if (FAILED(hr))
- {
- hr = catia.CreateInstance("CATIA.Application");
- }
- catia->PutVisible(VARIANT_TRUE);
- //
- DocumentsPtr documents;
- documents = catia->GetDocuments();
- BSTR AddPart = _com_util::ConvertStringToBSTR("Part");
- PartDocumentPtr partDocument;
- partDocument = documents->Add(&AddPart);
- PartPtr part = partDocument->GetPart();
- BodiesPtr bodies = part->GetBodies();
- BodyPtr body = part->GetMainBody();
- HybridBodiesPtr hybridBodies = part->GetHybridBodies();
- FactoryPtr shapeFactory = part->GetShapeFactory();
- HybridShapeFactoryPtr hybridShapeFactory = part->GetHybridShapeFactory();
- SketchesPtr sketches = body->GetSketches();
- OriginElementsPtr originElements = part->GetOriginElements();
- AnyObjectPtr planeXY = originElements->GetPlaneXY();
- ReferencePtr r1 = part->CreateReferenceFromObject(planeXY);
- SketchPtr sketch = sketches->Add(r1);
- part->PutInWorkObject(sketch);
- Factory2DPtr factory2D = sketch->OpenEdition();
- factory2D->CreateClosedCircle(0.0, 0.0, 50.0);
- sketch->CloseEdition();
- part->Update();
- ::CoUninitialize();
- return 0;
- }
int main(int argc, char* argv[])
{::CoInitialize(NULL);ApplicationPtr catia;HRESULT hr = S_OK;hr = catia.GetActiveObject("CATIA.Application");if (FAILED(hr)){hr = catia.CreateInstance("CATIA.Application");}catia->PutVisible(VARIANT_TRUE);//DocumentsPtr documents;documents = catia->GetDocuments();BSTR AddPart = _com_util::ConvertStringToBSTR("Part");PartDocumentPtr partDocument;partDocument = documents->Add(&AddPart);PartPtr part = partDocument->GetPart();BodiesPtr bodies = part->GetBodies();BodyPtr body = part->GetMainBody();HybridBodiesPtr hybridBodies = part->GetHybridBodies();FactoryPtr shapeFactory = part->GetShapeFactory();HybridShapeFactoryPtr hybridShapeFactory = part->GetHybridShapeFactory();SketchesPtr sketches = body->GetSketches();OriginElementsPtr originElements = part->GetOriginElements();AnyObjectPtr planeXY = originElements->GetPlaneXY();ReferencePtr r1 = part->CreateReferenceFromObject(planeXY);SketchPtr sketch = sketches->Add(r1);part->PutInWorkObject(sketch);Factory2DPtr factory2D = sketch->OpenEdition();factory2D->CreateClosedCircle(0.0, 0.0, 50.0);sketch->CloseEdition();part->Update();::CoUninitialize();return 0;
}
3 利用 CAA
还没有找到CAA安装程序,以后再续
CATIA Automation 编程初探相关推荐
- 小丸子函数式编程初探
小丸子函数式编程初探 小丸子函数式编程初探 question 函数式编程 命令式编程 vs 函数式编程 高阶函数 实用小栗子 1. question 前一个项目,顺利完成的时候感觉特别棒.但是后面需求 ...
- CATIA 数控编程加工实例精解视频教程
CATIA V5R20数控编程加工实例精解视频教程 链接:https://pan.baidu.com/s/11Z86OLCAakazUoCRc8P7RA 提取码:ygbu
- ASP.NET CORE 第四篇 依赖注入IoC学习 + AOP界面编程初探
原文作者:老张的哲学 更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjo ...
- 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探...
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- 函数式编程语言python-函数式编程初探
诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注. 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang.clojur ...
- Java动态编程初探——Javassist
最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...
- Javascript 面向对象编程初探(一)--- 封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...
- C/C++与Matlab混合编程初探
Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab ...
- 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探
在上篇博文中,我们编写了一个可以输出不同几何类型的小程序.通过C语言的struct结构体,给大家感受了下,对象的大概样子. 如果用Obejctive-C的面向对象的特征来实现.那么,drawShape ...
最新文章
- FCN模型训练中遇到的困难
- Iterator 和 Iterable的区别
- Spring 中经典的 9 种设计模式,打死也要记住啊!
- 栈,队列,单链表,双向链表
- java编译器jdk版本_以编程方式确定Java类的JDK编译版本
- PHPUnit安装、用法、测试(三)
- PID控制器开发笔记之一:PID算法原理及基本实现
- python——文本简单可逆加密
- efi引导文件_你们心心念念的oc通用EFI来了!
- h5页面预览pdf文件_H5移动端在线浏览pdf文件,推荐插件TouchPDF
- jsp中给div加背景_web前端入门到实战:详解css3如何给背景图片加颜色遮罩
- (MathType)LaTeX风格公式样式
- matlab数字仿真实验,matlab数值仿真
- 【计算机视觉】数字图像处理(五)—— 图像的退化与复原
- 如何从键盘键入字符串c语言scanf,输入字符串的格式要求 用scanf输入字符型数据时,输入的格式要注意什么?...
- 在ubuntu创建快捷方式
- 阿里云服务器使用宝塔面板管理以及项目部署
- 长尾理论 推荐系统长尾理论
- linux安装qq(deb文件)
- 显卡简介,显卡怎么查看