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

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

【FreeCADプログラミング】UNDO, REDOの実行

本日のお題は『UNDO, REDOの実行』です。

FreeCADでもExcelでも、何か処理を実行した後、自分の意図していない結果になった場合、Ctrl+Zキーなどを押して、元に戻す操作をしますね。

今回はそれと同じような操作を学んでいきます。

1. 環境

  • FreeCAD 0.18

2. UNDO, REDOとは?

いろいろな呼び方はありますが、FreeCADでは1つ前の状態に戻す操作をUNDOUNDOした後にやっぱりその実行結果に戻す(1つ先で実行した結果に戻す)操作をREDOと呼んでいるようです。

3. どういうときに使う?

プログラムを実行した際、あるパラメータや実行結果を取得するために、一時的なUNDOマークを作成し、実行後、UNDOをすることがあります。

例えば、とある形のソリッドボディを2つ作成し、そのボディ同士の位置関係などを確認した後、UNDOするというような流れです。

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

コードはいたってシンプルです。

UNDOもREDOも1行のコードで実行可能です。

5. UNDOを実行するコード

# -*- coding: utf-8 -*-

 

import FreeCAD

 

FreeCAD.ActiveDocument.undo()

6. REDOを実行するコード

# -*- coding: utf-8 -*-

 

import FreeCAD

 

FreeCAD.ActiveDocument.redo()

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

とりあえず、FreeCADのDocumentationに記載されているので、詳細を確認したい場合はこちらをご参照ください。

Std Undo - FreeCAD Documentation

Std Redo - FreeCAD Documentation

7. まとめ

  • UNDOを実行する際は「FreeCAD.ActiveDocument.undo()」
  • REDOを実行する際は「FreeCAD.ActiveDocument.redo()」

8. 最後に

いかがでしたか。やり方自体はいたって簡単ですね。

特に自作のコマンドを作成するような方には、役に立つ知識ですので覚えておきましょう。

なお、今回は作成済みのUNDOマークに対して、UNDO,REDOを実行するだけでしたが、次回はUNDOマーク自体を作成する方法について、触れてみたいと思います。首を相当長めにしてお待ちください。

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

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

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

www.interested-or-not.com

【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

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

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

言うまでもないかもしれませんが、皆さんが3Dモデルを見ているビュー(ウインドウ)にも向きがあります。

今回はビューが向いている方向の取得方法について、触れていきたいと思います。

1. 環境

  • FreeCAD 0.18

2. ビューの向きを取得する場面

ビューの向きを取得する場面は、現在の回転状態を保持しておきたい時です。

プログラムから色々な処理を行うことで、回転状態がズレてしまうことがありますが、あらかじめ実行前のビューの向きを取得しておけば、後で元に戻すことができます。

3. 使用するAPI

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

4. 何が取得できるのか

下図のように、画面の奥行き側の方向が取得できます。

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

奥行き方向のイメージ

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

取得自体の処理はAPIを使用するだけなので、いたってシンプルです。

# -*- 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

direction = Gui.ActiveDocument.ActiveView.getViewDirection()
FreeCAD.Console.PrintMessage(str(direction) + "\n")

 

Vector (0.0, 1.0, 0.0)

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

6. まとめ

  • ビューの表示方向を取得するには、getViewDirectionメソッドを使う。

7. 最後に

ビューの方向自体を使用する機会はなかなか無いと思いますので、こういう情報も取得できるということをまずは頭の片隅に入れておいてください。

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

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

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

www.interested-or-not.com

【FreeCADプログラミング】ドキュメントに修正がかかっているかチェック

本日のお題は『ドキュメントに修正がかかっているかチェック』です。

簡単に言うと、開いているCADデータに手を加えて、まだ保存がされていないかどうかをチェックします。

すぐに使うことは無いかもしれませんが、こんなこともできるということを勉強していきましょう。

1. 環境

  • FreeCAD 0.18

2. 修正状態とは?

FreeCADを使っていると、ビューウインドウの下に各ファイルのタブが表示されていますが、手が加えられるとファイル名の横にアスタリスク(*)が入りますね。

これが修正された状態を表しています。

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

