awv3
Version:
⚡ AWV3 embedded CAD
87 lines (78 loc) • 3.11 kB
JavaScript
import * as THREE from 'three';
import BaseHandler from './base';
import {updateGeomObjectContainer} from "../preview";
import Object3 from "../../../three/object3";
import Snapper from "../snapper";
export default class DuplicateHandler extends BaseHandler {
static normalizeSelection(selectedObjects) {
return selectedObjects.filter(obj => {
if (obj.isConstraint())
return false; //constraints need renaming, so they are copied on server
if (!obj.parent.isSketch())
return false; //server does not expect subobjects (e.g. endpoints of a curve)
return true;
});
}
constructor(...args) {
super(...args);
this.objects = [];
this.keyPos = new THREE.Vector3();
this.currentOffset = new THREE.Vector3();
this.previewHolder = new THREE.Object3D();
this.sketcher.pool.add(this.previewHolder);
this.snapper = this.createSnapper();
}
init(duplicatedObjects) {
for (let obj of duplicatedObjects) {
let preview = new THREE.Object3D();
updateGeomObjectContainer(preview, {
...obj.geomParams,
coordinateSystem: new THREE.Matrix4(), //drop sketch transformation
});
this.objects.push({obj, preview});
this.previewHolder.add(preview);
}
//get bounding box in local sketch coordinates
let bbox = new THREE.Box3().setFromObject(this.previewHolder);
this.keyPos = bbox.getCenter();
this.snapper.setDraggedObjects(duplicatedObjects, this.keyPos);
//update preview again, so that they get sketch transformation
this.move(this.keyPos);
}
onMouseMove() {
this.move(this.getRecentMousePosition());
}
filterObjectsWithInteraction(object) {
return object.id === this.sketch.id;
}
[Object3.Events.Interaction.Clicked](object, hitObject) {
this.onMouseMove();
let offset = this.currentOffset;
let objects = this.objects.map(v => v.obj);
this.sketcher.copyObjects(objects, offset).then(() => {
//update set of sketch points in snapper
this.snapper.sketchPoints = undefined;
});
}
destroy(options) {
this.previewHolder.destroy();
super.destroy(options);
}
move(point) {
const snapOffset = this.snapper.snapDraggedObject(point).displacement;
this.currentOffset = point.clone().add(snapOffset).sub(this.keyPos);
for (let data of this.objects) {
let {obj, preview} = data;
let params = obj.geomParams;
for (name of ['start', 'end', 'center'])
if (params[name] instanceof THREE.Vector3)
params[name].add(this.currentOffset);
updateGeomObjectContainer(preview, {
coordinateSystem: this.sketch.matrixWorld,
scale: this.sketcher.graphicScale,
...params
});
}
this.sketcher.refresh();
}
}