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

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

【FreeCADプログラミング】オブジェクトの同一判定

本日のお題は『オブジェクトの比較』です。

CADのマクロ開発を行っていると、ある要素とある要素が同一か判定したくなることがよくあります。

今回は形状要素が同一かどうかを判定する方法を学んでいきたいと思います。

1. 環境

  • FreeCAD 0.18

2. オブジェクトの同一判定を行う場面

以前、選択したエッジと平行な方向を向いているエッジをカウントするプログラムを作りましたが、例えばこういったときに使用します。

上記のプログラムを作成した時は、オブジェクトの同一判定を行う方法を知らなかったため、比較元の自分自身もカウントしてしまう不具合が残っていました。

後日修正したいと思います。

www.interested-or-not.com

3. 使用するAPI

Toposhape APIのisSameメソッドを使用します。

4. どうやって使うのか?

Toposhape APIは継承関係的には、EdgeやFaceの親に当たるもののようなので、『Edge.isSame(比較したい要素)』、『Face.isSame(比較したい要素)』のように書くことで使用することができます。

ちなみに、isSameメソッドは同じ要素であればTrue、違う要素であればFalseを返してくれるようです。

5. プログラムを書いてみよう

今回は選択した2つの要素が同一か確認していきます。

なお実験的に、同じ要素をisSameメソッドの引数に渡したとき、Trueが返ってくるかも確認しています。

プログラムを動作させる際は、エッジもしくはフェースを2つ選択してから起動してください。

# -*- coding: utf-8 -*-

import FreeCAD
import FreeCADGui

sel = FreeCADGui.Selection.getSelectionEx()

if(len(sel) == 1):
	if(len(sel[0].SubObjects) == 2):
		firstObj = sel[0].SubObjects[0]
		secondObj = sel[0].SubObjects[1]

		FreeCAD.Console.PrintMessage("異なるオブジェクトで判定した結果: " + str(firstObj.isSame(secondObj)) + "\n")
		FreeCAD.Console.PrintMessage("同一のオブジェクトで判定した結果: " + str(firstObj.isSame(firstObj)) + "\n")

6. 実行結果

異なるオブジェクトで判定した結果: False
同一のオブジェクトで判定した結果: True

7. まとめ

  • オブジェクトの同一判定をする際は、TopoShape APIのisSameメソッドを使用する

8. 最後に

いかがでしたか。

あまりパッとした内容ではないですが、処理を完全自動化する際には必ずと言っていいほど必要になるAPIです。

こちらのAPIはいつでも使えるようにしておきましょう。

更なる情報をお探しの方は!

下記のリンクから、FreeCADプログラミングのトップページに飛びます。

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

www.interested-or-not.com