本日のお題は『ソリッドから構成要素(フェース, エッジ, 端点)を取得』です。
3Dのソリッドモデルは基本的に『点・エッジ・フェース』で構成されており、それらの情報を相互に参照できることが多いです。
今回はまず、ソリッドボディから複数の構成要素が取得できることを確認していきましょう。
1. 環境
- FreeCAD 0.18
2. ソリッドから構成要素を取得する方法
構成要素の取得方法はいたってシンプルであり、専用のプロパティが用意されています。
今回も以前『ドキュメントから作成履歴の取得』で使用したツリーを利用します。
2.1. その前に...
そもそも『ソリッド自体はどこから取得すればよいのか』という点を説明する必要がありますね。
ひとまずツリーから取得するのであれば、履歴からたどることができます。
具体的には以下のような手順です。
- ドキュメントを取得
- ドキュメントから履歴を取得
- 履歴からソリッドを取得
では早速、ソリッド取得用のコードを書いてみましょう。
# -*- coding: utf-8 -*-
import FreeCAD # アクティブなドキュメントを取得 activeDoc = App.ActiveDocument # アクティブドキュメントから作成履歴群を取得 histories = activeDoc.Objects # 作成履歴群から立方体が取得できた場合は、 # ソリッドを取得する for history in histories: if history.TypeId == 'Part::Box': solidObj = history.Shape FreeCAD.Console.PrintMessage(str(solidObj.ShapeType) + "が取得されました。\n")
Solidが取得されました。
2.2. ソリッドからフェース・エッジ・端点を取得
今度は、本題の構成要素を取得してみましょう。
取得したあとの要素数をログに表示しています。
# -*- coding: utf-8 -*- import FreeCAD # アクティブなドキュメントを取得 activeDoc = App.ActiveDocument # アクティブドキュメントから作成履歴群を取得 histories = activeDoc.Objects # 作成履歴群から立方体が取得できた場合は、 # ソリッドを取得する for history in histories: if history.TypeId == 'Part::Box': solidObj = history.Shape # フェース群を取得 faceObjs = solidObj.Faces # エッジを取得 edgeObjs = solidObj.Edges # 端点を取得 vertexObjs = solidObj.Vertexes # 取得個数をログに表示 FreeCAD.Console.PrintMessage(str(faceObjs[0].ShapeType) + "が" + str(len(faceObjs)) +"個取得されました。\n") FreeCAD.Console.PrintMessage(str(edgeObjs[0].ShapeType) + "が" + str(len(edgeObjs)) +"個取得されました。\n") FreeCAD.Console.PrintMessage(str(vertexObjs[0].ShapeType) + "が" + str(len(vertexObjs)) +"個取得されました。\n")
Faceが6個取得されました。 Edgeが12個取得されました。 Vertexが8個取得されました。
立方体ですので、上の結果で合っていますね。
今回はひとまず取得するのみで、特にいじったりはしません。
4. 補足
4.1. SolidからEdge, Vertexesを取得することもできる
今回は『Solid⇒Face⇒Edge⇒Vertex』の順番で要素を取得していきましたが、SolidからEdge, FaceからVertexなど、間を飛び越して取得しに行くことも可能です。
4.2. 逆方向の取得はできない?
今回『Solid⇒Face⇒Edge⇒Vertex』の流れで要素を取得することができることを確認しましたが、残念なことに『Vertex⇒Edge⇒Face⇒Solid』の逆方向の要素を取得する方法は見つかっていません。
最悪の場合、その方法がなかったとしても、自前で構成をすべて作ればよいのですが、ツリー全体を再帰処理で回して、自前クラスにまとめたりするので、結構面倒です。
もし、逆方向の要素取得に関しての情報をお持ちの方がいらっしゃいましたら、コメントを頂けると幸いです。
5. まとめ
- ソリッドはドキュメントから取得することが可能
- 『Solid⇒Face⇒Edge⇒Vertex』の流れで要素を取得することが可能
- 『Solid⇒Edge』, 『Face⇒Vertex』のように、間を飛び越えて要素を取得することも可能
- 『Vertex⇒Edge⇒Face⇒Solid』のように、小から大に向かう要素の取得方法はあるか不明
6. 最後に
ツリー構成や、構成要素の取得方法を覚えると、これまで行ってきた『点の知識』が『線の知識』になってきたと思いませんか? まさにトポロジーですね。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。