最近开始对 CATIA 进行一些自动化的开发,本来想找 CAA 来进行研究,可惜一直没时间和机会去找,暂时就利用 CATIA  Automation 来开发了。

由于利用 VB 或 VB.NET 将CATIA 脚本转化为程序确实方便,不过利用C++来操作更适合于我这种开发者。

方法有好多种,这里以画圆作为一个简单例子。

1 利用 IDispatch 接口来编程

[cpp] view plain copy print ?
  1. HRESULT hr;
  2. CLSID AppClsid;
  3. IDispatch *pApp;
  4. ::CoInitialize(NULL);
  5. //
  6. ::CLSIDFromProgID (L"CATIA.Application", &AppClsid); //get the unique id of CATIA
  7. //
  8. hr = CoCreateInstance(AppClsid,NULL,CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pApp);
  9. VARIANT result, buffer;
  10. VariantInit(&result);
  11. VARIANT arg2;
  12. VariantInit(&arg2);
  13. arg2.vt = VT_BOOL;
  14. arg2.boolVal = TRUE;
  15. hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, pApp, L"Visible", 1, arg2);
  16. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pApp, L"Documents", 0);//here there is no argument, so we put 0
  17. buffer.vt = VT_DISPATCH;
  18. buffer.pdispVal = result.pdispVal;
  19. IDispatch *documents = buffer.pdispVal;
  20. VARIANT arg1;
  21. VariantInit(&arg1);
  22. arg1.vt = VT_BSTR;
  23. arg1.bstrVal = ::SysAllocString(L"Part");
  24. //VARIANT result, buffer;
  25. VariantInit(&result);
  26. hr = AutoWrap(DISPATCH_METHOD, &result, documents, L"Add", 1 , arg1);
  27. buffer.vt = VT_DISPATCH;
  28. buffer.pdispVal = result.pdispVal;
  29. IDispatch *partDocument = buffer.pdispVal;
  30. //
  31. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, partDocument, L"Part", 0);
  32. buffer.vt = VT_DISPATCH;
  33. buffer.pdispVal = result.pdispVal;
  34. IDispatch *part = buffer.pdispVal;
  35. //
  36. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Bodies", 0);
  37. buffer.vt = VT_DISPATCH;
  38. buffer.pdispVal = result.pdispVal;
  39. IDispatch *bodies = buffer.pdispVal;
  40. //
  41. VARIANT arg;
  42. VariantInit(&arg);
  43. arg.vt = VT_BSTR;
  44. arg.bstrVal = ::SysAllocString(L"PartBody");
  45. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, bodies, L"Item", 1, arg);
  46. buffer.vt = VT_DISPATCH;
  47. buffer.pdispVal = result.pdispVal;
  48. IDispatch *body = buffer.pdispVal;
  49. //
  50. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, body, L"Sketches", 0);
  51. buffer.vt = VT_DISPATCH;
  52. buffer.pdispVal = result.pdispVal;
  53. IDispatch *sketches1 = buffer.pdispVal;
  54. //
  55. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"OriginElements", 0);
  56. buffer.vt = VT_DISPATCH;
  57. buffer.pdispVal = result.pdispVal;
  58. IDispatch *originElements = buffer.pdispVal;
  59. //
  60. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, originElements, L"PlaneXY", 0);
  61. buffer.vt = VT_DISPATCH;
  62. buffer.pdispVal = result.pdispVal;
  63. IDispatch *reference1 = buffer.pdispVal;
  64. //
  65. VARIANT arg3;
  66. VariantInit(&arg3);
  67. arg3.vt = VT_DISPATCH;
  68. arg3.pdispVal = reference1;
  69. hr = AutoWrap(DISPATCH_METHOD, &result, sketches1, L"Add", 1, arg3);
  70. buffer.vt = VT_DISPATCH;
  71. buffer.pdispVal = result.pdispVal;
  72. IDispatch *sketch1 = buffer.pdispVal;
  73. //SAFEARRAY * psa;
  74. //SAFEARRAYBOUND rgsabound[1];
  75. //rgsabound[0].lLbound = 0;
  76. //rgsabound[0].cElements = 9;
  77. //psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
  78. //
  79. //hr = SafeArrayAccessData(psa);
  80. //hr = SafeArrayUnaccessData(psa);
  81. //VARIANT array;
  82. //VariantInit(&array);
  83. //array.vt = VT_ARRAY;
  84. //array.pparray = &psa;
  85. //
  86. //hr = AutoWrap(DISPATCH_METHOD, &result, sketch1, L"SetAbsoluteAxisData", 1, array);
  87. VARIANT arg4;
  88. VariantInit(&arg4);
  89. arg4.vt = VT_DISPATCH;
  90. arg4.pdispVal = sketch1;
  91. hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, part, L"InWorkObject", 1, arg4);
  92. //buffer.vt = VT_DISPATCH;
  93. //buffer.pdispVal = result.pdispVal;
  94. //IDispatch *sketch1 = buffer.pdispVal;
  95. //
  96. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"OpenEdition", 0);
  97. buffer.vt = VT_DISPATCH;
  98. buffer.pdispVal = result.pdispVal;
  99. IDispatch *factory2D1 = buffer.pdispVal;
  100. //
  101. VARIANT a1, a2, a3;
  102. VariantInit(&a1);
  103. VariantInit(&a2);
  104. VariantInit(&a3);
  105. a1.vt = VT_R4;a1.fltVal = 50.f;
  106. a2.vt = VT_R4;a2.fltVal = 0.f;
  107. a3.vt = VT_R4;a3.fltVal = 0.f;
  108. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, factory2D1, L"CreateClosedCircle", 3, a1, a2, a3);
  109. //
  110. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"CloseEdition", 0);
  111. //
  112. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Update", 0);
  113. if (pApp) pApp->Release();
  114. ::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。

