You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.7 KiB
130 lines
3.7 KiB
import { DragControls } from './DragControls.js'
|
|
import * as THREE from 'three'
|
|
import type Viewport from '@/designer/Viewport.ts'
|
|
import Constract from '@/designer/Constract.ts'
|
|
|
|
// dragControls 绑定函数
|
|
let dragStartFn, dragFn, dragEndFn, clickblankFn
|
|
|
|
export default class EsDragControls {
|
|
protected _dragObjects: THREE.Object3D[] = [] // 拖拽对象
|
|
dragControls: any
|
|
private onDownPosition: { x: number; y: number } = { x: -1, y: -1 }
|
|
|
|
viewport: Viewport
|
|
isDragging = false
|
|
|
|
constructor(viewport) {
|
|
this.viewport = viewport
|
|
|
|
// 物体拖拽控制器
|
|
this.dragControls = new DragControls(this._dragObjects, viewport.camera, viewport.renderer.domElement)
|
|
this.dragControls.deactivate() // 默认禁用
|
|
dragStartFn = this.dragControlsStart.bind(this)
|
|
this.dragControls.addEventListener('dragstart', dragStartFn)
|
|
dragFn = this.drag.bind(this)
|
|
this.dragControls.addEventListener('drag', dragFn)
|
|
dragEndFn = this.dragControlsEnd.bind(this)
|
|
this.dragControls.addEventListener('dragend', dragEndFn)
|
|
// 点击可拖拽物体之外
|
|
clickblankFn = this.clickblank.bind(this)
|
|
this.dragControls.addEventListener('clickblank', clickblankFn)
|
|
}
|
|
|
|
set domElement(element: HTMLElement) {
|
|
this.dragControls.setDomElement(element)
|
|
}
|
|
|
|
setDragObjects(objects: THREE.Object3D[], type: 'eq' | 'push' | 'remove' = 'eq') {
|
|
// 当前拖拽对象为空时加入对象需激活控制器
|
|
if (this._dragObjects.length === 0) {
|
|
if (objects.length > 0) {
|
|
this.dragControls.activate()
|
|
}
|
|
|
|
this._dragObjects = objects
|
|
} else {
|
|
// 当前拖拽对象不为空时
|
|
if (type === 'eq') {
|
|
// 是清空拖拽对象的设置,则禁用控制器
|
|
if (objects.length === 0) {
|
|
this.dragControls.deactivate()
|
|
}
|
|
|
|
this._dragObjects = objects
|
|
} else if (type === 'push') {
|
|
this._dragObjects.push(...objects)
|
|
} else if (type === 'remove') {
|
|
this._dragObjects = this._dragObjects.filter((item) => !objects.includes(item))
|
|
}
|
|
}
|
|
|
|
this.dragControls.setObjects(this._dragObjects)
|
|
}
|
|
|
|
// 拖拽开始
|
|
dragControlsStart(e) {
|
|
// 右键拖拽不响应
|
|
if (e.e.button === 2 || !e.object.userData.type || !e.object.visible) return
|
|
|
|
e.e.preventDefault()
|
|
|
|
// 拖拽时禁用其他控制器
|
|
this.viewport.controls.enabled = false
|
|
|
|
this.isDragging = true
|
|
|
|
// 记录拖拽按下的位置和对象
|
|
this.onDownPosition = { x: e.e.clientX, y: e.e.clientY }
|
|
|
|
switch (e.object.userData.type) {
|
|
case Constract.MeasureMarker:
|
|
this.viewport.measure.dragPointStart(e.object)
|
|
break
|
|
}
|
|
}
|
|
|
|
// 拖拽中
|
|
drag(e) {
|
|
this.viewport.dispatchSignal('objectChanged', e.object)
|
|
}
|
|
|
|
// 拖拽结束
|
|
dragControlsEnd(e) {
|
|
// 右键拖拽不响应
|
|
if (e.e.button === 2 || !e.object.visible) return
|
|
|
|
// 拖拽结束启用其他控制器
|
|
this.viewport.controls.enabled = true
|
|
|
|
this.isDragging = false
|
|
|
|
if (!e.object.userData.type) return
|
|
|
|
// 判断位置是否有变化,没有变化则为点击
|
|
if (this.onDownPosition.x === e.e.clientX && this.onDownPosition.y === e.e.clientY) {
|
|
if (e.object.userData.onClick) {
|
|
e.object.userData.onClick(e)
|
|
}
|
|
}
|
|
|
|
switch (e.object.userData.type) {
|
|
case Constract.MeasureMarker:
|
|
this.viewport.measure.dragPointComplete()
|
|
break
|
|
}
|
|
}
|
|
|
|
// 点击可拖拽物体之外
|
|
clickblank(e) {
|
|
if (e.e.button === 2) return
|
|
}
|
|
|
|
dispose() {
|
|
this._dragObjects = []
|
|
|
|
this.dragControls.removeEventListener('dragstart', dragStartFn)
|
|
this.dragControls.removeEventListener('dragend', dragEndFn)
|
|
this.dragControls.dispose()
|
|
}
|
|
}
|