UNPKG

awv3

Version:
87 lines (78 loc) 3.11 kB
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(); } }