広告

Fusion360 Python API 再挑戦!AIの力を借りて、sketchなど基本ライブラリを作ってみた。

AI

数年前、Fusion360のPython APIに少しだけ触れたことがあります。
当時はPython自体が初めてで、構文の違いに戸惑いました。
C言語に慣れていた私には、インデントでブロックを作る点や、変数・関数に型の宣言が不要な点など、なかなか馴染めませんでした。
さらに、Fusion独自のオブジェクトや関数の使い方を調べる必要があり、作業のハードルは思った以上でした。
こちらのブログ記事「Kantoku」さんのサイトを参考にしながら少しだけ進めてみたのですが、残念ながら長続きせず中断してしまいました。

ところが昨年、AI(生成AI)が大きく注目されるようになり、「これを使ってみるか?」と再び興味がわきました。
試しにFusion向けのコードをAIに聞いてみると、実際に動作するスクリプトを提案してくれて、少しやる気が復活…
しかしそれも一時的で、またもや放置状態に。

そして今回!
AIもさらに進化してきた今こそ、もう一度挑戦してみようと思い立ちました。
本記事では、Fusion360 Python API に再び取り組み始めた記録と、コーディングへのAIの活用事例をレポートしています。
例題として、Fusion APIの基本ライブラリを作成しましたので、利用できそうであれば、利用していただければ幸いです。

なお、より高度なスクリプトや実践的な例に興味がある方は、「Kantoku」さんのサイトに素晴らしい資料が公開されていますので、ぜひチェックしてみてください。

今回の目標:スケッチ関連の基本ライブラリを作る

Python言語は、ほとんど初心者ですが、ネット情報やAiを参考にコードをコピペするだけでは、なかなか覚えられないと思っています。
そこで、基本的なコードをライブラリ化する事で、少しは理解も深まるかと思い、まずはスケッチ周りの基本コードをライブラリ化してみようと思います

Aiの実力を試してみる

さっそく、何種類かのLLMに質問してみました。

fusionのpython API で直線を引くコード

ローカルLLM

ローカルの場合、私の環境では、レスポンス的に30bぐらいが実用できる限界です。
そこで、「gemma-3-27b」「qwen3-32b」で試してみます

「fusionのpython API で直線を引くコードをだして」

最初に、「import adsk.core, adsk.fusion, traceback」などFusion特有のパッケージをインポートしするコードを出してくれるので、なかなかいいな!と思っていましたが、実際にFusionで実行してみても正常動作しませんでした。
特に、CAD画面上にメッセージを出力する場合、「ui.messageBox」を利用しますが、一般的なpythonの「print」文を使ったりしています。
また、私の環境で30bクラスのLLMでは、回答に5分以上かかりました。
文章をまとめたり、翻訳したりの場合では、8bクラスでもいい回答をもらえますが、Fusion API のPython場合はちょっとマイナーなのかもしれません
参考にはなると思いますが、環境ではちょっとレスポンスが悪いです

オンラインLLM

次に、オンラインの「chatGPT」と「gemini」で試してみました。
「chatGPT」も「gemini」も、正常に動作しました
ただし、ログインしないと、会話履歴や共有できないので、ログインしたほうがいいと思います。
制限がある場合がありますが、そこそこ無料利用できます。
やはり、さすがです。回答レスポンスも早いです。
今回の質問では、一年前に、出してくれたコードとほとんど同じコードをだしてくれました。
一年前は、「bard(gemini)」のコードは、正常動作しないコードでしたが、現在の「gemini」は問題ないコードを出してくれます。
個人的は、ローカルLLMを使いたい気持ちがあるのですが、開発作業では、やはりレスポンスは重要なので、今後の学習はオンラインLLMを利用しようと思います。
まずは「Gemini 2.5Flash」を利用してみて、いい回答が出なかった場合には、「chatGPT」や「Gemini 2.5Pro」を使おうと思います

コンポネントやスケッチのアクティブな状態を把握

上記の直線を描くサンプルコードでは、ルートコンポネントに新しいスケッチを作成し、そのスケッチに直線を引いています。
もう少し、実践的な動作にしたいです。

  • スケッチモードであれば、そのスケッチに・・
  • スケッチモードでない場合、ルートにこだわらず、アクティブなコンポネントに新しいスケッチを作成しそのスケッチに・・

これを実現させるには、まず現状のアクティヴな状態を把握する必要があります
アクティブなコンポーネントを見つける関数はすぐ見つかりましたが、スケッチのモード判定方法はなかなか見つからずAiのお陰でどうにかなりそうです。
こういった汎用的だけど苦労した処理を、ライブラリ化しておくと、後々便利だと思います

現状がスケッチモードかどうかの判定

