興味があろうがなかろうが。

なるべく役に立つ、とがった内容を記していきたいと思います。

【FreeCADプログラミング】選択した要素を取得する ~getSelectionEx編~

本日のお題は『選択した要素を取得する ~getSelectionEx編~』です。

以前『getSelection編』を紹介していましたが、実は選択用のAPIはもう一つあります。

それが『getSelectionEx』です。

実はこのAPIはすでに、他の記事でちょこちょこ使用していたのにお気づきでしょうか。

後出しになりましたが、私自身の整理も兼ねて一応記事にします。

www.interested-or-not.com

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を使ってみましょう。

例えば、このデータのとあるフェースを選択してみます。

f:id:appli-get:20210803080652p:plain

フェースを選択した状態

その後、上に記載したプログラムを実行してみると、

以下のようになります。

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プログラミングのトップページに飛びます。

よろしければご参照くださいませ。

www.interested-or-not.com