Browse Source

Measure 测量工具

master
修宁 7 months ago
parent
commit
d462c9c224
  1. 33
      src/designer/Viewport.ts
  2. 29
      src/designer/model2DEditor/tools/MeasureTool.ts
  3. 42
      src/designer/model2DEditor/tools/MouseMoveInspect.ts

33
src/designer/Viewport.ts

@ -1,6 +1,6 @@
import _ from 'lodash' import _ from 'lodash'
import * as THREE from 'three' import * as THREE from 'three'
import { AxesHelper, GridHelper, OrthographicCamera, Raycaster, Scene, WebGLRenderer } from 'three' import { AxesHelper, GridHelper, OrthographicCamera, Raycaster, Scene, Vector3, WebGLRenderer } from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import EsDragControls from './model2DEditor/EsDragControls' import EsDragControls from './model2DEditor/EsDragControls'
import Stats from 'three/examples/jsm/libs/stats.module' import Stats from 'three/examples/jsm/libs/stats.module'
@ -61,10 +61,6 @@ export default class Viewport {
rotation: { x: 0, y: 0, z: 0 } rotation: { x: 0, y: 0, z: 0 }
}, },
mouse: { mouse: {
leftPx: 0,
topPx: 0,
posX: 0,
posZ: 0,
x: 0, x: 0,
y: 0 y: 0
} }
@ -448,6 +444,21 @@ export default class Viewport {
return this.raycaster.intersectObjects([this.gridHelper], false) return this.raycaster.intersectObjects([this.gridHelper], false)
} }
/**
* canvas (renderer.domElement)
*/
getClosestIntersection(e: MouseEvent) {
const _point = new THREE.Vector2()
_point.x = e.offsetX / this.renderer.domElement.offsetWidth
_point.y = e.offsetY / this.renderer.domElement.offsetHeight
const intersects = this.getIntersects(_point)
if (intersects && intersects.length > 2) {
return new Vector3(intersects[0].point.x, 0.1, intersects[1].point.z)
}
return null
}
} }
export interface ViewportState { export interface ViewportState {
@ -478,18 +489,6 @@ export interface ViewportState {
* () * ()
*/ */
mouse: { mouse: {
/*
* DOM
*/
leftPx: number,
topPx: number,
/**
* THREE
*/
posX: number,
posZ: number,
/** /**
* *
*/ */

29
src/designer/model2DEditor/tools/MeasureTool.ts

@ -56,7 +56,7 @@ export default class MeasureTool implements ICursorTool {
init(viewport: Viewport) { init(viewport: Viewport) {
this.viewport = viewport this.viewport = viewport
const viewerDom = this.viewport.viewerDom const viewerDom = this.viewport.viewerDom
this.canvas = $(viewerDom).children('canvas')[0] as HTMLCanvasElement this.canvas = this.viewport.renderer.domElement as HTMLCanvasElement
// 初始化group // 初始化group
this.group = new THREE.Group() this.group = new THREE.Group()
@ -120,7 +120,7 @@ export default class MeasureTool implements ICursorTool {
this.mouseMoved = true this.mouseMoved = true
// 当前鼠标所在的点 // 当前鼠标所在的点
const point = this.getClosestIntersection(e) const point = this.viewport.getClosestIntersection(e)
if (!point) { if (!point) {
return return
} }
@ -185,7 +185,7 @@ export default class MeasureTool implements ICursorTool {
} }
// 获取鼠标点击位置的三维坐标 // 获取鼠标点击位置的三维坐标
const point = this.getClosestIntersection(e) const point = this.viewport.getClosestIntersection(e)
if (!point) { if (!point) {
return return
} }
@ -266,27 +266,6 @@ export default class MeasureTool implements ICursorTool {
/** /**
*
*/
getClosestIntersection(e: MouseEvent) {
const _point = new THREE.Vector2()
_point.x = e.offsetX / this.viewport.renderer.domElement.offsetWidth
_point.y = e.offsetY / this.viewport.renderer.domElement.offsetHeight
const intersects = this.viewport.getIntersects(_point)
if (intersects && intersects.length > 2) {
if (intersects.length > 0 && intersects[0].distance < MeasureTool.MAX_DISTANCE) {
return new Vector3(
intersects[0].point.x,
0.1,
intersects[1].point.z
)
}
}
return null
}
/**
* *
*/ */
addOrUpdateTempLabel(label: string, position: THREE.Vector3) { addOrUpdateTempLabel(label: string, position: THREE.Vector3) {
@ -362,7 +341,7 @@ export default class MeasureTool implements ICursorTool {
* *
*/ */
redrawMousemove(e: MouseEvent) { redrawMousemove(e: MouseEvent) {
let point = this.getClosestIntersection(e) let point = this.viewport.getClosestIntersection(e)
if (!point && this.tempPointMarker) { if (!point && this.tempPointMarker) {
this.tempPointMarker.position.set(this.tempPointMarker.userData.point.x, this.tempPointMarker.userData.point.y, this.tempPointMarker.userData.point.z) this.tempPointMarker.position.set(this.tempPointMarker.userData.point.x, this.tempPointMarker.userData.point.y, this.tempPointMarker.userData.point.z)

42
src/designer/model2DEditor/tools/MouseMoveInspect.ts

@ -1,56 +1,40 @@
import type Viewport from '@/designer/Viewport.ts' import type Viewport from '@/designer/Viewport.ts'
import type { ITool } from '@/designer/model2DEditor/tools/ITool.ts' import type { ITool } from '@/designer/model2DEditor/tools/ITool.ts'
let pmFn
/** /**
* designer.mousePos * designer.mousePos
*/ */
export default class MouseMoveInspect implements ITool { export default class MouseMoveInspect implements ITool {
viewport: Viewport viewport: Viewport
canvas: HTMLCanvasElement
constructor() { constructor() {
} }
init(viewport: Viewport) { init(viewport: Viewport) {
this.viewport = viewport this.viewport = viewport
const viewerDom = this.viewport.viewerDom this.canvas = this.viewport.renderer.domElement as HTMLCanvasElement
viewerDom.addEventListener('mousemove', this.mouseMove.bind(this)) pmFn = this.mouseMove.bind(this)
this.canvas.addEventListener('pointermove', pmFn)
} }
destory() { destory() {
const viewerDom = this.viewport.viewerDom this.canvas.removeEventListener('pointermove', pmFn)
viewerDom.removeEventListener('mousemove', this.mouseMove.bind(this)) pmFn = undefined
} }
mouseMove = _.throttle(function(this: MouseMoveInspect, event: MouseEvent) { mouseMove = _.throttle(function(this: MouseMoveInspect, event: MouseEvent) {
const viewer = this.viewport.viewerDom // 当前鼠标所在的点
// 获取鼠标在three.js 中的归一化坐标 取值范围是 (-1 to +1) const point = this.viewport.getClosestIntersection(event)
const rect = viewer.getBoundingClientRect() if (!point) {
this.viewport.state.mouse.leftPx = event.clientX - rect.left
this.viewport.state.mouse.topPx = event.clientY - rect.top
this.viewport.state.mouse.posX = ((event.clientX - rect.left) / rect.width) * 2 - 1
this.viewport.state.mouse.posZ = ((event.clientY - rect.top) / rect.height) * -2 + 1
const intersects = this.viewport.getGridHelpAtPosition({
x: this.viewport.state.mouse.posX,
z: this.viewport.state.mouse.posZ
})
if (!intersects || intersects.length < 2) {
this.viewport.state.mouse.x = NaN
this.viewport.state.mouse.z = NaN
return
}
if (!_.every(intersects, (intersect) => intersect.object.type === 'GridHelper')) {
this.viewport.state.mouse.x = NaN
this.viewport.state.mouse.z = NaN
return return
} }
this.viewport.state.mouse.x = Math.floor(intersects[0].point.x * 10) / 10 this.viewport.state.mouse.x = point.x
this.viewport.state.mouse.z = Math.floor(intersects[1].point.z * 10) / 10 this.viewport.state.mouse.z = point.z
}, 1) }, 1)
} }
Loading…
Cancel
Save