更新済みを表すアスタリスク(*)

3. どういうときに使う?

これは要求次第となります。

経験上では、すぐに使用することはまずないでしょう。

とはいえ、知っておいてまず損はありません。

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

コードはいたってシンプルです。1行でカタがつきます。

# -*- coding: utf-8 -*-

import FreeCAD

if(Gui.ActiveDocument.Modified):
	FreeCAD.Console.PrintMessage("修正されています。\n")
else:
	FreeCAD.Console.PrintMessage("修正されていません。\n")

ファイル名横にアスタリスク(*)が付いている状態で実行すると、以下の結果が表示されます。

修正されています。

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

そもそも状態のチェックをするためのマクロを実行すること自体が困難ではありますが。。。

5. まとめ

  • 修正状態のチェックにはModifiedプロパティを使う

6. 最後に

今回はかなり濃いネタでしたね(笑)。

いつか使う機会があるかもしれないので、頭の片隅に入れておいていただければまずはOKかと思います。

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

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

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

www.interested-or-not.com

【FreeCADプログラミング】PyQtを使用したウインドウ表示

本日のお題は『PyQtを使用したウインドウ表示』です。

これまでの学習では、ユーザが値を指定するような操作が無く、プログラム上の固定値を使用していましたが、これではパラメトリックなコマンドを作ることができません。

というわけで今回は、標準搭載されているPyQtを利用して、GUIのアプリケーションを作成していきたいと思います。

1. 環境

  • FreeCAD 0.18

2. PyQtのバージョン

UI作成時に使用するPyQtのバージョンですが、上記FreeCAD 0.18においては、『PyQt5』が使えるようになっています。

wiki.freecadweb.org

3. PyQt4は入れられない?

ちなみに以前、デバッグ用にptvsdをインストールする際用いた、pipコマンドを使用して、PyQt4をインストールしようとすると、同梱されているPythonにあうバージョンが無いと怒られます。

> python -m pip install PyQt4

下記実行結果です。

> Could not find a version that satisfies the requirement PyQt4 (from versions: )
No matching distribution found for PyQt4

www.interested-or-not.com

というわけでここは騒がず、PyQt5を粛々と使用していきましょう。

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

まずは基礎となる『Hello World!』のラベルが貼られたUIを作成してみましょう。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
 
class MainDialog(QWidget):
	def __init__(self, parent=None):
		super(MainDialog, self).__init__(parent)
		
		# ダイアログ
		self.setGeometry(100, 100, 250, 80)
		self.setWindowTitle('Hello World!')
		
		# ラベル
		self.label = QLabel(self)
		self.label.move(20, 20)
		self.label.resize(60, 40)
		self.label.setText('Hello World!')
				
if __name__ == '__main__':
	app = QApplication(sys.argv)
	mainDlg = MainDialog()
	mainDlg.show()
	app.exec_()

5. 実行結果

以下のようにHello World!のラベルが貼られたウインドウが表示されます。

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

実行後のイメージ

6. 懸念事項

PyQtを使用するにあたり、少々気になった点があります。

  • プログラム終了後、FreeCADのアプリケーションメニューがグレーアウトされる。

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

実行後にメニューがグレーアウトされてしまう

これは現状、何が原因で発生しているのか不明です。ちなみに、グレーアウトされてはいるものの、通常時と同様に選択することはできます。
(見た目だけグレーアウトされているだけ?)

何か掴めたら、本記事に追記します。

7. まとめ

  • FreeCADのGUIアプリケーションにはPyQtを使うことができる。
  • FreeCAD 0.18に同梱されているPyQtのバージョンは『5』。

8. 最後に

PyQtはあくまでUIの手段であって、やはり重要なのはこれまで学習してきた『ベクトルの計算』や『履歴の扱い方』などです。

PyQtを有益に扱うためにも、これまで記事にしてきた内容をしっかり覚えておきたいものです(自分への戒め)。

9. ソースコードについて

筆者はPyQtに関してあまり詳しくないため、おかしなソースコードが混じるかもしれません。もし何かお気づきの際は、コメントを頂けると幸いです。

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

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

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

www.interested-or-not.com