先日、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プロパティが無いんです・・・。
結局、フィルタを
{
の形のスコープのデカい辞書を用意し、やり取りするための
拡張メソッドを諸々用意してみました。
スコープのデカいので、メソッド経由では無くても書き換えられちゃうん
ですけどね。もっと良い方法が有りそうな気がする。
フォーラムに僕が記載した "SphericalFaces" フィルタもこんな感じの
方法で解決まではたどり着けるけど、もっと奥深くしなきゃならないので
割愛しておきます。