@@ -2,6 +2,7 @@ import '@kitware/vtk.js/favicon';
22
33// Load the rendering pieces we want to use (for both WebGL and WebGPU)
44import '@kitware/vtk.js/Rendering/Profiles/Geometry' ;
5+ import GUI from 'lil-gui' ;
56
67import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor' ;
78import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow' ;
@@ -13,7 +14,6 @@ import vtkPolyDataNormals from '@kitware/vtk.js/Filters/Core/PolyDataNormals';
1314// ----------------------------------------------------------------------------
1415
1516const reader = vtkSTLReader . newInstance ( ) ;
16- reader . setRemoveDuplicateVertices ( 5 ) ;
1717const mapper = vtkMapper . newInstance ( { scalarVisibility : false } ) ;
1818const actor = vtkActor . newInstance ( ) ;
1919
@@ -24,49 +24,91 @@ mapper.setInputConnection(normals.getOutputPort());
2424
2525// ----------------------------------------------------------------------------
2626
27- function update ( ) {
28- const fullScreenRenderer = vtkFullScreenRenderWindow . newInstance ( ) ;
29- const renderer = fullScreenRenderer . getRenderer ( ) ;
30- const renderWindow = fullScreenRenderer . getRenderWindow ( ) ;
31-
32- const resetCamera = renderer . resetCamera ;
33- const render = renderWindow . render ;
27+ const fullScreenRenderer = vtkFullScreenRenderWindow . newInstance ( ) ;
28+ const renderer = fullScreenRenderer . getRenderer ( ) ;
29+ const renderWindow = fullScreenRenderer . getRenderWindow ( ) ;
30+ renderer . addActor ( actor ) ;
3431
35- renderer . addActor ( actor ) ;
36- resetCamera ( ) ;
37- render ( ) ;
32+ function update ( ) {
33+ renderer . resetCamera ( ) ;
34+ renderWindow . render ( ) ;
3835}
3936
4037// ----------------------------------------------------------------------------
41- // Use a file reader to load a local file
38+ // File handling
4239// ----------------------------------------------------------------------------
4340
44- const myContainer = document . querySelector ( 'body' ) ;
45- const fileContainer = document . createElement ( 'div' ) ;
46- fileContainer . innerHTML = '<input type="file" class="file"/>' ;
47- myContainer . appendChild ( fileContainer ) ;
41+ let lastLoadedArrayBuffer = null ;
42+
43+ function parseCurrentBuffer ( ) {
44+ if ( ! lastLoadedArrayBuffer ) {
45+ return ;
46+ }
47+ reader . parseAsArrayBuffer ( lastLoadedArrayBuffer . slice ( 0 ) ) ;
48+ update ( ) ;
49+ }
4850
49- const fileInput = fileContainer . querySelector ( 'input' ) ;
51+ const hiddenFileInput = document . createElement ( 'input' ) ;
52+ hiddenFileInput . type = 'file' ;
53+ hiddenFileInput . accept = '.stl' ;
54+ hiddenFileInput . style . display = 'none' ;
55+ document . body . appendChild ( hiddenFileInput ) ;
5056
5157function handleFile ( event ) {
5258 event . preventDefault ( ) ;
5359 const dataTransfer = event . dataTransfer ;
5460 const files = event . target . files || dataTransfer . files ;
5561 if ( files . length === 1 ) {
56- myContainer . removeChild ( fileContainer ) ;
5762 const fileReader = new FileReader ( ) ;
5863 fileReader . onload = function onLoad ( e ) {
59- reader . parseAsArrayBuffer ( fileReader . result ) ;
60- update ( ) ;
64+ lastLoadedArrayBuffer = fileReader . result ;
65+ parseCurrentBuffer ( ) ;
6166 } ;
6267 fileReader . readAsArrayBuffer ( files [ 0 ] ) ;
6368 }
6469}
6570
66- fileInput . addEventListener ( 'change' , handleFile ) ;
71+ hiddenFileInput . addEventListener ( 'change' , handleFile ) ;
72+
73+ // ----------------------------------------------------------------------------
74+ // GUI
75+ // ----------------------------------------------------------------------------
76+
77+ const settings = {
78+ merging : true ,
79+ removeDuplicateVertices : - 1 ,
80+ openFile ( ) {
81+ hiddenFileInput . click ( ) ;
82+ } ,
83+ } ;
84+
85+ reader . setMerging ( settings . merging ) ;
86+ reader . setRemoveDuplicateVertices ( settings . removeDuplicateVertices ) ;
87+
88+ const gui = new GUI ( { title : 'Controls' } ) ;
89+ gui
90+ . add ( settings , 'merging' )
91+ . name ( 'merging' )
92+ . onChange ( ( value ) => {
93+ reader . setMerging ( value ) ;
94+ parseCurrentBuffer ( ) ;
95+ } ) ;
96+ gui
97+ . add ( settings , 'removeDuplicateVertices' , - 1 , 12 , 1 )
98+ . name ( 'removeDuplicateVertices' )
99+ . onChange ( ( value ) => {
100+ reader . setRemoveDuplicateVertices ( value ) ;
101+ parseCurrentBuffer ( ) ;
102+ } ) ;
103+ gui . add ( settings , 'openFile' ) . name ( 'Open STL...' ) ;
67104
68105// ----------------------------------------------------------------------------
69106// Use the reader to download a file
70107// ----------------------------------------------------------------------------
71108
72- // reader.setUrl(`${__BASE_PATH__}/data/stl/segmentation.stl`, { binary: true }).then(update);
109+ fetch ( `${ __BASE_PATH__ } /data/stl/suzanne.stl` )
110+ . then ( ( response ) => response . arrayBuffer ( ) )
111+ . then ( ( arrayBuffer ) => {
112+ lastLoadedArrayBuffer = arrayBuffer ;
113+ parseCurrentBuffer ( ) ;
114+ } ) ;
0 commit comments