2026年4月27日月曜日

FreeCADのソルバー失敗はpythonだとsolve関数で把握できる


背景

3D CADプログラムFreeCADでpythonコンソールを利用して処理を進める際に、ソルバーの収束失敗などの設計の齟齬が発生してもpythonの処理としてはエラーにならずそのまま進んでしまい気づかないうちに想定していないモデルが出来ることがありました。
不具合がが発生したら処理を止めて作業者に知らせたかったので、pythonで把握する方法を調べて把握しました。
備忘録として記事に残します。

使ったもの

FreeCAD 1.1

solve関数で概要を知れる

sketcherにsolve関数があり、それを呼び出すと戻り値によって不具合の内容を把握できます。

0:  if no error
-1 if solver error
-2 if redundant constraints
-3 if conflicting
-4 if overconstrained

FreeCAD 1.1のapi一覧表でも確認できます。
solve() - Sketcher::SketchObject Class Reference

pythonで呼び出し可能な関数はcppに比べると限られているようで、上記のページに記載されていてもpythonでは呼び出せない関数があったり、渡せない引数があったりします。

document内のsketcher全てに対して不具合があるか確認する処理はこちらです。
doc = App.ActiveDocument
for obj in doc.Objects:
if obj.TypeId == "Sketcher::SketchObject":
solve = obj.solve()
if solve != 0:
print("Cannot solve %s because %d" % (obj.Name, solve))
# do something for un solved object

異常があればこの様に理由を示す戻り地を見れます。
Cannot solve Sketch because -1

おわり

試行錯誤の末にsketcherの大まかな不具合内容はsolve関数で把握できると分かりました。

参考

solve() - Sketcher::SketchObject Class Reference

0 件のコメント :