本日のお題は『ある位置が要素の内側に位置しているか判定』です。
えらい頭でっかちなお題ですが、そのまんまの話題です。
1. 環境
- FreeCAD 0.18
2. 使用する場面
あるとすれば、何かしらの方法で取得された座標位置にソリッドが存在しているかをチェックするときですかね。
個人的には、あまり使用場面は多くない気がします。
3. 使用するAPI
Toposhape APIのisInsideメソッドを使用します。
4. どうやって使うのか?
Toposhape APIは継承関係的には、EdgeやFaceの親に当たるもののようなので、『Edge.isInside()』、『Face.isInside()』のように書くことで使用することができます。
ちなみに、isInsideメソッドは指定した座標がソリッド内部に位置していればTrue、そうでなければFalseを返してくれるようです。
TopoShape API - FreeCAD Documentation
なお、指定する引数が3つ用意されており、それぞれ下記のような意味を持っているようです。
- 第一引数: 検証する座標位置
- 第二引数: 許容値
- 第三引数: 第一引数で指定した座標位置がFace上に位置している場合、内部に位置していると判定するかを決めることができます。Trueを指定すると内部に位置していると判定します。
5. プログラムを書いてみよう
ひとまず、特定の座標位置が選択した要素の内部に位置しているか確認するプログラムを書いてみました。
# -*- coding: utf-8 -*- import FreeCAD import FreeCADGui sel = FreeCADGui.Selection.getSelection() if(len(sel) != 0): #選択した要素の取得 bodyShape = sel[0].Shape #内側に位置されているか確認するための座標 verifyPoint1 = FreeCAD.Vector(20, 20, 20) #ボディ内部 verifyPoint2 = FreeCAD.Vector(-10, -10, -10) #ボディ外部 verifyPoint3 = FreeCAD.Vector(0, 10, 10) #フェース上 #点がボディの内側にあるか判定 isInside1 = bodyShape.isInside(verifyPoint1, 0.001, True) isInside2 = bodyShape.isInside(verifyPoint2, 0.001, True) isInside3 = bodyShape.isInside(verifyPoint3, 0.001, True) isInside4 = bodyShape.isInside(verifyPoint3, 0.001, False) FreeCAD.Console.PrintMessage(str(isInside1) + "\n") FreeCAD.Console.PrintMessage(str(isInside2) + "\n") FreeCAD.Console.PrintMessage(str(isInside3) + "\n") FreeCAD.Console.PrintMessage(str(isInside4) + "\n")
※ isInside3, isInside4は第三引数の動作の違いを確認するために、同じ座標を指定しています。
6. 実行結果
今回は高さ,幅,奥行100mmの立方体を選択し、上記のプログラムを実行した結果を見てみます。
ちなみに、立方体の位置は0,0,0から移動していません。
True False True False
3つ目と4つ目の結果に注目です。
第三引数のオプション設定の効果が出ていますね。
7. まとめ
- ある位置が要素の内側に位置しているか判定したい場合はTopoShapeのisInsideメソッドを使用する
- isInsideメソッドの第三引数で指定するパラメータによって、Face上の位置が指定された場合の計算結果が変わる
8. 最後に
この手のチェックは自前のAPIを作るのが困難なため、覚えておいて損は無いと思います。
ひょんなことで役に立つこともありますので、頭の片隅に入れておいてください。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。