測試並改良 Python-Solvespace wrapper:
- 端口更新至 Solvespace 2.3 (Ubuntu only)
註:官方 抑或 whitequark 提供的原始碼中,並沒有再提供獨立編譯 solver 的流程,只有圖形化使用者介面 (GUI) 和命令列介面 (CLI) 的版本。
端口更新
已將 Solvespace 2.3 的 solver 原始碼更新至倉儲中。
在 Ubuntu 平台測試編譯成功後,將此程式庫連結至 cdemo 編譯,測試無誤。
至於 Windows 平台發現原始碼似乎沒有與介面分離得很徹底,可能要處理 platform/w32util.cpp
的問題。
SWIG 端口測試
先嘗試將 slvs_python.hpp
與 slvs.i
移至目錄中,修改路徑後編譯測試。
接著發現 Slvs_MakeConstraint 函式簡化了輸入的 argument。
static Slvs_Constraint Slvs_MakeConstraint(Slvs_hConstraint h, Slvs_hGroup group, int type, Slvs_hEntity wrkpl, double valA, Slvs_hEntity ptA, Slvs_hEntity ptB, Slvs_hEntity entityA, Slvs_hEntity entityB, Slvs_hEntity entityC, Slvs_hEntity entityD, bool other, bool other2)
將最後 4 個項目移除並展開指令:
static inline Slvs_Constraint Slvs_MakeConstraint(Slvs_hConstraint h, Slvs_hGroup group, int type, Slvs_hEntity wrkpl, double valA, Slvs_hEntity ptA, Slvs_hEntity ptB, Slvs_hEntity entityA, Slvs_hEntity entityB)
連同改正 slvs_python.hpp
與 slvs.i
的內容後,發現 System::solve()
函式的 wrapper 發生無法轉換類型的情況。
result = sys.solve() ... return _slvs.System_solve(self, hg) NotImplementedError: Wrong number or type of arguments for overloaded function 'System_solve'. Possible C/C++ prototypes are: System::solve(Slvs_hGroup) System::solve()
位於 System 類型的 solve 方法只是指定群組求解,沒有給定群組的話就使用預設群組。
解決之道是分離成兩個函式:
-
System::solveFor(Slvs_hGroup)
:指定群組求解,輸入群組數值(非指標)。
-
System::solve()
:使用預設群組。
如此一來,新版的 Solvespace solver 已通過測試,需要再建立 Windows 編譯流程後才能完全更新倉儲和連動至 Pyslvs。
不過 Windows 遭遇了一些平台問題,官方後來使用 Visual studio 為基礎寫的輔助函式,某些在 MinGW 中會出現一些錯誤。
另外,稍微閱讀了一下以前 Python-Solvespace 作者的 slvs_python.hpp
標頭檔,似乎還有很多供 Python 方便使用物件化的函式和方法,是否要為其製作 API 說明文件(例如簡單的 Github Wiki),供 Solvespace 官方或 whitequark 參考?
Comments
comments powered by Disqus