C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

pycatiaを味わう3

こちらの続きです。
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#の時と同じです。

せめてインスタンス時に例外を吐き出して欲しいのですが、難しいかな・・・。
ちょっと安全じゃなく、バグの原因探し出すのに苦労しそう。