C#ATIA

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

apperを食す5

こちらの続きです。
apperを食す4 - C#ATIA

やっと加工出来ました。
Re: 2回転のメビウスの帯 - Autodesk Community

しつこいのですがこれです。
f:id:kandennti:20210317084244p:plain

5個に分割したのはこんな感じです。
f:id:kandennti:20210316104605j:plain
加工自体は、片側30分以内で加工出来ていた記憶なので、
0.5h x 5(個) x 2(表裏) = 5.0h
以内です。


3軸でも一体で加工したいのですが、単純な6方向じゃ削り残っちゃうことは
確認してます。どうすれば良いのかな・・・。

押し出しを押し出さずに掘り下げる1

自分がFusion360APIを取り組み始めた際、どの様に進めていったのか
よく覚えていないのですが・・・調べてみると、3個目でイベント使って
いるとは。結構尖ってました。


最近になり気が付いたのですが、"Fusion360APIで操作の記録が出来ない"
と言う現実から考え、最初に取り組むべきはサンプルコードの改造が一番
取り掛かりやすいと感じています。

念の為、今回はこの様の環境で試しています。
Fusion360 Ver2.0.9849
・Win10
・ms-python.python v2021.2.633441544
尚、python的な説明は行いません。(僕も細かな事がわかっていませんので)


まず、こちらの "素のコード" の方法で、新規のスプリクトを作成します。
Fusion360のスクリプト/アドインの登録 - C#ATIA

"編集" ボタンを押すとVSCodeが起動すると何やらコードが記載されています。
折角なので、実行してみましょう。VSCodeからデバッグとして実行する方法が
Web関係の実行方法とちょっと異なる事を最近知りました。

f:id:kandennti:20210311145452p:plain
手順としては、
アクティビティーバーの "A" をクリック。サイドバーが切り替わります。
続いてサイドバーの一番上の "Python:Attach" の左にある三角 "B" をクリック。
これだけで実行されてしまうと思います。
念の為、 コードを修正し再度実行したい場合は、"C" 部分をクリックすると
再度実行になります。(未保存で実行しても、実行直前に強制保存されます。)

もっと細かな操作は、こちらをご覧になるとよろしいかと思います。
Fusion 360 Help

実行結果としては 'Hello script' とダイアログが表示されます。
・・・表示されるだけです。まぁ画像も要らないでしょう。


"もうちょっとFusion360APIらしいものを" と思うので、ドキュメントのこちらを
お借りしましょう。
Fusion 360 Help

押し出しのサンプルです。何はともあれ、実行してみましょう。
f:id:kandennti:20210311145815p:plain
タイムラインを見ると

スケッチ -> コンポーネント新作 -> 押し出し

を実行した事がわかります。
又、よく見てみると新たなドキュメントも作成されています。
f:id:kandennti:20210311145902p:plain
つまりそれらの処理が書かれているってことですね! それらを見てみましょう。

まず、サンプルが読みにくいため、コメントの日本語化と追記し、型ヒントを
利用した状態に修正して見ました。処理内容は変更していません。

import adsk.core, adsk.fusion, traceback

def run(context):
    ui :adsk.core.UserInterface = None
    try:
        # Fusion360取得
        app :adsk.core.Application = adsk.core.Application.get()

        # ユーザーインターフェース取得
        ui = app.userInterface

        # 新たなドキュメント作成
        doc :adsk.fusion.FusionDocument = app.documents.add(
            adsk.core.DocumentTypes.FusionDesignDocumentType)

        # デザイン取得
        design :adsk.fusion.Design = app.activeProduct

        # アクティブなデザインのルートコンポーネントを取得
        rootComp :adsk.fusion.Component = design.rootComponent

        # xy平面に新しいスケッチを作成
        sketches :adsk.fusion.Sketches = rootComp.sketches
        xyPlane :adsk.fusion.ConstructionPlane = rootComp.xYConstructionPlane
        sketch :adsk.fusion.Sketch = sketches.add(xyPlane)

        # 円を描く
        circles :adsk.fusion.SketchCircles = sketch.sketchCurves.sketchCircles
        circle1 :adsk.fusion.SketchCircle = circles.addByCenterRadius(
            adsk.core.Point3D.create(0, 0, 0), 2)

        # 円で定義されたプロファイルを取得
        prof :adsk.fusion.Profile = sketch.profiles.item(0)

        # 範囲が5cm
        distance :adsk.core.ValueInput = adsk.core.ValueInput.createByReal(5)

        # 押し出しを作成
        extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures
        ext :adsk.fusion.ExtendFeature = extrudes.addSimple(
            prof,
            distance,
            adsk.fusion.FeatureOperations.NewComponentFeatureOperation)
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

