@@ -5,7 +5,8 @@ import * as THREE from "three";
55import { TrackballControls } from "three/examples/jsm/controls/TrackballControls.js" ;
66import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js" ;
77
8- let renderer , scene ;
8+ let renderer : THREE . WebGLRenderer ;
9+ let scene : THREE . Scene ;
910
1011function init ( ) {
1112 const sizes = {
@@ -35,7 +36,7 @@ function init() {
3536 // the light follow the camera position
3637 controls . addEventListener ( "change" , lightUpdate ) ;
3738
38- function lightUpdate ( ) {
39+ function lightUpdate ( ) : void {
3940 directionalLight . position . copy ( camera . position ) ;
4041 }
4142
@@ -51,7 +52,7 @@ function init() {
5152 directionalLight . castShadow = true ;
5253 scene . add ( directionalLight ) ;
5354
54- function onWindowResize ( ) {
55+ function onWindowResize ( ) : void {
5556 // Update sizes
5657 sizes . width = window . innerWidth ;
5758 sizes . height = window . innerHeight - 100 ;
@@ -65,7 +66,7 @@ function init() {
6566 renderer . setPixelRatio ( Math . min ( window . devicePixelRatio , 2 ) ) ;
6667 }
6768
68- function render ( ) {
69+ function render ( ) : void {
6970 requestAnimationFrame ( render ) ;
7071 controls . update ( ) ;
7172 renderer . render ( scene , camera ) ;
@@ -76,27 +77,27 @@ function init() {
7677
7778init ( ) ;
7879
79- let mesh ;
80+ let mesh : THREE . Mesh | null = null ;
8081
81- const offsetElement = document . getElementById ( "offset" ) ;
82- const btnMeshOffset = document . getElementById ( "meshOffset" ) ;
83- const btnPointOffset = document . getElementById ( "pointOffset" ) ;
82+ const offsetElement = document . getElementById ( "offset" ) as HTMLInputElement ;
83+ const btnMeshOffset = document . getElementById ( "meshOffset" ) as HTMLButtonElement ;
84+ const btnPointOffset = document . getElementById ( "pointOffset" ) as HTMLButtonElement ;
8485
85- btnMeshOffset . addEventListener ( "click" , async ( e ) => {
86+ btnMeshOffset ? .addEventListener ( "click" , async ( e : Event ) => {
8687 e . preventDefault ( ) ;
8788
88- const offset = offsetElement . value ;
89+ const offset = Number ( offsetElement ? .value || 0 ) ;
8990
9091 if ( mesh ) {
9192 const meshOffset = await applyOffset ( mesh , offset ) ;
9293 removeAddOffset ( meshOffset ) ;
9394 }
9495} ) ;
9596
96- btnPointOffset . addEventListener ( "click" , ( e ) => {
97+ btnPointOffset ? .addEventListener ( "click" , ( e : Event ) => {
9798 e . preventDefault ( ) ;
9899
99- const offset = offsetElement . value ;
100+ const offset = Number ( offsetElement ? .value || 0 ) ;
100101
101102 if ( mesh ) {
102103 const newMesh = processGeometry ( mesh . geometry , offset ) ;
@@ -105,23 +106,29 @@ btnPointOffset.addEventListener("click", (e) => {
105106} ) ;
106107
107108// Load the file and get the geometry
108- document . getElementById ( "file" ) . onchange = ( e ) => {
109+ const fileInput = document . getElementById ( "file" ) as HTMLInputElement ;
110+ fileInput ?. addEventListener ( "change" , ( e : Event ) => {
111+ const target = e . target as HTMLInputElement ;
112+ const file = target . files ?. [ 0 ] ;
113+
114+ if ( ! file ) return ;
115+
109116 const reader = new FileReader ( ) ;
110117
111118 reader . onload = ( ) => {
112- const geometry = new STLLoader ( ) . parse ( reader . result ) ;
113-
114- createMeshFromFile ( geometry ) ;
119+ if ( reader . result ) {
120+ const geometry = new STLLoader ( ) . parse ( reader . result ) ;
121+ createMeshFromFile ( geometry ) ;
122+ }
115123 } ;
116124
117- reader . readAsArrayBuffer ( e . target . files [ 0 ] ) ;
118- } ;
125+ reader . readAsArrayBuffer ( file ) ;
126+ } ) ;
119127
120128/**
121129 * Creates the mesh from the file's geometry
122- * @param {THREE.BufferGeometry } geometry
123130 */
124- const createMeshFromFile = ( geometry ) => {
131+ const createMeshFromFile = ( geometry : THREE . BufferGeometry ) : void => {
125132 if ( mesh ) {
126133 scene . remove ( mesh ) ;
127134 }
@@ -135,32 +142,36 @@ const createMeshFromFile = (geometry) => {
135142 scene . add ( mesh ) ;
136143} ;
137144
138- const removeAddOffset = ( mesh ) => {
139- const offsetMesh = scene . children . filter ( ( item ) => item . name === mesh . name ) ;
145+ const removeAddOffset = ( offsetMesh : THREE . Mesh | THREE . Points ) : void => {
146+ const existingMesh = scene . children . filter ( ( item ) => item . name === offsetMesh . name ) ;
140147
141- if ( offsetMesh . length === 0 ) {
142- scene . add ( mesh ) ;
148+ if ( existingMesh . length === 0 ) {
149+ scene . add ( offsetMesh ) ;
143150 } else {
144- scene . remove ( offsetMesh [ 0 ] ) ;
145- scene . add ( mesh ) ;
151+ scene . remove ( existingMesh [ 0 ] ) ;
152+ scene . add ( offsetMesh ) ;
146153 }
147154} ;
148155
149156// Button to clear the scene
150- const btnClearScene = document . getElementById ( "clearScene" ) ;
157+ const btnClearScene = document . getElementById ( "clearScene" ) as HTMLButtonElement ;
151158
152- btnClearScene . addEventListener ( "click" , ( ) => {
159+ btnClearScene ? .addEventListener ( "click" , ( ) => {
153160 clearScene ( ) ;
154161} ) ;
155162
156- const clearScene = ( ) => {
163+ const clearScene = ( ) : void => {
157164 const meshes = scene . children . filter ( ( item ) => item . type === "Mesh" || item . type === "Points" ) ;
158165
159166 if ( meshes . length > 0 ) {
160- for ( const mesh of meshes ) {
161- scene . remove ( mesh ) ;
167+ for ( const meshItem of meshes ) {
168+ scene . remove ( meshItem ) ;
162169 }
163170
164- document . getElementById ( "file" ) . value = "" ;
171+ const fileInput = document . getElementById ( "file" ) as HTMLInputElement ;
172+ if ( fileInput ) {
173+ fileInput . value = "" ;
174+ }
165175 }
176+ mesh = null ;
166177} ;
0 commit comments