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.
