非情報系ガチ勢のためのFusion360のScriptメモ
ちょげん
無料で高機能な3DCADであるFusion360はpython,C++,JavaScript1でAPI(Script,Add-on)が提供されています.
本ページではそのpythonでのScriptを書く上で調べたことの備忘録を残しておきます.随時更新予定です.参考にしてください.
またより簡単な方法があれば教えていただければ幸いです.
(筆者は非情報系ガチ勢ではないので素っ頓狂で当たり前な事を言うかもしれません.ご了承ください.また手探りで勉強しながら書いているので詳細な解説はありません.)
公式
https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-1C665B4D-7BF7-4FDF-98B0-AA7EE12B5AC2
このサイトの左メニューの
Programming Interface/Fusion 360 API Reference Manual/Objects
に正確な情報がある.
下準備
Scriptを書き始めるまでの手順については公式情報等を参考にしてください.特に詰まる事は無いと思います. ここではそれ以外の事を書きます.
テキストコマンド
scriptのコマンドを実行できそうなターミナル. エラーコードはここに吐かれるので開いておくのが吉. Fusion360画面右上,ファイル→表示→テキストコマンドを表示.
hello world
テキスト「hello world」を表示するだけのスクリプト.
import adsk.core, adsk.fusion, traceback def run(context): ui = None#いらないっぽい try: app = adsk.core.Application.get() ui = app.userInterface product = app.activeProduct design = adsk.fusion.Design.cast(product) title = 'hello Fusion360 Script world' if not design: ui.messageBox('No active Fusion design', title) return #処理 #例 メッセージボックスの表示(OK押すと処理が進む) ui.messageBox('!hello world!', title) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
Fusion360のモジュールはadsk.coreとadsk.fusionの2つ(tracebackはエラー処理系?)らしいのでインポート. run関数がc言語で言うところのmain関数にあたる関数.無ければ「SCRIPT ERROR」が出て動かないので注意. 基本的な初動は
app = adsk.core.Application.get() ui = app.userInterface product = app.activeProduct design = adsk.fusion.Design.cast(product)
の4文を実行する.ここでできるdesignオブジェクトの中にコンポーネントやフィーチャ等の機能が入っている. uiにはメッセージボックスやダイアログなどのユーザーインターフェースの機能が入っている. titleはメッセージボックス用の文字列なので基本必要なし.
if not design: ui.messageBox('No active Fusion design', title) return
は何を目的としているのか分からない.サンプルコードでもよく見るのでとりあえずおまじない.
ui.messageBox('!hello world!', title)
はメッセージボックスを表示する関数.ウインドウが出てきてokボタンを押すと処理が進む. 引数titleは無くてもいい. 基本的にはこの当たりにやってほしい処理を書いていく事でスクリプトを実装していく. 例外処理(try,except)でエラーコードをメッセージボックスに表示するようにしてある.テキストコマンドを表示しているなら無くてもいいと思う.
自作モジュール(複数ファイル利用)
スクリプトの保存場所と実行場所が違うのでパスを通す必要がある. パスさえ通ればどんな手段でもいいが,一例としては
import sys sys.path.append(r"モジュールファイルが保存されているディレクトリパス") import mymodule
が楽.これで追加されたパスはFusion360が起動している間保存され,一度落とすとパスは消えるので注意. (逆にいえば必要な時だけパスが追加されるので適当にモジュールを作ってパスがごちゃごちゃするという事はない.)
コンポーネントの作成
#ルートコンポーネントのオカランスを取得 allOccs = design.activeComponent.occurrences #コンポーネントを作成 newOcc = allOccs.addNewComponent(adsk.core.Matrix3D.create()) #コンポーネントの参照を取得 newComp=newOcc.component #コンポーネントに名前を付ける newComp.name='NewComponent'
design.activeComponentは現在選択しているcomponetオブジェクト.これによりactiveComponent内に新しいコンポーネントが生成される.
スケッチ+ソリッド押出し作成
#ルートコンポーネントのオブジェクトを取得 root = design.rootComponent #xy平面のスケッチを作成 sketch = root.sketches.add(root.xYConstructionPlane) #線分を開始 sketchlines = sketch.sketchCurves.sketchLines #点を生成 p1 = adsk.core.Point3D.create(0, 0, 0) p2 = adsk.core.Point3D.create(1, 0, 0) p3 = adsk.core.Point3D.create(1, 1, 0) p4 = adsk.core.Point3D.create(0, 1, 0) #線分を作成 sketchlines.addByTwoPoints(p1, p2) sketchlines.addByTwoPoints(p2, p3) sketchlines.addByTwoPoints(p3, p4) sketchlines.addByTwoPoints(p4, p1) #プロファイルを取得 prof1 = sketch.profiles.item(0) #押出しinputを生成 extrudes1 = root.features.extrudeFeatures extInput1 = extrudes1.createInput(prof1, adsk.fusion.FeatureOperations.NewBodyFeatureOperation) #distanceオブジェクトを生成 distance1 = adsk.core.ValueInput.createByReal(2.0) #distanceオブジェクトをInputにセット extInput1.setDistanceExtent(False, distance1) #ソリッドフラグをinputにセット extInput1.isSolid = True #押出しを実行 ext1 = extrudes1.add(extInput1)
デフォルトだとcm単位なので注意.コード中では長さ1の線をcreateしているが,これは長さ1cmの線として読まれ,表示上は10mmの線として表示される.
プロファイルとはスケッチで作られた領域?
フィーチャーはその設定をinputというオブジェクトにまとめ,addメソッドに渡すことで実行される.
-
JavaScriptは2020年12月の更新でサポートされなくなりました.↩