[cpp] view plain copy print ?
  1. int main(int argc, char* argv[])
  2. {
  3. ::CoInitialize(NULL);
  4. ApplicationPtr catia;
  5. HRESULT hr = S_OK;
  6. hr = catia.GetActiveObject("CATIA.Application");
  7. if (FAILED(hr))
  8. {
  9. hr = catia.CreateInstance("CATIA.Application");
  10. }
  11. catia->PutVisible(VARIANT_TRUE);
  12. //
  13. DocumentsPtr documents;
  14. documents = catia->GetDocuments();
  15. BSTR AddPart = _com_util::ConvertStringToBSTR("Part");
  16. PartDocumentPtr partDocument;
  17. partDocument = documents->Add(&AddPart);
  18. PartPtr part = partDocument->GetPart();
  19. BodiesPtr bodies = part->GetBodies();
  20. BodyPtr body = part->GetMainBody();
  21. HybridBodiesPtr hybridBodies = part->GetHybridBodies();
  22. FactoryPtr shapeFactory = part->GetShapeFactory();
  23. HybridShapeFactoryPtr hybridShapeFactory = part->GetHybridShapeFactory();
  24. SketchesPtr sketches = body->GetSketches();
  25. OriginElementsPtr originElements = part->GetOriginElements();
  26. AnyObjectPtr planeXY = originElements->GetPlaneXY();
  27. ReferencePtr r1 = part->CreateReferenceFromObject(planeXY);
  28. SketchPtr sketch = sketches->Add(r1);
  29. part->PutInWorkObject(sketch);
  30. Factory2DPtr factory2D = sketch->OpenEdition();
  31. factory2D->CreateClosedCircle(0.0, 0.0, 50.0);
  32. sketch->CloseEdition();
  33. part->Update();
  34. ::CoUninitialize();
  35. return 0;
  36. }
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 编程初探相关推荐

  1. 小丸子函数式编程初探

    小丸子函数式编程初探 小丸子函数式编程初探 question 函数式编程 命令式编程 vs 函数式编程 高阶函数 实用小栗子 1. question 前一个项目,顺利完成的时候感觉特别棒.但是后面需求 ...

  2. CATIA 数控编程加工实例精解视频教程

    CATIA V5R20数控编程加工实例精解视频教程 链接:https://pan.baidu.com/s/11Z86OLCAakazUoCRc8P7RA 提取码:ygbu

  3. ASP.NET CORE 第四篇 依赖注入IoC学习 + AOP界面编程初探

    原文作者:老张的哲学 更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjo ...

  4. 从壹开始前后端分离【 .NET Core2.2 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探...

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  5. 函数式编程语言python-函数式编程初探

    诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注. 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang.clojur ...

  6. Java动态编程初探——Javassist

    最近需要通过配置生成代码,减少重复编码和维护成本.用到了一些动态的特性,和大家分享下心得. 我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不 ...

  7. Javascript 面向对象编程初探(一)--- 封装

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  8. C/C++与Matlab混合编程初探

    Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab ...

  9. 《objective-c基础教程》学习笔记(四)—— OC面向对象编程初探

    在上篇博文中,我们编写了一个可以输出不同几何类型的小程序.通过C语言的struct结构体,给大家感受了下,对象的大概样子. 如果用Obejctive-C的面向对象的特征来实现.那么,drawShape ...

最新文章

  1. FCN模型训练中遇到的困难
  2. Iterator 和 Iterable的区别
  3. Spring 中经典的 9 种设计模式,打死也要记住啊!
  4. 栈,队列,单链表,双向链表
  5. java编译器jdk版本_以编程方式确定Java类的JDK编译版本
  6. PHPUnit安装、用法、测试(三)
  7. PID控制器开发笔记之一:PID算法原理及基本实现
  8. python——文本简单可逆加密
  9. efi引导文件_你们心心念念的oc通用EFI来了!
  10. h5页面预览pdf文件_H5移动端在线浏览pdf文件,推荐插件TouchPDF
  11. jsp中给div加背景_web前端入门到实战:详解css3如何给背景图片加颜色遮罩
  12. (MathType)LaTeX风格公式样式
  13. matlab数字仿真实验,matlab数值仿真
  14. 【计算机视觉】数字图像处理(五)—— 图像的退化与复原
  15. 如何从键盘键入字符串c语言scanf,输入字符串的格式要求 用scanf输入字符型数据时,输入的格式要注意什么?...
  16. 在ubuntu创建快捷方式
  17. 阿里云服务器使用宝塔面板管理以及项目部署
  18. 长尾理论 推荐系统长尾理论
  19. linux安装qq(deb文件)
  20. 显卡简介,显卡怎么查看

热门文章

  1. 协作图(Collaboration diagram)——UML之图七
  2. Windows解决端口占用问题 Port xxxx was already in use
  3. laravel8 改变分页样式
  4. android 粗体字体下载,徐静蕾加粗字体
  5. [转帖]Photoshop制作梦幻效果婚纱照片
  6. 一文带你看懂微信小程序费率怎么收
  7. 如何让android的service一直在后台运行
  8. SQL注入—跨库注入
  9. HTML,CSS,JS实现网页聊天窗口
  10. Linux中的tail命令