ソフトウェア/Fusion360 の履歴(No.14)
更新Fusion 360 について†
目次です:
ウィルスバスターが動いていると起動しない†
Autodesk Fusion 360 が初期スプラッシュ画面でフリーズしてしまいます。
公式のトラブルシューティングでは「機械学習を無効にせよ」と書かれていたのですが、 コーポレートエディションでは(?)最近のバージョンでは(?)この項目はありませんでした。
代わりに 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 の場所が変更になるのでまた指定しなおさなければならないのだと思います。
→ 最近は大丈夫そう???
初心者用チュートリアル†
とりあえずこのあたりをやってみればいいのかな?
https://www.autodesk.co.jp/campaigns/fusion-360/tutorial/beginner
これまで覚えた操作(よく使う操作)†
- スケッチ
- 作成
- L[ine] で線分&ドラッグで接線円弧
- R[ectangle] で長方形
- C[ircle] で円
- D[imension] で寸法
- メニューから中心点円弧(角度は後から入れないと余計な補助線が書かれてしまう)
- メニューから円形状パターン
- 書いた線を右クリックから、中心線やコンストラクション線に変更
- [修正] のフィレットや面取りはソリッドにしてからでも良いような?
- 拘束
- 水平・垂直
- 一致 (点と点、点と線)
- 接線
- 等しい(サイズ)
- 平行
- 垂直(実際に交わっていない線分にも使える)
- 中点
- 同心円(中心点の一致を取りにくいほど円弧が大きいとき?)
- 同一直線上(線と線(点と線ならは [一致] を使う))
- 対称
- 検査
- I[nspect] で計測(図に書き込まない [寸法] のようなもの)
- 画面表示
- F6 で全体が入るようにズームを調整
- 作成
- ソリッド
- 作成(同時に結合ができる)
- E で押し出し
- メニューから 回転
- H で穴
- メニューから ねじ
- 修正
- Q でプレス・プル
- F[illet] でフィレット
- メニューから面取り
- メニューから結合(複数のソリッドを1つにまとめられる。和、差、積などの演算も可能)
- M[ove] で移動・コピー
- 検査
- 断面解析(どうやって元に戻すの?)
- ボディを1つ選択して右クリックから [メッシュとして保存] を選ぶと STL にエクスポートできる
- 作成(同時に結合ができる)
一連の操作に対して、後から「過去を修正」できるのが素晴らしいですね。
Python API に関する覚書†
vscode の設定†
Fusion 360 の 「スクリプトとアドイン」 の「作成」や「編集」から VSCode を起動すると、 .vscode/settings.json などを自動的に作成してくれるので、 python.defaultInterpreterPath, python.analysis.extraPaths, python.autoComplete.extraPaths あたりを手動で設定する必要はない。
特に python.defaultInterpreterPath については Fusion 360 のアップデートごとにパスが変更になるので、 python インタープリタがうまく起動できなくなってしまったらもう一度 Fusion 360 から「編集」を選んで .vscode/settings.json の設定を更新してもらう必要がある。
デバッグの方法†
VSCode の Run and Debug で Python: Attach すればデバッガーを起動できる。
カレントフォルダがパスに追加されない†
あんまり勧められない解決法†
スクリプトと同じフォルダにある *.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]
を呼んで元に戻す必要がある。
本来の対処法†
によると、スクリプトディレクトリの下に 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 ← こういうことらしい
- 初心者泣かせすぎる
インポートしたモジュールが更新されない†
import して使っているサブモジュールを編集してもその編集が反映されない。
LANG: python import importlib def run(_): try: # サブモジュールを強制的にリロードする importlib.invalidate_caches()
のようにして強制的にリロードする必要がある。
adsk.core.EventHandler が実行時に存在しない†
イベントハンドラを取っておくリストを
LANG: python _handlers: list[adsk.core.EventHandler] = []
のように確保していたところ、
_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 ] = []
とすることで回避した。