Ver código fonte

expose nanogui objects to python; todo: wrap with conditionals

Former-commit-id: 8c6e743cc184155461631cd92dd52029d86c37b9
pancha 9 anos atrás
pai
commit
5ba386306b
2 arquivos alterados com 90 adições e 0 exclusões
  1. 7 0
      python/py_igl_viewer.cpp
  2. 83 0
      python/tutorial/106_ViewerMenu.py

+ 7 - 0
python/py_igl_viewer.cpp

@@ -300,6 +300,11 @@ py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
 
 // UI Enumerations
     py::class_<igl::viewer::Viewer> viewer_class(me, "Viewer");
+    py::object fh = (py::object) py::module::import("nanogui").attr("FormHelper");
+    py::class_<nanogui::FormHelper> form_helper_class(me, "FormHelper", fh);
+
+    py::object screen = (py::object) py::module::import("nanogui").attr("Screen");
+    py::class_<nanogui::Screen> screen_class(me, "Screen", screen);
 
     py::enum_<igl::viewer::Viewer::MouseButton>(viewer_class, "MouseButton")
         .value("Left", igl::viewer::Viewer::MouseButton::Left)
@@ -311,6 +316,8 @@ py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
     .def(py::init<>())
     .def_readwrite("data", &igl::viewer::Viewer::data)
     .def_readwrite("core", &igl::viewer::Viewer::core)
+    .def_readwrite("ngui", &igl::viewer::Viewer::ngui)
+    .def_readwrite("screen", &igl::viewer::Viewer::screen)
     .def("launch", &igl::viewer::Viewer::launch, py::arg("resizable") = true, py::arg("fullscreen") = false)
     .def("launch_init", &igl::viewer::Viewer::launch_init, py::arg("resizable") = true, py::arg("fullscreen") = false)
     .def("launch_rendering", &igl::viewer::Viewer::launch_rendering, py::arg("loop") = true)

+ 83 - 0
python/tutorial/106_ViewerMenu.py

@@ -0,0 +1,83 @@
+# Add the igl library to the modules search path
+import sys, os
+sys.path.insert(0, os.getcwd() + "/../")
+
+import pyigl as igl
+import nanogui
+
+V1 = igl.eigen.MatrixXd()
+F1 = igl.eigen.MatrixXi()
+
+V2 = igl.eigen.MatrixXd()
+F2 = igl.eigen.MatrixXi()
+
+float_variable = 0.1
+bool_variable = True
+dir = 0
+
+
+def make_accessors(name):
+    def setter(value):
+        globals()[name] = value
+
+    def getter():
+        return globals()[name]
+    return setter, getter
+
+
+def viewer_init(viewer):
+    # add new group
+    viewer.ngui.addGroup("New Group")
+
+    # Expose the using general callback
+    viewer.ngui.addDoubleVariable("double", *make_accessors("float_variable"))
+
+    def setter(val):
+        global bool_variable
+        bool_variable = val
+
+    def getter():
+        global bool_variable
+        return bool_variable
+
+    # ... or using a custom callback
+    viewer.ngui.addBoolVariable("bool", setter, getter)
+
+    viewer.ngui.addEnumVariable("Direction", *make_accessors("dir")) \
+        .setItems(["Up", "Down", "Left", "Right"])
+
+    # Add a button
+    def cb():
+        print("Hello")
+    viewer.ngui.addButton("Print Hello", cb)
+
+    #Add an additional menu window
+    viewer.ngui.addWindow(nanogui.Vector2i(220, 10), "New Window")
+
+    # add accessor
+    viewer.ngui.addDoubleVariable("double", *make_accessors("float_variable"))
+
+    #Generate menu
+    viewer.screen.performLayout()
+
+    return False
+
+
+
+def main():
+    # Load a mesh in OFF format
+    igl.readOFF("../../tutorial/shared/bunny.off", V1, F1)
+
+    # Init the viewer
+    viewer = igl.viewer.Viewer()
+
+    # Extend viewer menu
+    viewer.callback_init = viewer_init
+
+    # Plot the mesh
+    viewer.data.set_mesh(V1, F1)
+    viewer.launch()
+
+
+if __name__ == "__main__":
+    main()