何度かgemini に聞いてみたところ、「activeEditObject」activeEnvironment」を使用する方法があるとの回答をもらいました。
ただし、Ai としては、activeEditObject」を推奨するとの事でした

判定で、「isinstance()」関数を使っています。
これは、自力では、なかなか探せなかったと思います。恐るべし、Aiです。

python特有な構文

Aiが出してくれた、サンプルコードを見ると、C言語とは違う書き方が結構出てきます
例えば

return True , active_object

のように、複数変数を返す事ができて、取り出しは、下記のように「,」で区切って利用できるのですね

is_active , active_sketch = is_sketch_mode_active()

C++言語では、最近ではstd::tupleが利用できるみたいですが、それを知らない私は、classを使ったりしていますが、こちらのほうが、面倒ないですね。
「if文」も「三項演算子」と呼ばれている構文が結構使われていました。

C言語にも「三項演算子」はありますが、if文のほうが、分かりやすいかも・・
配列系も、多種類があるようで、Aiが出してくれたサンプルでも結構多用しています

plane = plane.lower()
planes_map = {
    "xy": component.xYConstructionPlane,
    "xz": component.xZConstructionPlane,
    "yz": component.yZConstructionPlane
}   
base_plane = planes_map.get(plane)

この「.get(plane)」はなんだ?
と思いましたが、これもAiに聞くと、すぐに説明してくれました。
planes_map[plane]でもアクセスできるようですが、get()を使うとplaneが存在しない場合安全にデフォルト値(Noneまたは指定した値)を返してくれるようです。
本当にすぐに教えてくれるので、私のような独学の場合、参考書などをめくるよりも、言語の理解は数段速くなるでしょうね~

Fusion スクリプトをライブラリ化する

Fusion では、「ユーティリティ」⇒「アドイン」⇒「スクリプトとアドイン」⇒「+」で新規にスクリプトを作成できます

このダイアログの「フォルダの場所」に「名前」に入力のフォルダを作成し、その中に「名前.py」で実行スクリプトが作成されます。
「フォルダの場所」はデフォルトでは、かなり深いので、私は「D:\Fusion360\Scripts」のようにシンプルな場所に変更しています。
また、この場所は、「基本設定」⇒「一般」⇒「API」でデフォルトを変更できます
ただし、ここでの設定箇所に「Scripts」は自動作成されるので、「D:\Fusion360」になります

Fusionスクリプトは、Fusionオブジェクトモデルを介して、利用したいオブジェクトのコマンドを記述します。
したがって、スクリプトを作成するには、各オブジェクトの情報が必要となり、かなり複雑です。


今回は、Pythonの学習も兼ねて、Fusionのスケッチ関連オブジェクトをカプセル化したライブラリを作成したいと思います。

ライブラリの登録場所とpythonでの実装方法

ライブラリフォルダは、Fusionが自動作成する、「Scripts」内の自作スクリプトと同じレベルに登録したいと思います

D:\Fusion360\Scripts
├── 新規スクリプト
├── CenterLine # 自作スクリプト
│ └── CenterLine.py # X,Y,Zの軸のセンターラインを作成する

├── library # 作成ライブラリ登録フォルダ
│ ├── _init_.py # 空ファイル(必要らしい)
│ ├── lib_util.py # Component & Sketch 関連関数
│ └── lib_2d.py # 点や直線を作成(今後、円、円弧なども追加予定)

私の環境では、このようなイメージです。
「library」フォルダ内に「lib_util.py」「lib_2d.py」スクリプトを作成
「lib_util.py」は、Component や sketch を提供する基本関数を記述します
「lib_2d.py」は、点や直線を扱う関数を作成しますが、lib_util.py」の関数も利用します
今回はこの二つのライブラリを利用して、 X,Y,Zの軸のセンターラインを作成する「CenterLine /CenterLine.py」スクリプトを作成します

実行スクリプトと同じレベルのスクリプトをインポートするには?

インポートするコードもわからないので、さっそくAiに聞いてみました
上記の構造をAiに渡して、実行スクリプト「CenterLine.py」から「lib_util.py」の関数を利用するコードを聞いてみました
この場合、正確なディレクトリ構造を取得する事が必要だと言うことで下記コードを教えてもらいました。

この構成はよくライブラリや設定ファイルを相対パスで読み込むときの定番のコードのようです
もう少し、詳しく説明してもらいました。

_file_:現在実行中のPythonスクリプトのファイルパス
os.path.abspath(__file__):絶対パスに変換
os.path.dirname(…):そのファイルが属するディレクトリを取得

D:/Fusion360/Scripts/
├── library/
│ └── __init__.py # モジュールの初期化用
│ └── lib_util.py
│ └── lib_2d.py
├── CenterLine/
│ └── CenterLine.py ← 実行スクリプト

