こちらの続きです。
pycatiaを味わう2 - C#ATIA
個人的にpython使うのであれば、型ヒント使いたいです。
でも前回はわかりませんでした・・・。
幾つくサンプルを試した際にわかりつつあります。
例えば、PartDocumentがアクティブな状態の際はこの様にするようです。
# pycatia test import os import sys sys.path.insert(0, os.path.abspath("..\\pycatia")) from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument from pycatia.mec_mod_interfaces.part import Part def main() -> None: caa = catia() partDoc: PartDocument = PartDocument(caa.active_document.com_object) part: Part = Part(partDoc.part.com_object) print(part.name)
念のため、出力の一例としてこの様になります。
Part1
"from ~ import"を使用して、必要なものをインポートする
必要があるようです。
・・・ワイルドカードが使えないのは面倒です。
又、"キャストはどうすれば良いの?"と思っていましたが、
インスタンスの作成の際に各com_objectプロパティを
引数指定するようです。
と解釈したのですが、試したところ安全じゃないです。
例えば、Part(pycatia.mec_mod_interfaces.part)のインスタンスを
作成する際、partのcom_objectプロパティではなく、partDocの
com_objectプロパティを渡すような、こんな間違いをしてみます。
# pycatia test import os import sys sys.path.insert(0, os.path.abspath("..\\pycatia")) from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument from pycatia.mec_mod_interfaces.part import Part def main() -> None: caa = catia() partDoc: PartDocument = PartDocument(caa.active_document.com_object) # part: Part = Part(partDoc.part.com_object) part: Part = Part(partDoc.com_object) # <-間違い print(part.name)
結果はこちら。
Part1.CATPart
partの名前ではなくpartDocの名前が出力されます。(当然です)
VBAの場合であれば、異なる型の要素を代入すればエラーとなりますが、
pythonの場合は動的型付けの為、エラーとなりません。
型ヒントを利用しても当然代入可能です。
partDocとpartのcom_objectプロパティの型を出力する為、
このようなものを作りました。
# pycatia test import os import sys sys.path.insert(0, os.path.abspath("..\\pycatia")) from pycatia import catia from pycatia.mec_mod_interfaces.part_document import PartDocument def main() -> None: caa = catia() partDoc: PartDocument = PartDocument(caa.active_document.com_object) print(f"partDoc.com_object : {type(partDoc.com_object)}") print(f"partDoc.part.com_object : {type(partDoc.part.com_object)}")
結果はこちら。
partDoc.com_object : <class 'win32com.client.CDispatch'> partDoc.part.com_object : <class 'win32com.client.CDispatch'>
どちらも"class 'win32com.client.CDispatch'"の為、違いを判断する事が
出来ません。記憶が怪しいのですが、C#の時と同じです。
せめてインスタンス時に例外を吐き出して欲しいのですが、難しいかな・・・。
ちょっと安全じゃなく、バグの原因探し出すのに苦労しそう。