ソフトウェア/Fusion360 の変更点

更新


#author("2025-09-28T05:20:53+00:00","default:administrator","administrator")
#author("2025-09-28T05:21:27+00:00","default:administrator","administrator")
[[公開メモ]]

* Fusion 360 について [#v56dec70]

目次です:

#contents


* ウィルスバスターが動いていると起動しない [#afe9e817]

Autodesk Fusion 360 が初期スプラッシュ画面でフリーズしてしまいます。

https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/Fusion-360-freezes-and-says-Not-Responding-shortly-after-it-is-opened.html

公式のトラブルシューティングでは「機械学習を無効にせよ」と書かれていたのですが、
コーポレートエディションでは(?)最近のバージョンでは(?)この項目はありませんでした。

代わりに Autodesk のフォルダにリアルタイム検索の除外設定、Fusion360 自体の信頼済み設定、をすれば良いようでした。

- タスクトレイのウィルスバスターのアイコンをダブルクリック
- 歯車マークの「設定」をクリック
- [保護]-[リアルタイム検索] の「検索除外」に以下を追加 ~
C:\Users\(ユーザー名)\AppData\Local\Autodesk ~
C:\Users\(ユーザー名)\AppData\Roaming\Autodesk
- [保護]-[信頼済みプログラム] に以下を追加 ~
C:\Users\(ユーザー名)\AppData\Local\Autodesk\webdeploy\production\XXXXX...XX\Fusion360.exe ~
プログラムの場所は Windows の [スタートメニュー]-[プログラム]-[Autodesk] の Autodesk Fusion 360 のアイコンを右クリックして [ファイルの場所を開く] したら、そこにある Autodesk Fusion 360 のアイコンを右クリックして [プロパティ] の中の [リンク先] を見ると分かる。

これで動きました。

新しいバージョンに更新すると Fusion360.exe の場所が変更になるのでまた指定しなおさなければならないのだと思います。

→ 最近は大丈夫そう???

* 初心者用チュートリアル [#yb6cbc19]

とりあえずこのあたりをやってみればいいのかな?

https://www.autodesk.co.jp/campaigns/fusion-360/tutorial/beginner

** これまで覚えた操作(よく使う操作) [#dccd0c96]

- スケッチ
-- 作成
--- L[ine] で線分&ドラッグで接線円弧
--- R[ectangle] で長方形
--- C[ircle] で円
--- D[imension] で寸法
--- X で点線と実線の切り替え
--- メニューから中心点円弧(角度は後から入れないと余計な補助線が書かれてしまう)
--- メニューから円形状パターン
-- 書いた線を右クリックから、中心線やコンストラクション線に変更
-- [修正] のフィレットや面取りはソリッドにしてからでも良いような?
-- 拘束
--- 水平・垂直
--- 一致 (点と点、点と線)
--- 接線
--- 等しい(サイズ)
--- 平行
--- 垂直(実際に交わっていない線分にも使える)
--- 中点
--- 同心円(中心点の一致を取りにくいほど円弧が大きいとき?)
--- 同一直線上(線と線(点と線ならは [一致] を使う))
--- 対称
-- 検査
--- I[nspect] で計測(図に書き込まない [寸法] のようなもの)
-- 画面表示
--- F6 で全体が入るようにズームを調整
- ソリッド
-- 作成(同時に結合ができる)
--- E で押し出し
--- メニューから 回転
--- H で穴
--- メニューから ねじ
-- 修正
--- Q でプレス・プル
--- F[illet] でフィレット
--- メニューから面取り
--- メニューから結合(複数のソリッドを1つにまとめられる。和、差、積などの演算も可能)
--- M[ove] で移動・コピー
-- 検査
--- 断面解析(どうやって元に戻すの?)
-- ボディを1つ選択して右クリックから [メッシュとして保存] を選ぶと STL にエクスポートできる

一連の操作に対して、後から「過去を修正」できるのが素晴らしいですね。

** コンポーネントを別コンポーネントの下へ移動したいができない [#a96f2c0f]

https://forums.autodesk.com/t5/fusion-design-validate-document/moving-components-into-another-component-is-not-working/m-p/8069447#M162673

によると、タイムラインのマーカーを一番右にしておかないとダメなのだそうだ。

* Python API に関する覚書 [#ne89fc6f]

** vscode の設定 [#v47a2ec5]

Fusion 360 の 「スクリプトとアドイン」 の「作成」や「編集」から VSCode を起動すると、
.vscode/settings.json などを自動的に作成してくれるので、
python.defaultInterpreterPath, python.analysis.extraPaths, python.autoComplete.extraPaths 
あたりを手動で設定する必要はない。

特に python.defaultInterpreterPath については Fusion 360 のアップデートごとにパスが変更になるので、
python インタープリタがうまく起動できなくなってしまったらもう一度 Fusion 360 から「編集」を選んで
.vscode/settings.json の設定を更新してもらう必要がある。

** デバッグの方法 [#aeb14771]

VSCode の Run and Debug で Python: Attach すればデバッガーを起動できる。


** カレントフォルダがパスに追加されない [#da14e846]

*** あんまり勧められない解決法 [#i44af1c8]

スクリプトと同じフォルダにある *.py ファイルのインクルードに失敗する

 LANG: python
 import sys
 import pathlib
 
 import adsk.cam
 import adsk.core
 import adsk.fusion
 
 # このフォルダーをパスに追加
 #!ここより上ではローカルファイルをインクルードしないこと
 # https://kantoku.hatenablog.com/entry/2022/09/08/172858
 THIS_DIR = str(pathlib.Path(__file__).resolve().parent)
 sys.path = [THIS_DIR] + [p for p in sys.path if THIS_DIR != p]

のようにして、検索パスの頭に現在のディレクトリを追加してしまうことができるらしい。

通常は自動的に追加されるのだけれど Fusion 360 から起動されたスクリプトではそれが入らない。~
https://docs.python.org/ja/3.12/library/sys_path_init.html

スクリプトの終了時には、

 LANG: python
 def restore_system_path():
     sys.path = [p for p in sys.path if THIS_DIR != p]

を呼んで元に戻す必要がある。

*** 本来の対処法 [#xe689b4c]

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-743C88FB-CA3F-44B0-B0B9-FCC378D0D782#Additional%20Python%20Modules

によると、スクリプトディレクトリの下に Modules のようなサブフォルダを作ってそこにモジュールファイルを入れる。

 C:\Users\(user)\AppData\Roaming\Autodesk\Autodesk Fusion 360\API\Scripts\
     script_name\
         __init__.py
         script_name.py
         Modules\
             __init__.py
             module1.py
             module2.py
             lib1\
                 __init__.py
                 lib1.py

そして、script_name.py からは

 LANG:python
 from .Modules import module1

のように相対 import で読み込む形が推奨されているらしい。

module1.py から module2.py や lib1.py を読むには
 LANG:python
 from . import module2
 from .lib1 import lib1

とする。

やってみると確かにこれで実行できるのだけれど、実行時に正しく相対 import が可能かどうかと、
pylint や MyPy が同様に相対 import を処理可能かどうかとが異なるようで、あっちを解決するとこっちに問題が生じる、みたいなことになって難儀した。

python の相対 import は困っている人が多いみたいなのだけどまともな解決法にはなかなかたどり着けない感じ。

かなり時間をかけて分かったこととしては、

- まずどこでエラーが出ているかを認識する
-- 実行時にエラーが出ているのか
-- pylint がエラーを出しているのか
-- MyPy がエラーを出しているのか
- 実行時のエラーを解消することが先決
-- Fusion のアップデートなどで python.exe およびその他のライブラリへの path が変更になっていることがあるので、Fusion360 のスクリプトダイアログから「編集」を押して .vscode/settings.json および .env を最新の環境に合わせて更新する
-- たぶんそれで実行できるようになるはず
- pylint がエラーを出す場合
-- [MASTER] の下に init-hook=init-hook='import sys; sys.path.append(".")' を追加すると解決したことがあったような気がするのだけれど、今試しに消してみてもエラーにならないので、別の原因だったのかもしれない?
- MyPy がエラーを出す場合
-- 各フォルダに __init__.py という名前の空のファイルを置くことでエラーを回避できた
-- https://qiita.com/Tomato_otamoT/items/df01c754225aebc5a9da ← こういうことらしい
-- 初心者泣かせすぎる

** インポートしたモジュールが更新されない [#zedbf80c]

import して使っているサブモジュールを編集してもその編集が反映されない。

 LANG: python
 import importlib
  
 def run(_):
     try:
         # サブモジュールを強制的にリロードする
         importlib.invalidate_caches()


のようにして強制的にリロードする必要がある。

** adsk.core.EventHandler が実行時に存在しない [#g7e14752]

イベントハンドラを取っておくリストを

 LANG: python
    _handlers: list[adsk.core.EventHandler] = []

のように確保していたところ、

 LANG: python
    _handlers: list[adsk.core.EventHandler] = []
                    ^^^^^^^^^^^^^^^^^^^^^^
 AttributeError: module 'adsk.core' has no attribute 'EventHandler'

というエラーが発生してしまった。

バグっぽい???

さしあたり、

 LANG: python
 _handlers: list[
     adsk.core.ApplicationCommandEventHandler
     | adsk.core.CommandCreatedEventHandler
     | adsk.core.CommandEventHandler
     | adsk.core.InputChangedEventHandler
 ] = []

のように個別の型を列挙することで回避した。

** コンポーネントの作成方法 [#sd3084ea]

ユーザが選択しているアクティブなコンポーネント(オカレンス)の下に新しいコンポーネントを作成、その下にスケッチを作成するイディオム:

 LANG: python
     app = adsk.core.Application.get()
     design = adsk.fusion.Design.cast(app.activeProduct)
 
     occurrence = design.activeComponent.occurrences.addNewComponent(adsk.core.Matrix3D.create())
     if design.activeOccurrence is not None:
         occurrence = occurrence.createForAssemblyContext(design.activeOccurrence)
     occurrence.isGroundToParent = False
     comp = occurrence.component
 
     sketch = comp.sketches.add(gear.xYConstructionPlane).createForAssemblyContext(occurrence)

現在アクティブなコンポーネントやオカレンスは design.activeComponent や design.activeOccurrence で得られる。

作成したコンポーネントやスケッチはそのままだと座標系と結びつかないため、createForAssemblyContext でオカレンスと結び付けておく必要がある。

** defineAsFreeMove による移動 [#e44585e2]

行列を与えることで自由に移動できて便利なのだけれど、親コンポーネント(オカレンス)が原点から移動されている場合、ワールド座標系を基準に移動・回転されても困る。

そこで、親コンポーネント(オカレンス)の座標系を基準として動かすための関数がこちら。

 LANG:python
 def comp_move_free(
     occurrence: adsk.fusion.Occurrence,
     entities: adsk.core.Base | Iterable[adsk.core.Base],
     matrixes: adsk.core.Matrix3D,
 ):
     """entities を occurrence の座標系を基準に matrix で指定されただけ移動する"""
 
     # matrix の調整
     (trans_inv := occurrence.transform2.copy()).invert()
     matrices= [trans_inv, matrix, occurrence.transform2]
     matrix = adsk.core.Matrix3D.create()
     for m in matrices:
         matrix.transformBy(m)
     if matrix.isEqualTo(adsk.core.Matrix3D.create()):
         return None # 移動の必要なし
 
     # entities を list にする
     if isinstance(entities, Iterable):
        entities = list(entities)
     else:
        entities = [entities]
     collection = adsk.core.ObjectCollection.createWithArray(entities)
 
     # 移動する
     comp = occurrence.component
     inp = comp.features.moveFeatures.createInput2(collection)
     inp.defineAsFreeMove(matrix)
     return comp.features.moveFeatures.add(inp)

* コメント・質問 [#u54c5099]

#article_kcaptcha

Counter: 4816 (from 2010/06/03), today: 3, yesterday: 2