本日のお題は『エッジの端点を取得する方法』です。
CADのカスタマイズをする際、点・エッジ・フェースといった端点の座標を活用することがあります。
ネタとしてはパッとしませんが、重要な内容ですので、まずは取得できることを確認しておきましょう。
1. 環境
- FreeCAD 0.18
2. エッジの端点を取得する方法
今回は、事前に選択したエッジから端点位置を取得していきます。
ベクトル計算の時のように、ロジックが必要というわけではなく、単にクラス構成をたどっていくだけです。
3. プログラムを書いてみよう
下図のように、直線エッジを1本選択した状態で下記のプログラムを実行すると、標記の実行結果が出力されます。
# -*- coding: utf-8 -*- #import ptvsd #print("Waiting for debugger attach") # 5678 is the default attach port in the VS Code debug configurations #ptvsd.enable_attach(address=('localhost', 5678), redirect_output=True) #ptvsd.wait_for_attach() import FreeCAD import FreeCADGui sel = FreeCADGui.Selection.getSelectionEx() if(len(sel) != 0): FreeCAD.Console.PrintMessage(str(sel[0].SubObjects[0].Edges[0].Vertexes[0].Point) + "\n") FreeCAD.Console.PrintMessage(str(sel[0].SubObjects[0].Edges[0].Vertexes[1].Point) + "\n")
Vector (10.0, 10.0, 0.0) Vector (10.0, 0.0, 0.0)
4. 補足
4.1. 円弧エッジはVertexesが1つしかない
直線エッジについては、その見た目の通り、視点・終点の座標が存在しますが、円弧エッジについては始点しかありません。
仮に上記のプログラムを円弧エッジに対して実行すると、コンソールにて以下のような例外が発生します。
1つ目の端点は取得できていますが、2つ目の方は『
つまり、インデックス外の配列を参照した例外が発生していますね。
Vector (4.0, -9.797174393178826e-16, 10.0) Traceback (most recent call last): File "C:/Python/EdgeVertex.py", line 16, inFreeCAD.Console.PrintMessage(str(sel[0].SubObjects[0].Edges[0].Vertexes[1].Point) + "\n") <class 'IndexError'>: list index out of range
現状はif文にて、『選択された要素が0でない場合』という条件分岐をしていますが、実際の開発をする際は、この条件では不十分です。
『選択された要素数』に加え、『エッジのタイプが直線である』などの処理も必要となるでしょう。
いずれ、これらの内容についても解説していきたいところです。
5. まとめ
- エッジから端点の座標を取得することができる
- 直線エッジは端点が2つ、円弧エッジは端点が1つである
- ユーザにUI選択をさせる場合は、選択された要素の型チェックが必須である
6. 最後に
エッジの端点以外にも、直線の端点や、スプラインの端点が取得できるかどうかは試しておきたいですね。
もしできた場合は、今度解説しますね。
更なる情報をお探しの方は!
下記のリンクから、FreeCADプログラミングのトップページに飛びます。
よろしければご参照くださいませ。