<div dir="ltr">Wow!<div><br></div><div>@David Gobbi and @Sebastien Jourdain did you seen this?<br><div><br></div></div><div>nice work Axel!</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">David E DeMarle<br>Kitware, Inc.<br>R&D Engineer<br>21 Corporate Drive<br>Clifton Park, NY 12065-8662<br>Phone: 518-881-4909</div></div>
<br><div class="gmail_quote">On Thu, Jan 28, 2016 at 4:56 AM, Axel Kittenberger <span dir="ltr"><<a href="mailto:axkibe@gmail.com" target="_blank">axkibe@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello,<br><br>I created a wrapper library generator for VTK to Node.js. If you have all needed packages installed ("node", "vtk6-dev", "qtbase5-dev") running<br><div>  npm install vtk</div><div>should do it and compile the pre-generated wrapper classes matching the VTK library found on your system. Currently I included pre-generated wrappers for VTK 6.1, 6.2 and 6.3 (on Linux).</div><div><br></div><div>The full source code: <a href="https://github.com/axkibe/node-vtk" target="_blank">https://github.com/axkibe/node-vtk</a></div><div><br></div><div>Example code creating a cone:</div><div>--------------------------<br></div><div><div>'use strict';<br></div><div>var vtk, source, mapper, actor, renderer, renderWindow, renderWindowInteractor;</div><div><br></div><div>vtk = require('vtk');</div><div><br></div><div>source = new vtk.ConeSource();</div><div>source.setResolution( 10 );</div><div><br></div><div>mapper = new vtk.PolyDataMapper();</div><div><br></div><div>mapper.setInputConnection( source.getOutputPort() );</div><div><br></div><div>actor = new vtk.Actor();</div><div>actor.setMapper( mapper );</div><div><br></div><div>renderer = new vtk.Renderer();</div><div>renderer.addActor( actor );</div><div>renderer.setBackground( 0.3, 0.2, 0.1 );</div><div>renderer.resetCamera();</div><div><br></div><div>renderWindow = new vtk.RenderWindow();</div><div>renderWindow.addRenderer( renderer );</div><div><br></div><div>renderWindowInteractor = new vtk.RenderWindowInteractor();</div><div>renderWindowInteractor.setRenderWindow( renderWindow );</div><div>renderWindowInteractor.setInteractorStyle( new vtk.InteractorStyleTrackballCamera() );</div><div><br></div><div>renderWindow.render();</div><div><br></div><div>renderWindowInteractor.start();</div></div><div>--------------------------</div><div><br></div><div>I know there is Paraview having a JavaScript interface to interact with on browser side, but this module directly includes VTK on Node.js server side or simply for small rapid development scripts if someone like me just likes JavaScript to prefer this for quick testing instead of other wrappers or using C++ directly.</div><div><br></div><div>What I did is:<br></div><div><br></div><div>* Hijack the VTK wrapping tools build scripts to generate V8 wrapping classes using the "Native Abstractions for Node" (nan) layer. This doesn't build the binary libraries right away but stops after generating the wrapper classes to be copied over the Node.js module build system.</div><div><br></div><div>* Figure out how to expose hierarchical native data as hierarchical JavaScript objects creating a matching prototype chain. I didn't find example code for this as most nan examples where simply object here <-> object there mappings. </div><div>  var vtk = require('vtk')</div><div>  var source = new vtk.ConeSource();</div><div>  console.log( source instanceof vtk.Algorithm, source instanceof vtk.CubeSource );</div><div>correctly prints out "true false"</div><div>  </div><div>* Creating overload detection and figure out the correct native overload to call.</div><div><br></div><div>* Make the wrapping as foolproof as I could think of. At least I don't know how to create a Segfault from JavaScript side, everything wrong doing should raise a JavaScript exception instead.</div><div><br></div><div>* Lazily initialize JavaScript prototypes only as they are needed. On startup only getters for the VTK object are set, everything else is only initialized when accessed. This improves startup time. After the first start of node with VTK which takes a long time (10 seconds for me) for I suppose the linker doing its stuff, subsequent calls start up the whole thing in 1 second.</div><div><br></div><div>* Set references for different naming conventions what you prefer. vtk.vtkConeSource (strictly correct and VTK case scheme, but kind of repetitive saying "vtk" twice and violating JavaScript conventions of constructor functions being uppercase) and vtk.ConeSource (shorted and fits the convention of uppercase constructors) point to the same thing. Similar source.SetResolution (strictly correct VTK name) and source.setResolution (JavaScript convention for lowercase non-constructor functions) are the same thing too.</div><div><br></div><div>What I did not:</div><div><br></div><div>* I skipped a lot of less used parameter types. Right now wrappers are only created for functions having double, char, char (const) *, int and vtkObject pointers as parameters and return values. Other primitives should be easy to add, I just didn't yet need them.</div><div>Predefined length arrays as parameters might be a little more work. QObject I didn't look at. Templates as parameters (as Tuples) I don't know how to and I suppose PythonWrapping, which I used as guideline, doesn't either. C++ Classes/Structs not being a child of vtkObjectBase are excluded as vtk-node uses vtkSmartPointers for all its objects and these don't work there.<br></div><div><br></div><div>* Create the .so libraries right from within the VTK build.</div><div><br></div><div>* Create altered WindowInteractor derivates which keep the node event loop running. I looked a little into XWindowRenderInteractor and there it should be very possible to have the X-event loop halt its select() and timer calculations in a separate thread, but hand on any X message via semaphore to be processed in the main thread.</div><div><br></div><div>* Detect other operating systems than Linux in the "npm install" script and include/exclude the correct wrapper classes.</div><div><br></div><div>Kind regards,</div></div>
<br>_______________________________________________<br>
Powered by <a href="http://www.kitware.com" rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank">http://markmail.org/search/?q=vtkusers</a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
<br></blockquote></div><br></div>