CATIA Automation 编程初探

来源:互联网 发布:淘宝店铺装修百度视频 编辑:程序博客网 时间:2024/05/02 01:45

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

 

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

 

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

 

1 利用 IDispatch 接口来编程

 

 

[cpp] view plaincopyprint?
  1.        HRESULT hr;  
  2.        CLSID AppClsid;  
  3.        IDispatch *pApp;  
  4.   
  5.        ::CoInitialize(NULL);  
  6.          
  7. //   
  8. ::CLSIDFromProgID (L"CATIA.Application", &AppClsid); //get the unique id of CATIA  
  9.          
  10.       
  11. //   
  12. hr = CoCreateInstance(AppClsid,NULL,CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pApp);  
  13.   
  14.   
  15.        VARIANT result, buffer;  
  16.        VariantInit(&result);  
  17.   
  18.   
  19.        VARIANT arg2;  
  20.        VariantInit(&arg2);  
  21.        arg2.vt = VT_BOOL;  
  22.        arg2.boolVal = TRUE;  
  23.        hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, pApp, L"Visible", 1, arg2);  
  24.   
  25.   
  26.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, pApp, L"Documents", 0);//here there is no argument, so we put 0  
  27.        buffer.vt = VT_DISPATCH;  
  28.        buffer.pdispVal = result.pdispVal;  
  29.        IDispatch *documents = buffer.pdispVal;  
  30.   
  31.        VARIANT arg1;  
  32.        VariantInit(&arg1);  
  33.        arg1.vt = VT_BSTR;  
  34.        arg1.bstrVal = ::SysAllocString(L"Part");  
  35.        //VARIANT result, buffer;  
  36.        VariantInit(&result);  
  37.        hr = AutoWrap(DISPATCH_METHOD, &result, documents, L"Add", 1 , arg1);  
  38.   
  39.        buffer.vt = VT_DISPATCH;  
  40.        buffer.pdispVal = result.pdispVal;  
  41.        IDispatch *partDocument = buffer.pdispVal;  
  42.   
  43.        //   
  44.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, partDocument, L"Part", 0);  
  45.        buffer.vt = VT_DISPATCH;  
  46.        buffer.pdispVal = result.pdispVal;  
  47.        IDispatch *part = buffer.pdispVal;  
  48.   
  49.        //   
  50.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Bodies", 0);  
  51.        buffer.vt = VT_DISPATCH;  
  52.        buffer.pdispVal = result.pdispVal;  
  53.        IDispatch *bodies = buffer.pdispVal;  
  54.   
  55.        //   
  56.        VARIANT arg;  
  57.        VariantInit(&arg);  
  58.        arg.vt = VT_BSTR;  
  59.        arg.bstrVal = ::SysAllocString(L"PartBody");  
  60.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, bodies, L"Item", 1, arg);  
  61.        buffer.vt = VT_DISPATCH;  
  62.        buffer.pdispVal = result.pdispVal;  
  63.        IDispatch *body = buffer.pdispVal;  
  64.   
  65.        //   
  66.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, body, L"Sketches", 0);  
  67.        buffer.vt = VT_DISPATCH;  
  68.        buffer.pdispVal = result.pdispVal;  
  69.        IDispatch *sketches1 = buffer.pdispVal;  
  70.   
  71.        //   
  72.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"OriginElements", 0);  
  73.        buffer.vt = VT_DISPATCH;  
  74.        buffer.pdispVal = result.pdispVal;  
  75.        IDispatch *originElements = buffer.pdispVal;  
  76.   
  77.        //   
  78.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, originElements, L"PlaneXY", 0);  
  79.        buffer.vt = VT_DISPATCH;  
  80.        buffer.pdispVal = result.pdispVal;  
  81.        IDispatch *reference1 = buffer.pdispVal;  
  82.   
  83.        //   
  84.        VARIANT arg3;  
  85.        VariantInit(&arg3);  
  86.        arg3.vt = VT_DISPATCH;  
  87.        arg3.pdispVal = reference1;  
  88.        hr = AutoWrap(DISPATCH_METHOD, &result, sketches1, L"Add", 1, arg3);  
  89.        buffer.vt = VT_DISPATCH;  
  90.        buffer.pdispVal = result.pdispVal;  
  91.        IDispatch *sketch1 = buffer.pdispVal;  
  92.   
  93.        ////   
  94.        //SAFEARRAY * psa;   
  95.        //SAFEARRAYBOUND rgsabound[1];  
  96.   
  97.        //rgsabound[0].lLbound = 0;  
  98.        //rgsabound[0].cElements = 9;   
  99.   
  100.        //psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);  
  101.        //   
  102.   
  103.   
  104.        //hr = SafeArrayAccessData(psa);   
  105.   
  106.   
  107.        //hr = SafeArrayUnaccessData(psa);  
  108.   
  109.        //VARIANT array;   
  110.        //VariantInit(&array);   
  111.        //array.vt = VT_ARRAY;   
  112.        //array.pparray = &psa;   
  113.        //   
  114.        //hr = AutoWrap(DISPATCH_METHOD, &result, sketch1, L"SetAbsoluteAxisData", 1, array);  
  115.        VARIANT arg4;  
  116.        VariantInit(&arg4);  
  117.        arg4.vt = VT_DISPATCH;  
  118.        arg4.pdispVal = sketch1;  
  119.        hr = AutoWrap(DISPATCH_PROPERTYPUT|DISPATCH_METHOD, &result, part, L"InWorkObject", 1, arg4);  
  120.        //buffer.vt = VT_DISPATCH;   
  121.        //buffer.pdispVal = result.pdispVal;  
  122.        //IDispatch *sketch1 = buffer.pdispVal;  
  123.   
  124.        //   
  125.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"OpenEdition", 0);  
  126.        buffer.vt = VT_DISPATCH;  
  127.        buffer.pdispVal = result.pdispVal;  
  128.        IDispatch *factory2D1 = buffer.pdispVal;  
  129.   
  130.   
  131.        //   
  132.        VARIANT a1, a2, a3;  
  133.        VariantInit(&a1);  
  134.        VariantInit(&a2);  
  135.        VariantInit(&a3);  
  136.        a1.vt = VT_R4;a1.fltVal = 50.f;  
  137.        a2.vt = VT_R4;a2.fltVal = 0.f;  
  138.        a3.vt = VT_R4;a3.fltVal = 0.f;  
  139.        hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, factory2D1, L"CreateClosedCircle", 3, a1, a2, a3);  
  140.       
  141.        //   
  142. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, sketch1, L"CloseEdition", 0);  
  143.       
  144. //   
  145. hr = AutoWrap(DISPATCH_PROPERTYGET|DISPATCH_METHOD, &result, part, L"Update", 0);  
  146.       
  147.   
  148.       if (pApp) pApp->Release();  
  149.       ::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 plaincopyprint?
  1. int main(int argc, char* argv[])  
  2. {  
  3.     ::CoInitialize(NULL);  
  4.   
  5.     ApplicationPtr catia;  
  6.   
  7.     HRESULT hr = S_OK;  
  8.   
  9.     hr = catia.GetActiveObject("CATIA.Application");  
  10.   
  11.     if (FAILED(hr))  
  12.     {  
  13.         hr = catia.CreateInstance("CATIA.Application");  
  14.     }  
  15.   
  16.     catia->PutVisible(VARIANT_TRUE);  
  17.   
  18.     //   
  19.     DocumentsPtr documents;  
  20.     documents = catia->GetDocuments();  
  21.     BSTR AddPart = _com_util::ConvertStringToBSTR("Part");  
  22.     PartDocumentPtr partDocument;  
  23.     partDocument = documents->Add(&AddPart);  
  24.   
  25.     PartPtr part = partDocument->GetPart();  
  26.      BodiesPtr bodies = part->GetBodies();  
  27.      BodyPtr body = part->GetMainBody();  
  28.      HybridBodiesPtr hybridBodies = part->GetHybridBodies();  
  29.   
  30.     FactoryPtr shapeFactory = part->GetShapeFactory();  
  31.   
  32.      HybridShapeFactoryPtr hybridShapeFactory = part->GetHybridShapeFactory();  
  33.   
  34.     SketchesPtr sketches = body->GetSketches();  
  35.   
  36.     OriginElementsPtr originElements = part->GetOriginElements();  
  37.   
  38.     AnyObjectPtr planeXY = originElements->GetPlaneXY();  
  39.   
  40.     ReferencePtr r1 = part->CreateReferenceFromObject(planeXY);  
  41.   
  42.     SketchPtr sketch = sketches->Add(r1);  
  43.   
  44.     part->PutInWorkObject(sketch);  
  45.   
  46.     Factory2DPtr factory2D = sketch->OpenEdition();  
  47.   
  48.     factory2D->CreateClosedCircle(0.0, 0.0, 50.0);  
  49.   
  50.     sketch->CloseEdition();  
  51.   
  52.     part->Update();  
  53.   
  54.     ::CoUninitialize();  
  55.   
  56.     return 0;  
  57. }  


 

 

3 利用 CAA

还没有找到CAA安装程序,以后再续