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

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

【FreeCADプログラミング】ビューの表示方向の設定

本日のお題は『ビューの表示方向の設定』です。

前回はビューの表示方向を取得する方法を学習しましたので、今回は設定方法について触れていきたいと思います。

1. 環境

  • FreeCAD 0.18

2. ビューの向きを設定する場面

ビューの向きを設定する場面は、基本的に下記2つのタイミングだと思います。

  • ビューの状態を元の状態に戻したい
  • 特定の方向からモデルを見たい

3. 使用するAPI

Gui.ActiveDocument.ActiveView.setViewDirection()メソッドを使用します。

4. 何のベクトルを設定するのか

ブラックボックステストとして、色々な値を入れて試してみたところ、どうやら『ビュー画面の奥行き方向』をタプルで設定するようです。

f:id:appli-get:20210725101255j:plain

方向のイメージ(ビュー画面の奥行き方向)

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

どうせなので今回は選択したフェースの法線ベクトルを利用してみましょう。

www.interested-or-not.com

このプログラムを実行することで、事前に選択したフェースの真正面から、ビュー表示することができます。

# -*- 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):
    # 選択した位置
    pickCoord = sel[0].PickedPoints[0]
    # 選択したフェース要素
    selectedFace = sel[0].SubObjects[0]
    # フェースからサーフェスを取得
    # コレに関しては詳細不明。
    # サーフェスじゃないとuvパラメータが取れないのかもしれないです)
    faceSurface = selectedFace.Surface
    # UVパラメータを取得
    uvCoord = faceSurface.parameter(pickCoord)
    # 選択した位置の法線ベクトルを取得
    normalVec = selectedFace.normalAt(uvCoord[0], uvCoord[1])
    # 奥行き方向のベクトルを指定するので、法線とは逆向きに変換
    negVec = normalVec.negative()
    # ビュー方向を指定する
    Gui.ActiveDocument.ActiveView.setViewDirection((negVec[0], negVec[1], negVec[2]))
    # 回転した後、ソリッドが画面から吹っ飛んで消失するので、強制的にフィットする
    Gui.SendMsgToActiveView("ViewFit")

ちなみに気づいている方もいらっしゃるかもしれませんが、setViewDirectionメソッドのコードはマクロの記録で記録することができません

6. 実行結果

今回はFreeCADのサンプルデータとして用意されているPartDesignExample.FCStdを使ってみましょう。

例えば、このデータのとあるフェースを選択してみます。

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

フェースを選択した状態

その後、上に記載したプログラムを実行してみると、

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

ビュー方向設定 + フィット処理を行った後の状態

こんな感じになります。フェースを真正面から見た状態になりましたね。

7. 補足: フィット処理が必要

ビューを回転させる際に原点を指定していないせいか、回転後、元々見えていたオブジェクトがどこかにすっ飛んでしまいます。

そのため、上で書いたサンプルコードには、回転後に画面全体をフィットする処理を入れています。

こうすることで、どこかへ行ってしまったオブジェクトをビュー中央に寄せています。

8. 補足: ボディ自体の傾きの考慮が必要

このコードは、ボディが初期作成時から回転されていない状態(※)を前提としており、回転した分の考慮が入っていません。

※プロパティのplacementが0°ということ。

したがって、ボディを回転させたモデルで処理を実行すると、意図した方向からビュー表示されません。

この回転に関する処理については、追々説明していきたいと思います。

9. まとめ

  • ビューの表示方向を設定するには、setViewDirectionメソッドを使う。
  • placementプロパティの回転分を別途考慮する必要がある。
  • オブジェクトが画面から消えてしまったら、フィットしてみる。

10. 最後に

いかがでしたか。

ビューの表示状態をプログラムから制御する頻度はあまり高くないと思いますが、まれに登場することがあります。是非、覚えておいてください。

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

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

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

www.interested-or-not.com