本日のお題は『選択した要素を取得する ~getSelectionEx編~』です。
以前『getSelection編』を紹介していましたが、実は選択用のAPIはもう一つあります。
それが『getSelectionEx』です。
実はこのAPIはすでに、他の記事でちょこちょこ使用していたのにお気づきでしょうか。
後出しになりましたが、私自身の整理も兼ねて一応記事にします。
1. 環境
- FreeCAD 0.18
2. getSelectionExを使用する場面
getSelectionExはAPIドキュメントを見る限りでは、選択したEdgeやFaceといった構成要素(SubObject)を取得するときに使用するようです。
Selection API - FreeCAD Documentation
確かに以前使用した『getSelection』メソッドは、Documentオブジェクトのようなツリービューにあるオブジェクトは取れるものの、EdgeやFaceを直接取得できませんでした。
3. どうやって使うのか?
使用方法は以前紹介した『getSelection』と同様です。
要素を選択した状態でマクロを起動すると、本メソッドの戻り値に選択した要素が返ってきます。
4. プログラムを書いてみよう
一応、違いを明確にするため、getSelectionとgetSelectionExで取得された要素のTypeIdを確認してみます。
TypeIdにはそのオブジェクトのクラス名らしきものが表記されるので、何が入っているのかなんとなくわかります。
# -*- coding: utf-8 -*- import FreeCAD import FreeCADGui sel = FreeCADGui.Selection.getSelectionEx() sel2 = FreeCADGui.Selection.getSelection() if(len(sel) != 0): FreeCAD.Console.PrintMessage("getSelectionEx⇒ " + str(sel[0].TypeId) + "\n") FreeCAD.Console.PrintMessage("getSelection⇒ " + str(sel2[0].TypeId) + "\n")
5. 実行結果
今回はFreeCADのサンプルデータとして用意されているPartDesignExample.FCStdを使ってみましょう。
例えば、このデータのとあるフェースを選択してみます。
その後、上に記載したプログラムを実行してみると、
以下のようになります。
getSelectionEx⇒ Gui::SelectionObject getSelection⇒ PartDesign::Pocket
getSelectionExは選択された要素そのもの、getSelectionは選択した要素に関連するツリー上の履歴が取得されているようですね。
6. 要素はどうやって取得する?
選択された要素は、戻り値で取得した配列の各要素内にあるSubObjectsから取得します。
ソースコードは以下のようになります。
# -*- coding: utf-8 -*- import FreeCAD import FreeCADGui sel = FreeCADGui.Selection.getSelectionEx() if(len(sel) != 0): # 選択したフェース要素 selectedFace = sel[0].SubObjects[0]
7. まとめ
- FaceやEdgeといった構成要素を取得する際は、getSelectionExを使用する。
- getSelectionExから選択要素を取得する場合は、SubObjectsを参照する。
- getSelection, getSelectionExは、欲しい要素によって使い分けが必要。
8. 最後に
いかがでしたか。
ちょっとコアな話題でしたが、GUI絡みのアプリケーションを作る際には重要な内容です。
まずは選択要素を取得する際は、getSelectionとgetSelectionExというメソッドがあることだけでも認識しておいて頂ければと思います。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。