Changing parameters
Made a change to an object when changing values in the options menu. To do this, redid the mechanism for creating geometry.
this.createGeometry = function ( geometryType, params ) { let geometry = null; let paramsArray; if ( !(params instanceof Object) ) { console.error( 'params must be an object. Now params are ' + typeof params ); return; } switch ( geometryType ) { case 'BoxGeometry': geometry = new THREE.BoxGeometry(); this.checkParams( params, geometry.parameters ); paramsArray = Object.values( params ); //применяем оператор расширения, очень удобная штука, код получается очень лаконичным geometry = new THREE.BoxGeometry( ...paramsArray ); break;
I check the transferred parameters, if there is no parameter or it is not set to a value, I am writing a warning to the console.
this.checkParams = function( paramsToCheck, paramsTemplate ) { if ( !(paramsToCheck instanceof Object) ) { console.error( 'paramsToCheck must be an object. Now params are ' + typeof params ); return; } if ( !(paramsTemplate instanceof Object) ) { console.error( 'paramsTamplate must be an object. Now params are ' + typeof params ); return; } let data = {}; Object.assign( data, paramsTemplate ); for (const key in data) { if ( !paramsToCheck.hasOwnProperty(key) ) { console.warn( 'Parameter "' + key + '" is missing ' ); } else { if ( paramsToCheck[ key ] === undefined && paramsToCheck[ key ] === '' ) { console.warn ( '"' + key + '" not set'); } } } }
Function for changing parameters, on the event of the input field “onInput”. The createGeometry function (entity.geometry.type, params) is also used here;
this.updateSelectedObject = function( parameterName, parameterValue, entity ) { let geom = entity.geometry; let params = {}; // берем параметры выделенного объекта Object.assign( params, geom.parameters ); // присваиваем параметр из поля ввода одноименному параметру params[ parameterName ] = parameterValue; // создаем новую геометрию let newGeom = this.createGeometry ( entity.geometry.type, params ); entity.geometry.dispose(); // присваиваем новую геометрию выделенному объекту entity.geometry = newGeom; // обновляем отображение сетки let wireframe = entity.getObjectByName( 'wireframe' ); let newWireframeGeometry = new THREE.WireframeGeometry( newGeom ); wireframe.geometry = newWireframeGeometry; // Обновляем отображение BoundingBox. Если в случае с объектом Object 3D нужно заменить geomtry, то тут нужно заменить box новым let boundingBox = entity.getObjectByName( 'BoundingBox' ); entity.geometry.computeBoundingBox(); let box = new THREE.Box3Helper( entity.geometry.boundingBox ); boundingBox.box = box.box; }
Now you can add the creation of the remaining primitives, changing the parameters can be attached to any object.