__file__ → “./CenterLine/CenterLine.py”
abspath(__file__) → “D:/Fusion360/Scripts/library/CenterLine/CenterLine.py”
current_dir → “D:/Fusion360/Scripts/library/CenterLine”
script_dir → “D:/Fusion360/Scripts/library”

このコードで、ライブラリのディレクトリを取り出し、
「sys.path.append(script_dir)」でpythonが内部でモジュール検索時に、指定ディレクトリを追加するの意味のようです
この設定後に、「from library import lib_util」コードで「library」ディレクトリ内の「lib_util.py」内の関数を使用できるようになります
具体的には、下記になります

これで、新規作成したスクリプトに、このコードを追加すると、「lib_util」内の関数が使えます
さらに「lib_2d.py」ライブラリも、「lib_util.py」の関数も利用しますが、こちらは、「lib_util.py」と同じディレクトリ内なので、「script_dir = os.path.dirname(current_dir)」のコードは不要になりますね

実際には結構時間がかかったのですが、これで、やっとライブラリが使えるようになりました。
本当、Ai様様です。
Aiの進歩で、コーディングの勉強は不要だとの意見もありますが、やっぱりコードの意味の理解は必要だと思います。
たぶん、Aiもそう思っているのでしょう!詳しいコメントを日本語で追記してくれます。
「あなたの言葉でコメントつけるから、覚えてね!」と言ってる気がします。
Ai利用でプログラミングの学習速度は、以前よりも圧倒的に速くなると思います

ライブラリ利用方法

./Scripts/
├── 新規スクリプト/ # <——– Fusion ダイアログで作成
│ └── 新規スクリプト.py
├── library/ #<——— Scripts/ 直下に作成
│ └── __init__.py # <—– 空ファイル追加作成、モジュールの初期化用
│ └── lib_util.py # <——- ライブラリファイル
│ └── lib_2d.py # <——- ライブラリファイル
└── CenterLine/ # <——- 自作スクリプト用
│ └── CenterLine.py # <——- 自作スクリプトファイル
└───────

イメージ的には、このようになります。
Fusionで「スクリプトまたはアドイン作成」を実行すると、設定ダイアログが表示され、設定した「フォルダの場所」へ設定した名前のフォルダが自動作成され、さらにその中に、設定した名前.py の実行ファイルが作成されます。

今回紹介のライブラリは、Fusionで設定した「フォルダの場所」の直下に「library」の名前でフォルダを作成し、さらに「library」の直下に、「__init__.py」「lib_util.py」「lib_2d.py」を作成します
「__init__.py」は、空ファイルですが、Aiが言うには、ライブラリを利用する際必要みたいです。
「lib_util.py」「lib_2d.py」も一旦空ファイルを作っておいて、下記コードをコピペして保存します

ライブラリを利用して、X,Y,Zの座標軸にセンターラインを描く

まずは、Fusion 「スクリプトとアドイン」で、新規スクリプトを作成します
ここでは「CenterLine」という名前にしました。
これで、「./Scripts」ディレクトリ内に、「CenterLine/CenterLine.py」が作成されています。
CenterLine.pyファイルの内容を、下記コードで上書きして保存します

CenterLine.py

下記が、ライブラリ用スクリプトファイルです

lib_util.py

lib_2d.py

注意点

実は、まだ解決できていない注意点があります
通常のライブラリ使用では問題ないと思いますが、Fusionでライブラリを利用したスクリプトを実行後、ライブラリ内スクリプトを編集しても、編集内容が反映されません。
Aiに聞いてみると、Fusionの仕様でキャッシュが優先されているとの事です
キャッシュクリアのコードも教えてもらいましたが、現状では反映されません。
ライブラリの編集を反映させるには、Fusionを再起動させるとキャッシュがクリアされ反映されます
ライブラリを試行錯誤している場合でも、ちょっと面倒です。
いい方法は、ないのかなぁ~??

まとめ

pythonはド素人なので、勉強もかねて、Ai にコーディングを教えてもらいながら、FusionのComponentやsketch、直線作成などの関数をライブラリ化してみました。
Fusionオブジェクトモデルは、広範囲で奥が深いので、探すのも大変です。
よく使いそうな関数を、まとめたので、少しは取り組みやすくなるのではないか?と思っています。
今後も進化させようと思っていますが、Aiがなかったら、ここまで完成できなかったと思います。
ここで紹介しているコードも、一旦自分なりに作成したスクリプトを、Aiに張り付けて、添削してもらったコードを再編集したものです。
関数名やコメントの書き方なども、pythonの慣習を教えてもらい参考にしています

コメント

タイトルとURLをコピーしました