2025年12月15日月曜日

FreeCADのTechDrawのViewをpythonで扱う場合はGUIが要りそう


背景

前回モデルから2次元図面を作ってDXFファイルを生成する処理をpythonで実施する方法を把握しました。
FreeCADのCLI環境でも実施しようと試行錯誤したのですが、どうもTechDrawを扱う場合はGUIが必要そうだったので試したことと分かったことを共有します。

使ったもの

FreeCAD: 1.0.2
実行環境: Ubuntu22.04

TechDrawのViewを生成した後はGUIの処理の終了を実行させる必要がある

前回の記事ではView作成後にTechDraw.writeDXFViewを入れると空のDXFファイルができてしまうためtime.sleep(1)を呼んで1秒待っていました。

調べたところupdateGui関数でGUIの処理を実行させれば良いと分かりました。
ちなみに記事を書いている時点でのupdateGuiのソースコードを見るとupdateEvents関数を呼んでいました。
FreeCADGui.updateGui()
参考: Wait Time Draw - FreeCAD Forum


上記のupdateGui関数でも良いですし、GUIはQtを使っているのでQtの処理実行関数を呼んでも良いです。
from PySide import QtCore,QtGui
QtGui.QApplication.processEvents()
参考: Infinite loop and FreeCAD - FreeCAD Forum

freecad.cmdだとViewを描画できなさそうなので、CLIから呼び出したい場合はfreecadコマンドを使おう

FreeCADにはGUI無しで実行可能なコマンドfreecad.cmdが提供されています。

前回の記事のプログラムをexport-dxf.pyとして下記のようにコマンドを組み立ててfreecad.cmlで実行するとDXFファイルを生成はするのですが、中身が空でした。
また、先程共有したFreeCADGui.updateGuiを呼ぶとエラーになり、time.sleepやQtGui.QApplication.processEvents()なら呼べはするものの、中身が空のままでした。
freecad.cmd some-project.FCStd export-dxf.py

freecadコマンドでCLIはなくGUIで処理させれば期待通りにDXFファイルを生成できました。
freecad some-project.FCStd export-dxf.py

CLI版のfreecad.cmdでもViewからDXFファイルを生成する方をご存知でしたら、コメントなどで教えていただけると嬉しいです。

余談: FreeCADGui.getMainWindow().deleteLater()を呼べば、エラーは出るものの保存するか問わずにGUIを終えれる

FreeCADのGUIを閉じる処理は下記の関数で呼べます。
FreeCADGui.getMainWindows().close()
しかしながら、記の関数では変更が発生していると上保存するかを効く画面が出て処理が止まります。

下記の関数を呼べば、変更があるか否かに関わらず処理を終えれました。
FreeCADGui.getMainWindow().deleteLater()
期待通りに終えれるものの端末に赤字のエラーらしきログがずらりと並ぶので、エラーが出ない強制終了方法をご存知でしたら教えていただけると嬉しいです。


参考: How to Close/Quit/Exit FreeCADGui? - FreeCAD Forum

おわり

time.sleepではなくFreeCADGui.updateGui()でViewの描画を促す方法を把握しました。
TechDrawのViewはGUIを使うためか、自分が試した範囲ではfreecad.cmdだと描画できなかったです。

参考

前回の記事です。
FreeCADでpythonを使いPartの面をTechDrawに置いてDXFファイルを書き出す 

FreeCADGui.updateGui()を知った記事です。
Wait Time Draw - FreeCAD Forum

QtGui.QApplication.processEvents()を知った記事です。
Infinite loop and FreeCAD - FreeCAD Forum

0 件のコメント :