本来、ここまで型ヒントを使う必要は無いとは思いますが、過剰な程やっています。
(横長の状態が嫌な為、オリジナルで1行の部分も適当に改行しています)

通常であれば、処理の最初の方から順番に "※※は▽▽の機能です" の様な説明を
するものですが、性格が歪んでいる為、逆から行います。

まず、最後の方のここをコメント化します。4行になっていますが、実質1行です。

・・・
        # 押し出しを作成
        extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures
        # ext :adsk.fusion.ExtendFeature = extrudes.addSimple(
        #     prof,
        #     distance,
        #     adsk.fusion.FeatureOperations.NewComponentFeatureOperation)
    except:
・・・

この状態で、実行すると
f:id:kandennti:20210311150515p:plain
スケッチだけになってしまいました。コメント化した部分のみで
コンポーネント新作 -> 押し出し” を実行している事が分かります。

コメント化したaddSimpleメソッドは、こちらです。
Fusion 360 Help
"profile" と "distance" と "operation" の3つのパラメータを受け取り、
ExtrudeFeatureオブジェクトを返してきます。

それぞれGUIでの表示はこんな感じです。
f:id:kandennti:20210311150843p:plain
まぁ日本語にすれば察しはつきます。

"profile" はGUI同様、スケッチの要素で囲まれている領域ですね。

意外なのは "distance" がdouble(pythonではfloat)型では無いところです。
これは距離では、式が利用出来たり、単位を付けられたりする為だと思われます。

"operation" は、FeatureOperations列挙型です。
Fusion 360 Help
使われていた "NewComponentFeatureOperation" は、新しいボディを作りつつ、
新たなコンポーネントに入れる事の様です。・・・GUIではありませんね。
f:id:kandennti:20210311150829p:plain
コンポーネントを作成している犯人はわかりました。


折角なので、ここでコンポーネントを作成しないでボディだけ新作してみましょう。
コメント化した部分は元に戻し、"operation" の部分のみを書き換えます。

・・・
        # 押し出しを作成
        extrudes :adsk.fusion.ExtendFeatures = rootComp.features.extrudeFeatures
        ext :adsk.fusion.ExtendFeature = extrudes.addSimple(
            prof,
            distance,
            adsk.fusion.FeatureOperations.NewBodyFeatureOperation) #ここ修正
    except:
・・・

念の為、Fusion360の編集からVSCodeを起動すると、"."を書いた時点でインテリセンスで
メソッド・プロパティ類が候補として表示されます。
f:id:kandennti:20210311151018p:plain
型ヒントを使用すると楽ですね。

これを実行すると
f:id:kandennti:20210311151045p:plain
形状は変わりませんが、コンポーネントは作成されずボディが出来ました。

手動NC

しばらくフォーラムのポストコンフィグに取り組みました。
解決済み: 製造の中にある手動NCのメッセージ表示、呼び出しプログラムを対応と変更したい。 - Autodesk Community


"手動NC" は機能がある事は知っていたのですが、利用している実績を
知りませんでした。(確か海外のサイトのチュートリアルで見たぐらいです)

PowerMillの場合、タップの加工前に切り子を除去したいのでM00を入れたいとか
ポストのファイル内で、工具の種類で判断して追記したりするのですが、
手動NCの場合、工程そのものにM00を追加する感じです。

必要な条件を箇条書きに出来るような場合は、コンピュータに任せて処理した方が
間違いないのでそのようにしますが、人間が何となく判断するようなものは
コンピュータでは判断出来ませんよね?(将来AIが何とかする?)

そうなると、ポスト処理後にNCプログラムをエディタで編集するしか方法が
無いのですが、それを行うと機械をドカンとやってしまう可能性が高まります。


