Как использовать собственный интерфейс автоматизации для CATIA V5 с Python?
Я создал собственный интерфейс автоматизации для CATIA V5. Мой интерфейс реализует один интерфейс CAA. Вот пример реализации метода SetComment. CAAInterface является поддельным именем
// MyXYZClass : SetComment
HRESULT MyXYZClass::SetComment( CATISpecObject_var ispObject, const
CATBSTR &irComment )
{
CAAInterface_var spInfo = ispObject;
if( !!spInfo )
{
CATUnicodeString commentToSet;
commentToSet.BuildFromBSTR( irComment );
spInfo->SetComment( commentToSet );
}
return S_OK;
}
Я проверил это с помощью CATScript внутри моей среды CATIA:
Sub CATMain()
' retrieve ASMPRODUCT of Part or Product
Dim myPrd As Product
Set myPrd = CATIA.ActiveDocument.Product
' Retrieve My Factory of Document
Dim myFact As MyFactoryVB
Set myFact = myPrd
' Retrieve Object as part
Dim myObject As AnyObject
Set myObject = CATIA.ActiveDocument.Part
' SetComment
myFact.SetComment myObject, "comment"
И это сработало отлично. Соответствующий документ CATIA введите описание изображения здесь
Кроме того, я создал проект Visual Studio VB, добавил ссылку->COM-> Библиотеки типов (мой CATIA V5 MyXYZAutInterf. Если CATIA работает, я вижу его).
Imports System.Runtime.InteropServices
Imports MyXYZAutInterf
Imports MECMOD
Imports ProductStructureTypeLib
' attach catia
Sub Main()
' retrieve ASMPRODUCT of Part or Product
Dim product As Product
product = CATIA.ActiveDocument.Product
' Retrieve My Factory of Document
Dim myFact As MyFactoryVB
myFact = product
' Retrieve Object as part
Dim part1 As Part
part1 = CATIA.ActiveDocument.Part
' Find object by Name
Dim myObject As AnyObject
myObject = part1.FindObjectByName("Pad.1")
' SetComment
myFact.SetComment(myObject, "comment")
End Sub
И это тоже отлично сработало.
Теперь я хочу использовать мой интерфейс автоматизации с Python
# First I generated wrapper code for my type library
import sys
if not hasattr(sys, "frozen"):
from comtypes.client import GetModule
GetModule("C:/..//MyXYZTypeLib.tlb")
#load my module
from comtypes.gen import MyXYZAutInterf as myModul
# myModul -> MyFactoryVB -- <unbound method MyFactoryVB.SetComment>
# Connecting to windows COM
catapp = win32com.client.Dispatch("CATIA.Application")
documents1 = catapp.Documents
partDocument1 = documents1.Item("Part.CATPart")
part1 = partDocument1.Part
bodies1 = part1.Bodies
body1 = bodies1.Item("PartBody")
shapes1 = body1.Shapes
shape1 = shapes1.Item("Pad.1")
myFact = myModul.MyFactoryVB()
# now I can see all my implemented methods under _methods_
Но сейчас я не могу использовать myFact. Если я сделаю:
myFact.SetComment(shape1, "comment")
Я получаю ошибку: ожидал COM этот указатель в качестве первого аргумента. Я должен назначить myFact для продукта (например, CATScript):
product1 = catapp.ActiveDocument.Product
myFact = product1
Но я тоже получаю ошибку: unknown.SetComment. Я очень расстроен. Может кто-нибудь помочь мне, пожалуйста?
2 ответа
Я починил это. Я использовал GetCustomerFactory("ALIAS_NAME")
Я успешно создал *.tlb для интерфейса без каких-либо проблем. Я также создал структуру реализации, которая является производной от CATBaseObject, и сохранил режим TIE как созданный интерфейс.
CAAIAVbCalling.idl:
interface CAAIAVbCalling : CATIABase
{
HRESULT NewStrFun(in CATBSTR istr,
out /*IDLRETVAL*/ CATBSTR ostr );
};
Реализация метода:
HRESULT __stdcall CAAEVbCallingComp::NewStrFun(CATBSTR istr,CATBSTR *ostr )
{
cout << "CAAEVbCallingComp::NewStrFun" << endl;
return S_OK;
}
Я добавил созданный *.tlb по ссылке в VBEditor. Я не могу создать экземпляр объекта интерфейса из Vbscript.