名付けて cydeer

GitHub - ousttrue/pydear
Contribute to ousttrue/pydear development by creating an account on GitHub.
GitHub - ousttrue/pydear favicon https://github.com/ousttrue/cydeer
GitHub - ousttrue/pydear

python, cython, dear imgui の組み合わせで名前を付けようと思ったのだが、既に先人がいっぱいいて名前が被るので適当に決めた。🦌

GitHub - TimoSalomaki/awesome-dear-imgui: A collection of awesome dear imgui bindings, extensions and resources
A collection of awesome dear imgui bindings, extensions and resources - TimoSalomaki/awesome-dear-imgui
GitHub - TimoSalomaki/awesome-dear-imgui: A collection of awesome dear imgui bindings, extensions and resources favicon https://github.com/HankiDesign/awesome-dear-imgui#languages
GitHub - TimoSalomaki/awesome-dear-imgui: A collection of awesome dear imgui bindings, extensions and resources

最初、DearPyGui のサイトが強そうだったので試そうと思ったのだけど用途が違いそうだった。 次に、しばらく pyimgui を使っていい感じだったので、 docking ブランチ対応を見たら開発ブランチならば動いたので、自前ビルドを改造して使っていた。 PR も送ってみたのだが、 どうせなら自分で作ろうという機運が高まったので、作った。 cydeer は pyOpenGL とともに使う 薄い ImGui ラッパーという路線である。 ctypes を併用することでポインタを直接扱う。 camel casesnake case の変換を含めて何も変えない。

libbinderimguiwindow & graphincsコメント
(python)cydeercython + ctypes(generate using libclang.cindex )imgui docking branchglfw など + pyOpenGL でがんばる可能な限りAPIの改変をしない。ポインタは ctypes で作る
(python)pyimguicythonimguiglfw など + pyOpenGL でがんばるポインタ引数(p_openなど)による返り値を、tuple による複値で表現
(python)DearPyGui未確認未確認DirectX11。python からアクセスできない?imgui をラップして独自 API。python で OpenGL するという目的には使えぬ
(c)cimgui未確認未確認imgui を extern C にラップしたもの。他言語バインド向け
(rust)imgui-rs未確認未確認builder パターンで Default 引数を代替

imgui ラップには、 関数オーバーロード , デフォルト引数 , メンバー関数 という難所がある。 要するに c++ 要素なのだけど、c++ 要素含めての imgui の使い勝手なので。各言語バインディングで悩ましいところです。 たとえば、 rust は関数オーバーロードやデフォルト引数が無いので API を変えてます。

C# とかでも、 const ImVec2 pos& = ImVec2(0, 0) のような引数を解決するのは手間がかかったりする。 DLLImport 定義に対するデフォルト引数では解決できないので、 C# 側で一時変数を作ってポインターを取得する必要がある。

デフォルト引数 は cython で普通に解決した。 clang.cindex から値を取れれば難しくない。 メンバー関数ctypescython のメソッドを定義して、 selfthis pointer に cast して呼び出すコードを作った(ImGuiFontAtlas)。 関数オーバーロードcython でディスパッチするのはつらいので、MenuItem_2 のような suffix をつけて人間が選ぶようにした。

忘れていたが、もっとも問題になるのが 構造体の値渡し・返し だった(C++に限らない?)。 D言語 , rust ともにこれができない(vcのコンパイラと互換性がない?)ので注意が必要だった。コンパイルは通るが動作がおかしかったような。 ImGui の ImVec2 を値返しする関数でヒットする。 cydeer は、 cython を採用したので、cython 関数の出口で python 型に入れ替えるだけである。

あと、 cydeerpyi 標準装備でいい感じである(一部実際のpython型と齟齬があるが・・・)。

実装上の課題

cython の cimport の扱いがやっかいで、imgui, imgui.internal に分割しようとするとうまくいかなかった。 cydeer に関しては巨大な単一のモジュールで行くのが無難かもしれない。 internal やノードエディターとか追加するときに分けたいのだけど。

現状、Windows + python-3.10 しか試していない。 Windows11 の wslg + wayland で動くようにしたい。