今まで使用してきたCAMソフトでは、Fusion360の手動NCのような機能が有りません
でした。イレギュラーなパターンに柔軟な対応が出来る機能です。
新鮮で強力な機能な気がします。PowerMillにも欲しい。

寄せ集め

いかん。すっかりブログを更新していませんでした。

最大の理由はこちら。
electron - C#ATIA

Javascript+html+CSSが分かっていない状態で取り組んでいる事が原因で
ちっとも理解出来ていない為、electronの前にweb絡みの本も追加購入。

にしても、相変わらず理解に苦しんでます。世の中の先端がこれだと考えると
皆さん良くこんなの書けるなと感心します。とにかく書きにくい。



Fusion360に関してはチョロチョロフォーラムには書いてます。
・全てのスケッチテキストのフォントを変更する。(イマイチです)
Solved: Re: Script to edit font across multiple sketches - Autodesk Community

・パターンで作成されたBodyの属性を反映する。確認する。(質問者さんは不満足)
Re: Object: attributes - Autodesk Community


これ自分じゃないけど、環境を変更する方法。
ツールバーからcontrolDefinitionを取得してゴニョゴニョするやつ。
忘れちゃうんだよなぁ。
Solved: Re: Commands to change View Environment? - Autodesk Community


こちらはちょっと頑張りたい。
Re: 大規模アセンブリを動かす方法の一つとして - Autodesk Community

自分で、やっぱりJavascriptをやりたくないんだろうなぁ と感じる。

APIリファレンスマニュアル

そう言えば、昨年の最後に "もっと初心者向けのコンテンツを書こう” って
書いたくせに1個も書いてません。(既に3月)

いや、1個だけありました。これは役立つと信じたい。
Fusion360のスクリプト/アドインの登録 - C#ATIA

探してみると、既にreisyuさんがキッチリ書かれたシリーズがあるんですよね。
Fusion 360 を Pythonで動かそう その1 スクリプトの新規作成 - Qiita
(2021/2/27現在 1~11まであります)

そうなると、何をネタにしようか迷ったのですが、何時もお世話になるAPI
リファレンスマニュアルについて書いておくことにします。
念の為、動作環境は
Fusion360 Ver2.0.9719
・OS Win10
・ブラウザ Google Chrome
で、pythonとしてお話進めます。




APIリファレンスマニュアル(以下APIリファレンス) アクセス/入手

Fusion360の場合、Microsoft社のOffice製品の "マクロの記録" のような操作を
コード化するような機能が有りません。残念な事にゴリゴリ書くしか方法がありません。

そうなると頼るものがAPIリファレンスとサンプルコードしかないのですが、
APIリファレンスは英語版しかありません。既にハードルを上げまくっている
のですが、現実なので仕方がありません。

実はAPIリファレンスは2種類あります。一つはオンライン版で、こちらです。
Fusion 360 Help

もう一つはオフライン版です。
Getting Offline Access to the Fusion 360 API Help - Ekins Solutions, LLC
(上記オンライン版のページにもオフライン版がダウンロード出来ます)

オフライン版はちょっと古いので、比較的新しい機能は記載されていないと思います。
(過去に何度かオンライン版のサーバーがダウンしていたことがあり、Ekins氏の好意で
Upされています。偶に更新したファイルに変更してくれているようです。)

情報量や使い勝手を考え、オンライン版でお話を進めます。

目的のオブジェクトを手っ取り早く見つけだす

MS Office等の場合は、目的の文字を選択状態にしF1キーを押すとHelpが表示されますが、
Fusion360の場合はその様な方法はありません。

