C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

Fusion360API VSCodeでの極小Tips

タイトルは省略しましたが、正しくは
Fusion360スクリプト/アドインをPythonで開発する際、VSCodeの下らない程の些細なTips”
です。今まで試してきて "これは!" と思う事を思い出せる範囲で。

環境&お断り

・Win10 Pro/Home
Fusion360 Ver2.0.8624
VSCode Ver1.47.2
・ms-Pythpn Ver2020.6.91350 (又は 2020.5.78807)
すいません、環境が無い為MACはわかりません。又、C++も試していない為わかりませんが
類似している部分はあるはずです。

又、Updateのペースが早いため、記載内容が不適切になっている可能性が高いです。
寿命としては半年も無いかも知れません。

Fusion360からVSCodeが起動しない1

まさかこれを書いている時に出くわすとは・・・。
「ms-Pythpn」のバージョンの影響で起動しない場合があります。
古い「ms-Pythpn」をインストールする方法が以前はVSCode上で可能でしたが
現状は出来なくなっています。
f:id:kandennti:20200728102549p:plain
※追記しますが、マーケットプレイスのバグだそうです。
そのうち治るかも知れません。
visual studio code - How to install previous version of Python extension for VSCode - Stack Overflow



VSCode拡張機能の自動更新を無効にする

  他にも方法あると思いますが、ここ。
f:id:kandennti:20200728102705p:plain
 これは基本的に無効にしていた方が良さそうです。必須です。

Fusion360VSCodeを落とす
・「ms-Pythpn」を削除

 拡張がインストールされている場合は、フォルダ自体を削除した方が良さそうです。
 恐らくここに拡張のフォルダがあるはずです。

C:\Users<ユーザー名>\.vscode\extensions\ms-python.python-<バージョン>

 まぁ別の所に移動しちゃっても良いかもしれませんが。

・古い「ms-Pythpn」のVSIXファイルをDLする。

 「Ver2020.5.78807以降は使いたくない」と言う情報が有ったので、そうしておきます。
Release 2020.5.78807 · microsoft/vscode-python · GitHub
僕はVer2020.6.91350で使ってます。
Release 2020.6.91350 · microsoft/vscode-python · GitHub
 一番下のここにクリック。
f:id:kandennti:20200728103259p:plain

・VSIXファイルインストール

 ここをご参考下さい。
VSCodeの拡張機能をバージョン指定でインストールする方法をまとめてみた. - Qiita


重要なので再度お伝えしますが、
VSCode拡張機能の自動更新を無効は必須です。


Fusion360からVSCodeが起動しない2

上記で対応出来ない場合、非常に面倒なのですがFusion360VSCode共に
完全なるアンインストール&再インストールするしかない様な気がしてます。
Fusion360からVSCodeが起動しなくなった時の対処方法 - C#ATIA

VSCodeデバッグ出来ない

過去に何度かデバッグ出来ない状態 ”socket.timeout: timed out” エラーを
経験しています。(実行はOKでデバッグがNGな状態)
Solved: socket.timeout: timed out - Autodesk Community
原因ははっきりしていないのですが、解決方法は簡単です。
Fusion360のUpdateを待つのみです。

「ms-Pythpn」のUpdateが関係している可能性もあるので、こちらの
拡張機能の自動更新を無効にする」状態にすることで効果があるかも
しれませんが、個人的にFusion360のUpdateが一番の原因のような
気はしています。

adsk.core .fusion .cam のインポート問題1

VSCodeの左下の警告(赤印)が出ている部分をクリックし、問題(黄印)を表示させた際
グズグズとメッセージが出てきますが、これは解決させる方法を知りません。
(少し下に記載した「静的構文チェックpylintを無効にする」で解消するかも。)
但し、実行もデバッグも問題無く出来ます。
f:id:kandennti:20200728103855p:plain


adsk.core .fusion .cam のインポート問題2

デバッグ時は通常は黄印部分でVSCodeから実行させることになると思いますが、
あまりに初歩的なエラーな場合、実行する事が出来ません。
実行さえ出来れば、tracebackでエラーの位置や内容を把握することが
出来るのですが・・・。(コードをそのようにしておく必要があります)

そのような場合、ターミナルから実行する(赤印)とかなりヒントが得られます。
f:id:kandennti:20200728104026p:plain
ところが、通常新規で作ったスクリプトの場合、adsk.core .fusion .cam の
インポートについてのエラーとなり、肝心なエラー部分までたどり着けません。

