C#ATIA

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

fletでpycatiaが利用出来た

こちらの続きです。
fletでpycatiaが利用出来ない - C#ATIA

えぇ利用出来ました。経緯を・・・
前回記載していませんでしたが、思いついた方法は2つのExeファイルを作成し
flet側のexeでpycatia側のexeを実行させる方法でした。

しかしここには問題が発生します。
二つのexeにしてしまうと、fletで選択したものをpycatiaに受け渡す事が困難に
なる上、逆の事も困難となります。
(今回必要としたものはflet->pycatiaなのでそれで問題は無いのですが)

先々の事を考え、ここを何とかクリアしたい所なので、Copilotに色々と
相談しました。
pycatiaと言うより、pywin32を使ったこんな感じの内容です。

import win32com.client
app = win32com.client.Dispatch("CATIA.Application") #<-ここでエラー

後は、出力されるエラーを伝えたところ

import pythoncom
pythoncom.CoInitialize()

が必要と分かりました。どうやらCOMをクリアする処理っぽいです。
(その意義自体が分からない・・・)
とにかくこれを入れる事でエラーは解消しました。

では、pycatiaを利用する場合は何処に入れるべきか?になります。
公式のサンプルをお借りしてですが、エラーとなる箇所はこちらです。
pycatia/examples/example__hybrid_bodies__001.py at master · evereux/pycatia · GitHub
この直前に入れてみるもののやはりエラー・・・

"もう、直接書き足すしかないな"と思いつつも、実はインポートしている

from pycatia import catia

の処理が何処に記載されているのかが分かっていませんでした。

モソモソ調べた結果、こちらが該当箇所の様です。
pycatia/pycatia/base_interfaces/base_application.py at master · evereux/pycatia · GitHub
で、よく見ると・・・pythoncom.CoInitialize()の記載があるじゃない。

つまり、

caa = catia()

ではエラーとなりますが、

caa = catia(True)

でエラーを回避出来ます。・・・4文字追加するだけです。


と言う事、flet+pycatiaの無意味なサンプルです。

import flet as ft
from pycatia import catia

def call_catia():
    try:
        caa = catia(True)
        part_document = caa.active_document
        part = part_document.part
        bodies = part.bodies

        caa.message_box(bodies[0].name)

    except Exception as e:
        print(f"Error: {e}")

def main(page: ft.Page):
    page.title = "Flet-Pycatia Example"
    win = page.window
    win.width = 300
    win.height = 100

    def on_click(e):
        call_catia()

    open_button = ft.TextButton("Click", on_click=on_click)
    page.add(open_button)

ft.app(target=main)