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

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

【FreeCADプログラミング】エッジの端点位置を取得

本日のお題は『エッジの端点を取得する方法』です。

CADのカスタマイズをする際、点・エッジ・フェースといった端点の座標を活用することがあります。

ネタとしてはパッとしませんが、重要な内容ですので、まずは取得できることを確認しておきましょう。

1. 環境

  • FreeCAD 0.18

2. エッジの端点を取得する方法

今回は、事前に選択したエッジから端点位置を取得していきます。

ベクトル計算の時のように、ロジックが必要というわけではなく、単にクラス構成をたどっていくだけです。

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

下図のように、直線エッジを1本選択した状態で下記のプログラムを実行すると、標記の実行結果が出力されます。

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

直線エッジを選択した状態
# -*- 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つしかない

直線エッジについては、その見た目の通り、視点・終点の座標が存在しますが、円弧エッジについては始点しかありません

仮に上記のプログラムを円弧エッジに対して実行すると、コンソールにて以下のような例外が発生します。

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

円弧エッジの選択例

1つ目の端点は取得できていますが、2つ目の方は『list index out of range』。

つまり、インデックス外の配列を参照した例外が発生していますね

Vector (4.0, -9.797174393178826e-16, 10.0)

Traceback (most recent call last):
  File "C:/Python/EdgeVertex.py", line 16, in 
    FreeCAD.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プログラミングのトップページに飛びます。

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

www.interested-or-not.com