C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

Selection Filtersの不具合に挑む

先日、PreSelectイベントの存在に気が付きました。
PreSelectイベントサンプル - C#ATIA


個人的には "選択する直前に発生するイベント" と言うより
"選択可能な要素の上にマウスカーソルが乗った際に発生するイベント"
と思っています。


古い記載ですが、こちらの不具合をテストしたことがあります。
Select SketchConstraints using api - Autodesk Community
まぁ正直なところ、スケッチの拘束のみを選択するスクリプト
何に役立つのか想像出来ないのですが、確かに不具合の様で
エラーとはならないものの、選択が出来ません。

先日のPreSelectイベントを利用することで、この問題を解決出来るだろうを
思いました。

長いので、こちらにupしています。
GitHub - kantoku-code/Fusion360-SelectFilter_T_Sample: Fusion360API Python script


PreSelectイベントのargsを利用すると、選択せずに要素の取得が出来ます。

hoge = args.selection.entity

この型をチェックすることで、フィルターとしての役割をさせます。

生憎、問題となる "SketchConstraints" と言う型は無いので、それっぽい

'SketchAngularDimension'
'SketchConcentricCircleDimension'
'SketchDiameterDimension'
'SketchLinearDimension'
'SketchEllipseMajorRadiusDimension'
'SketchEllipseMinorRadiusDimension'
'SketchOffsetDimension'
'SketchRadialDimension'

であることをチェックします。今思うと、'Sketch'と'Dimension'を
正規表現でチェックすればカッコよかったなぁ・・・。

と、ここまでは何の問題も無く思い付きました。
問題は、インスタンスのSelectionCommandInput毎にこのフィルターを
持たせてやりたいんです。

よくわかっていないのですが、プロパティを動的に付加すれば良いじゃん
と思いこんな感じで行いました。

selSktCon = inputs.addSelectionInput(hoge,piyo,huga)
selSktCon.filterT = 'SketchAngularDimension'

これ駄目っぽいんです。メソッドは許されるのにプロパティは駄目なんですね。
正しくは、設定出来るのですがフィルタリングするためにPreSelectイベントで
呼び出すと消えちゃいます・・・。

adsk.core.SelectionCommandInput.filterT = 'SketchAngularDimension'

これは許してくれるのですが、これではクラス変数となり各インスタンス
では無いため、無意味なんです。


続いてメタプログラミング的な方法なこちらのsetattr,getattrを使ったものの
setattr属性の追加 - Python学習講座
上記と同様、フィルタリング時には使えない。


続いて思い付いたのが、Fusion361APIのオブジェクトには、属性(attribute)を
持たせる事が可能なものがあります。例えば面要素のBRepFace何かそうです。
Fusion 360 Help
(記憶だと、この情報もファイルに保存されるはずです)
でも、SelectionCommandInputにはattributesプロパティが無いんです・・・。


結局、フィルタを
{SelectionCommandInput : list[フィルタとなるTYPE]}
の形のスコープのデカい辞書を用意し、やり取りするための
拡張メソッドを諸々用意してみました。
スコープのデカいので、メソッド経由では無くても書き換えられちゃうん
ですけどね。もっと良い方法が有りそうな気がする。


フォーラムに僕が記載した "SphericalFaces" フィルタもこんな感じの
方法で解決まではたどり着けるけど、もっと奥深くしなきゃならないので
割愛しておきます。