測試並改良 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.hppslvs.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.hppslvs.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