数年前、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」を推奨するとの事でした
import adsk.core
import adsk.fusion
def is_sketch_mode_active():
"""
現在スケッチモード(いずれかのスケッチが編集中)かどうかを判定します。
Returns:
bool: スケッチモードであれば True、そうでなければ False。
adsk.fusion.Sketch: アクティブなスケッチオブジェクト(スケッチモードの場合)。
"""
try:
app = adsk.core.Application.get()
# 現在編集中のオブジェクトを取得
active_object = app.activeEditObject
# 編集中のオブジェクトがスケッチ(Sketch)であるかを確認
if active_object and isinstance(active_object, adsk.fusion.Sketch):
return True, active_object
else:
return False, None
except:
return False, None
# --- 実行例 ---
def run(context):
ui = None
try:
app = adsk.core.Application.get()
ui = app.userInterface
is_active, active_sketch = is_sketch_mode_active()
if is_active:
ui.messageBox(f'はい、現在スケッチモードです。\nアクティブなスケッチ: {active_sketch.name}')
else:
ui.messageBox('いいえ、現在スケッチモードではありません。')
except:
if ui:
ui.messageBox('エラーが発生しました。')
判定で、「isinstance()」関数を使っています。
これは、自力では、なかなか探せなかったと思います。恐るべし、Aiです。
python特有な構文
Aiが出してくれた、サンプルコードを見ると、C言語とは違う書き方が結構出てきます
例えば
return True , active_object
のように、複数変数を返す事ができて、取り出しは、下記のように「,」で区切って利用できるのですね
is_active , active_sketch = is_sketch_mode_active()
C++言語では、最近ではstd::tupleが利用できるみたいですが、それを知らない私は、classを使ったりしていますが、こちらのほうが、面倒ないですね。
「if文」も「三項演算子」と呼ばれている構文が結構使われていました。
design = get_design()
return design.activeComponent if design else None
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」の関数を利用するコードを聞いてみました
この場合、正確なディレクトリ構造を取得する事が必要だと言うことで下記コードを教えてもらいました。
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
この構成はよくライブラリや設定ファイルを相対パスで読み込むときの定番のコードのようです
もう少し、詳しく説明してもらいました。
_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」内の関数を使用できるようになります
具体的には、下記になります
import os, sys
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from library import lib_util
これで、新規作成したスクリプトに、このコードを追加すると、「lib_util」内の関数が使えます
さらに「lib_2d.py」ライブラリも、「lib_util.py」の関数も利用しますが、こちらは、「lib_util.py」と同じディレクトリ内なので、「script_dir = os.path.dirname(current_dir)」のコードは不要になりますね
import os, sys
current_dir = os.path.dirname(os.path.abspath(__file__))
# script_dir = os.path.dirname(current_dir)
sys.path.append(current_dir)
import lib_util
実際には結構時間がかかったのですが、これで、やっとライブラリが使えるようになりました。
本当、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
"""This file acts as the main module for this script."""
import traceback
import adsk.core
import adsk.fusion
# import adsk.cam
import os, sys, importlib
#library import
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from library import lib_util,lib_2d
def run(context):
try:
lib_2d.draw_center_line(100,100,100)
except:
lib_util.disp_message('Failed:\n{}'.format(traceback.format_exc()))
下記が、ライブラリ用スクリプトファイルです
lib_util.py
import adsk.core, adsk.fusion, adsk.cam, traceback
from typing import Tuple, Optional
#このライブラリは
#Fusionが作成するスクリプトと同じディレクトリに置かれる事を想定している
#使用する場合には、下記コードにより読み込みパスを追加する
"""
import os, sys, importlib
current_dir = os.path.dirname(os.path.abspath(__file__))
script_dir = os.path.dirname(current_dir)
sys.path.append(script_dir)
from library import lib_util
"""
# ---------------------
## Get Fusion object
# ---------------------
def get_app():
return adsk.core.Application.get()
def get_design():
app = get_app()
return adsk.fusion.Design.cast(app.activeProduct)
def get_ui():
app = get_app()
return app.userInterface
# ---------------------
## メッセージ表示
# ---------------------
def disp_message(msg: str):
"""ユーザーにメッセージボックスを表示"""
ui = get_ui()
if ui:
ui.messageBox(msg)
# ---------------------
## Component & Sketch Functions
# ---------------------
# /////////////////////////////////////////////////////////////
def get_root_component() -> Optional[adsk.fusion.Component]:
"""ルートコンポーネントを返す"""
design = get_design()
return design.rootComponent if design else None
# /////////////////////////////////////////////////////////////
def get_active_component() -> Optional[adsk.fusion.Component]:
"""現在アクティブなコンポーネントを返す"""
design = get_design()
return design.activeComponent if design else None
# /////////////////////////////////////////////////////////////
def create_new_component(name: str = 'New_Component') -> Optional[adsk.fusion.Component]:
"""新しいコンポーネントを作成し、アクティブなコンポーネントの配下に追加"""
component = get_active_component()
if not component:
component = get_root_component()
if not component:
disp_message('コンポーネントが見つかりません。デザインがアクティブか確認してください。')
return None
try:
occurrences = component.occurrences
new_occurrence = occurrences.addNewComponent(adsk.core.Matrix3D.create())
new_component = new_occurrence.component
new_component.name = name
return new_component
except Exception:
disp_message(f'新しいコンポーネントの作成に失敗しました:\n{traceback.format_exc()}')
return None
# /////////////////////////////////////////////////////////////
def get_parent_sketch(obj: any) -> Optional[adsk.fusion.Sketch]:
"""指定されたオブジェクトの親スケッチを取得"""
return obj.parentSketch if hasattr(obj, 'parentSketch') else None
# /////////////////////////////////////////////////////////////
def create_new_sketch(name: str = 'New_Sketch', plane: str = 'xy') -> Optional[adsk.fusion.Sketch]:
"""指定された平面に新しいスケッチを作成"""
component = get_active_component()
if not component:
component = get_root_component()
if not component:
disp_message('スケッチを作成するコンポーネントが見つかりません。')
return None
plane = plane.lower()
planes_map = {
"xy": component.xYConstructionPlane,
"xz": component.xZConstructionPlane,
"yz": component.yZConstructionPlane
}
base_plane = planes_map.get(plane)
if not base_plane:
disp_message(f"サポートされていない平面: '{plane}' 'xy', 'xz', 'yz' のいずれかを選択してください。")
return None
try:
sketches = component.sketches
sketch = sketches.add(base_plane)
sketch.name = name
return sketch
except Exception:
disp_message(f'新しいスケッチの作成に失敗しました:\n{traceback.format_exc()}')
return None
# /////////////////////////////////////////////////////////////
def is_sketch_mode_active() -> Tuple[bool, Optional[adsk.fusion.Sketch]]:
"""現在スケッチモードがアクティブであるかを確認し、スケッチオブジェクトを返す"""
app = get_app()
active_object = app.activeEditObject
# is_instance() を使うことで、より安全に型チェックを行う
if isinstance(active_object, adsk.fusion.Sketch):
return True, active_object
else:
return False, None
# /////////////////////////////////////////////////////////////
def get_sketch() -> Optional[adsk.fusion.Sketch]:
"""アクティブなスケッチを返す、アクティブでない場合は新しいスケッチを作成"""
is_active, sketch = is_sketch_mode_active()
if not is_active:
sketch = create_new_sketch()
return sketch
lib_2d.py
import adsk.core, adsk.fusion, adsk.cam, traceback
from typing import Tuple, Optional
# 利用するlib_utilは、このライブラリと同じディレクトリ
import os, sys, importlib
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
import lib_util
# ---------------------
## カスタム、点基本クラス
# ---------------------
# /////////////////////////////////////////////////////////////
class kPoint:
"""3D空間の点を表す基本クラス"""
def __init__(self, x: float, y: float, z: float = 0.0):
self.x = x
self.y = y
self.z = z
# ---------------------
## カスタム、スケッチ点クラス
# ---------------------
# /////////////////////////////////////////////////////////////
class kSketchPoint(kPoint):
"""Fusion 360 のスケッチ点として使用される座標を、単位とスケッチ平面に応じて変換するクラス"""
def __init__(self, x: float = 0.0, y: float = 0.0, z: float = 0.0, sketch: Optional[adsk.fusion.Sketch] = None, unit: str = "mm"):
unit = unit.lower()
# 単位変換係数を辞書で管理
scale_factors = {"mm": 0.1, "cm": 1.0, "m": 10.0}
scale = scale_factors.get(unit, 1.0) # 存在しない単位は1.0 (cm) を使用
if not sketch:
sketch = lib_util.get_sketch() # スケッチが指定されていなければ、アクティブなスケッチを取得
# スケッチ平面に応じて座標系を調整 (XZ平面はY軸が下向き)
# 参照平面が'XZ'の場合は、y座標を反転させる
# これはFusion 360の座標系の癖に対応
direction_y = -1.0 if sketch and sketch.referencePlane.name == "XZ" else 1.0
# 単位と座標系による方向を調整
converted_x = x * scale
converted_y = y * scale * direction_y
converted_z = z * scale
super().__init__(converted_x, converted_y, converted_z)
self.sketch = sketch
self.unit = unit
# ---------------------
## Sketch Geometry Creation Functions
# ---------------------
# /////////////////////////////////////////////////////////////
def is_equal_sketch_points(sp1: adsk.fusion.SketchPoint, sp2: adsk.fusion.SketchPoint, tolerance: float = 0.0001) -> bool:
"""2つのスケッチ点が指定された許容差内で同じ位置にあるかどうかを判断"""
# ジオメトリオブジェクトの距離を比較
distance = sp1.geometry.distanceTo(sp2.geometry)
return distance < tolerance
# /////////////////////////////////////////////////////////////
def create_sketch_point(x: float = 0, y: float = 0, z: float = 0, sketch: Optional[adsk.fusion.Sketch] = None) -> Optional[adsk.fusion.SketchPoint]:
"""指定された座標にスケッチ点を作成"""
if not sketch:
sketch = lib_util.get_sketch()
if not sketch:
lib_util.disp_message('スケッチがアクティブでないか、新しいスケッチの作成に失敗しました。')
return None
try:
# kSketchPoint を使用して単位と平面を考慮した座標を取得
converted_point = kSketchPoint(x, y, z, sketch)
# adsk.core.Point3D オブジェクトを作成
point3d = adsk.core.Point3D.create(converted_point.x, converted_point.y, converted_point.z)
# スケッチに点を追加
sketchPoint = sketch.sketchPoints.add(point3d)
return sketchPoint
except Exception:
lib_util.disp_message(f'スケッチ点の作成に失敗しました:\n{traceback.format_exc()}')
return None
# /////////////////////////////////////////////////////////////
def create_line_from_sketchpoints(sp1: adsk.fusion.SketchPoint, sp2: adsk.fusion.SketchPoint, construction: bool = False, fixed: bool = False) -> Optional[adsk.fusion.SketchLine]:
"""2つの既存のスケッチ点から直線を作成"""
# 同じスケッチに属しているかチェック
if lib_util.get_parent_sketch(sp1) != lib_util.get_parent_sketch(sp2):
lib_util.disp_message('2つの点は異なるスケッチに属しています。')
return None
# 2つの点が同じ位置にあるかチェック
if is_equal_sketch_points(sp1, sp2):
lib_util.disp_message('2つの点が同じ位置にあります。直線を作成できません。')
return None
sketch = lib_util.get_parent_sketch(sp1)
if not sketch:
lib_util.disp_message('親スケッチが見つかりません。')
return None
try:
line = sketch.sketchCurves.sketchLines.addByTwoPoints(sp1, sp2)
line.isConstruction = construction
line.isFixed = fixed
return line
except Exception:
lib_util.disp_message(f'直線(スケッチ点から)の作成に失敗しました:\n{traceback.format_exc()}')
return None
# /////////////////////////////////////////////////////////////
def create_line_from_coordinate(x1: float, y1: float, z1: float, x2: float, y2: float, z2: float, sketch: Optional[adsk.fusion.Sketch] = None, construction: bool = False, fixed: bool = False) -> Optional[adsk.fusion.SketchLine]:
"""座標から直接、スケッチ直線を作成"""
if not sketch:
sketch = lib_util.get_sketch()
if not sketch:
return None
# ヘルパー関数を利用して点を先に作成
p1 = create_sketch_point(x1, y1, z1, sketch)
p2 = create_sketch_point(x2, y2, z2, sketch)
if p1 and p2:
return create_line_from_sketchpoints(p1, p2, construction, fixed)
else:
lib_util.disp_message('直線を作成するための点の作成に失敗しました。')
return None
# /////////////////////////////////////////////////////////////
def create_line_from_points(p1: kPoint, p2: kPoint, sketch: Optional[adsk.fusion.Sketch] = None, construction: bool = False, fixed: bool = False) -> Optional[adsk.fusion.SketchLine]:
"""カスタム `kPoint` オブジェクトからスケッチ直線を作成"""
if not sketch:
sketch = lib_util.get_sketch()
if not sketch:
return None
return create_line_from_coordinate(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, sketch, construction, fixed)
# /////////////////////////////////////////////////////////////
def draw_center_line(widthX=100,widthY=100,widthZ=100):
"""センターライン作成"""
widthX = 100 if widthX == 0 else widthX
widthY = 100 if widthY == 0 else widthY
widthZ = 100 if widthZ == 0 else widthZ
wx=widthX/2
wy=widthY/2
wz=widthZ/2
sketch = lib_util.get_sketch()
xp1 = kPoint(-wx,0)
xp2 = kPoint(wx,0)
yp1 = kPoint(0,-wy)
yp2 = kPoint(0,wy)
zp1 = kPoint(0,0,-wz)
zp2 = kPoint(0,0,wz)
create_line_from_points(xp1,xp2,sketch,True,True) #X Axis
create_line_from_points(yp1,yp2,sketch,True,True) #Y Axis
create_line_from_points(zp1,zp2,sketch,True,True) #Z Axis
注意点
実は、まだ解決できていない注意点があります
通常のライブラリ使用では問題ないと思いますが、Fusionでライブラリを利用したスクリプトを実行後、ライブラリ内スクリプトを編集しても、編集内容が反映されません。
Aiに聞いてみると、Fusionの仕様でキャッシュが優先されているとの事です
キャッシュクリアのコードも教えてもらいましたが、現状では反映されません。
ライブラリの編集を反映させるには、Fusionを再起動させるとキャッシュがクリアされ反映されます
ライブラリを試行錯誤している場合でも、ちょっと面倒です。
いい方法は、ないのかなぁ~??
まとめ
pythonはド素人なので、勉強もかねて、Ai にコーディングを教えてもらいながら、FusionのComponentやsketch、直線作成などの関数をライブラリ化してみました。
Fusionオブジェクトモデルは、広範囲で奥が深いので、探すのも大変です。
よく使いそうな関数を、まとめたので、少しは取り組みやすくなるのではないか?と思っています。
今後も進化させようと思っていますが、Aiがなかったら、ここまで完成できなかったと思います。
ここで紹介しているコードも、一旦自分なりに作成したスクリプトを、Aiに張り付けて、添削してもらったコードを再編集したものです。
関数名やコメントの書き方なども、pythonの慣習を教えてもらい参考にしています
コメント