それを解決する方法が、こちらです。
ターミナルで実行の 'adsk' モジュール見つからん問題解消 - C#ATIA


静的構文チェックpylintを無効にする

エディタ上で構文チェックでエラーとなっている場合、下に波線が表示されます。
f:id:kandennti:20200728104117p:plain
拡張で「pylint」がインストールされている場合は、コンテキストメニュー
(右クリック)の「無効」で解消するはずです。
f:id:kandennti:20200728104126p:plain
結果的に、こちらの記載されている「pylintを無効化する」と同じことだと
思ってます。
VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する - Qiita
個人的には、無効にしていないです。(他の警告も表示されないので)

スクリプト新作時の雛形

スクリプト新作時の雛形はインストールフォルダ内にあります。
毎回書き換えているのであれば、雛形を書き換えてしまえば便利です。
スクリプト新作時の雛形 - C#ATIA
コメントに記載していますが、Update後も書き換えられません。
又、アドインの雛形は別のところにあります。(察してください)

削除したらどうなるか?

※本機能は、紛らわしいと言う事でVer2.0.8749から削除されました。
任意のスクリプト/アドインのコンテキストメニューで表示される「削除」を
押したらどうなるか? と言う事です。
結論としてはファイルやフォルダは削除されません。
但し、再度利用出来る状態にするには、ひと手間必要でこちらに記載があります。
Mod the Machine: Un-remove Fusion 360 add-in


VSCodeの起動のしかた

VSCodeは単体で起動してもFusion360APIにアクセス出来ません。
必ずFusion360からVSCodeを起動する必要があります。

Fusion360からVSCodeを起動する際は恐らくこちらの2つの方法があると思っています。
f:id:kandennti:20200728104506p:plain
両方とも基本的には同じですが緑印から起動すると、実行時に先頭付近で一度
止まるような仕組みになっているようです。
面倒なのでいつも「編集」から起動しちゃってます。

デバック実行ファイルを切り替え

これ最近知りました。
Fusion360スクリプトのファイル構成のお話です。仮に「NewScript1」とした場合
「NewScript1」フォルダ
 L NewScript1.manifest
  L NewScript1.py
の状態になっている必要があります。(ファイルの中身もそれなりに)
そのような状態で「Hoge.py」を実行したいなぁ と言う場面です。
f:id:kandennti:20200728104545p:plain

デバッグ起動のこちらが表示されているなら切断する。
f:id:kandennti:20200728104554p:plain

Hoge.py」をアクティブにし再度デバッグのアタッチ
f:id:kandennti:20200728104605p:plain

他の方がこの方法を使う場面があるものか不明ですが・・・。

デバッグ時のコードコピペ

ちょっと込み入ったお話ですが早い話が "手抜きしたい" と言うお話です。
例えばこんな感じでスケッチの円を描いたデータを用意します。
f:id:kandennti:20200728104657p:plain
この円の直径をダイアログで表示させると言う、意味も無いものを作ろうとします。

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        des :adsk.fusion.Design = app.activeProduct
        root = des.rootComponent

        skt = root.sketches[0]
        pass

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

ここまでは雛形をチョロチョロっと変更したもので、円の描かれているスケッチまでを
取得しています。これを実行する前に "pass" にブレークポイントを設定します。
f:id:kandennti:20200728104712p:plain

これで実行した際、当然ブレークポイントで止まりますが目的の円はここに入ってます。
f:id:kandennti:20200728104744p:plain
「何でそこに入っているってわかるの?」と言うのは別として、入ってます。
それをお伝えするのが目的では無いので・・・。

「SketchCircles」上でコンテキストメニューを表示させるとこんな感じです。
f:id:kandennti:20200728105009p:plain
「式としてコピー」を選択しコード側にペーストすると
f:id:kandennti:20200728105027p:plain
コードとして利用出来る状態でペーストしてくれます。
プロパティの値を利用したければ「値のコピー」を利用すると便利ですが、
オブジェクトの場合はあまり意味が無いかも。

そんな感じで行うと、比較的手間なく完成します。

・・・
        skt = root.sketches[0]
        circle = skt.sketchCurves.sketchCircles[0]
        ui.messageBox('Diameter : {}'.format(circle.radius * 2))
・・・

小言

過去ログ見たら、SpyderからVSCodeに切り替わってから1年経っていないようです。
正直な所、以前に比べトラブルが激増しました。間違いないです。
それでも切り替わったことにより、変数が階層状態で確認出来るようになった
メリットは大きく、個人的には理解が桁違いに深まりました。
でも、トラブル多すぎかな・・・。