APIに関しては、サイドバーの下の方はこのような感じです。まぁ見たままですが。
f:id:kandennti:20210301001139p:plain

  • Welcome to the Fusion 360 API:大まかな概要
  • What's New in the Fusion 360 API:大きめのUpdateの際に追加された機能の説明
  • Fusion 360 API User's Manual:Fusion360APIの考え方や機能の説明(かなり重要)
  • Fusion 360 API Reference Manual:各オブジェクトや定数のリファレンスマニュアル
  • Sample Programs:サンプルプログラム(確か殆どスクリプト

主に利用する事になるのは、"Fusion 360 API Reference Manual" - "Objects" です。
例えば、みんな大好きSketchオブジェクトを調べたい時のおススメの方法です。

  • まず "Objects" のTreeを開いて表示させます。

f:id:kandennti:20210301001427p:plain

  • Ctrl + F で文字の検索バーを表示させ "sketch" を検索。Hitしたら候補を順にさせると、比較的早く見つかるはずです。

f:id:kandennti:20210301001440p:plain

各オブジェクトを知る

折角検索したので、Sketchオブジェクトを見てみましょう。
f:id:kandennti:20210301001530p:plain
1:オブジェクト名です。
2:スーパークラスです。まぁあまり関係無いかも・・・。
3:オブジェクトの説明です。
4:メソッドです。表現として正しくないかも知れませんが、関数です。

f:id:kandennti:20210301001557p:plain
5:プロパティです。表現として正しくないかも知れませんが、変数です。

f:id:kandennti:20210301001619p:plain
6:このオブジェクトのアクセス元です。主にこのオブジェクトのコレクションや
  このオブジェクトをプロパティとしているアクセス元です。
7:サンプルコードへのリンク。
8:このオブジェクトを導入した時期です。これもあまり関係無いです。

Sketchオブジェクトにはありませんが、イベントや派生先のオブジェクトも
記載されたりしているオブジェクトもあります。


実際に頻繁に利用するのは、メソッドとプロパティです。
それぞれの詳細はクリックする事で見れます。スケッチの原点を示す
originプロパティを見てみます。
f:id:kandennti:20210301001716p:plain
A:プロパティ名です。
B:このプロパティの所有オブジェクトです。
C:プロパティの説明です。
D:説明の言語の切り替えタブです。
E:使い方です。
F:プロパティの値の説明と値の型です。型に関してはpythonの場合、動的型付け言語
 の為、あまり大きな意味も無いように感じますが、プロパティが読み書き可能(read/write)
 なものか、読み込み専用(read only)なのかが記載されており重要です。
G:このプロパティを導入した時期です。これもあまり関係無いです。

メソッドに関してもほぼ同様な感じですが、引数(パラメータ)や戻り値の説明等も有ります。
又、メソッドの場合は "E" も重要です。引数の数・種類や戻り値の受け方も知る必要が
有ります。


自分の場合、プロパティやメソッド名をクリックしてリンクを開くより、右クリックで
新たなタブを開く事の方が遥かに多いです。(行ったり来たりを避けたい)
f:id:kandennti:20210301001956p:plain
新たなタブを開く方法ですが、サイドバー側で行うと100%リンク切れ(エラー404)に
なります。サイト側は極稀にリンク切れも有りますが、ほぼ大丈夫です。



と、ここまで書いたものの、薄い内容しか記載していないですね・・・。
逆に迷ってしまうだろうか?

Fusion360 with PowerMill

全然気が付きませんでした。
Solved: Fusion 360 with PowerMill Ultimate - Autodesk Community
昨年の8月じゃない・・・。うちがPowerMillの保守を切ってしまった上、
フォーラムも見ていなかった為、気が付きませんでした。

前々から噂があったり、ライセンス絡みでそれらしき雰囲気はありました。
今の所、製品名だけが変更されたのみっぽいのですが・・・。

PowerMillユーザーが一緒になる事を拒否する一番の理由は、あまりに機能に
差があるからだろうと思います。(僕も一緒になって欲しくない と思ってます)

知名度の低いPowerXXX製品に、"Fusion360" の冠を付けた方が知名度
上がる と言う狙いもあるのかな?

electron

以前何処かに記載したような記憶なのですが、時間があるため業務で使用する為の
アプリを作ろうかと考えてます。・・・出来るかな?

悩みまくったけれどelectronにしようかと考えてます。
Javascript+html+CSSでデスクトップアプリが作成可能なのですが、
何れも持ち合わせていない技術です。ゴールまで辿り着けるのだろうか?

技術的な情報は、Fusion360APIとは比較にならないぐらいあるのですが、
サンプルを探し回ったこれが良いのかな?
GitHub - LeeDDHH/electron-api-demos-ja: Electron APIに触れてみる

本も購入し(UI絡みの記述が多く、心が折れる)、ここに記載したから
もう逃げられないな。(イザと言う時は逃げるけど)