Переглянути джерело

added tcpviewer for avoiding matlab locking

Former-commit-id: fbdf530533a6f0b160d041fa7c9742038bab6a46
Daniele Panozzo 10 роки тому
батько
коміт
e4082616ff
3 змінених файлів з 73 додано та 0 видалено
  1. 16 0
      python/py_igl_viewer.cpp
  2. 22 0
      python/tcpviewer_client.py
  3. 35 0
      python/tcpviewer_server.py

+ 16 - 0
python/py_igl_viewer.cpp

@@ -2,6 +2,7 @@
 #include <Eigen/Sparse>
 
 #include "python.h"
+#define ENABLE_SERIALIZATION
 #include <igl/viewer/Viewer.h>
 #include <igl/viewer/ViewerCore.h>
 #include <igl/viewer/ViewerData.h>
@@ -287,6 +288,21 @@ py::class_<igl::viewer::ViewerCore> viewercore_class(me, "ViewerCore");
     .def_readwrite("core", &igl::viewer::Viewer::core)
     .def("launch", &igl::viewer::Viewer::launch, py::arg("resizable") = true, py::arg("fullscreen") = false)
     .def("init", &igl::viewer::Viewer::init)
+    .def("serialize", [](igl::viewer::Viewer& viewer)
+    {
+      std::vector<char> a;
+      igl::serialize(viewer.core,"Core",a);
+      igl::serialize(viewer.data,"Data",a);
+
+      return a;
+    })
+
+    .def("deserialize", [](igl::viewer::Viewer& viewer, const std::vector<char>& a)
+    {
+      igl::deserialize(viewer.core,"Core",a);
+      igl::deserialize(viewer.data,"Data",a);
+      return;
+    })
 
     // Scene IO
     .def("load_scene", [](igl::viewer::Viewer& viewer)

+ 22 - 0
python/tcpviewer_client.py

@@ -0,0 +1,22 @@
+# Echo client program
+import socket
+import igl
+import array
+
+HOST = ''    # The remote host
+PORT = 50008              # The same port as used by the server
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.connect((HOST, PORT))
+
+V = igl.eigen.MatrixXd()
+F = igl.eigen.MatrixXi()
+igl.readOFF('../tutorial/shared/beetle.off', V, F)
+viewer = igl.viewer.Viewer()
+viewer.data.set_mesh(V,F)
+
+data = viewer.serialize()
+print(type(data[0]).__name__)
+viewer.deserialize(data)
+a = array.array('u',data)
+s.sendall(a)
+s.close()

+ 35 - 0
python/tcpviewer_server.py

@@ -0,0 +1,35 @@
+# Echo server program
+import socket
+import multiprocessing
+import igl
+
+HOST = ''                 # Symbolic name meaning all available interfaces
+PORT = 50008              # Arbitrary non-privileged port
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.bind((HOST, PORT))
+s.listen(1)
+
+try:
+    while True:
+        conn, addr = s.accept()
+        print 'Connected by', addr
+        data = ''
+        while True:
+            datanew = conn.recv(1024)
+            if not datanew:
+                break
+            data = data+datanew
+        conn.close()
+
+        def worker(data):
+            viewer = igl.viewer.Viewer()
+            temp = list(data.decode('unicode_internal','ignore'))
+            viewer.deserialize(temp)
+            viewer.launch(True,False)
+            return
+
+        t = multiprocessing.Process(target=worker, args=(data,))
+        t.start()
+except:
+    print "Closing socket:"
+    s.close()