three.cad/src/sketcher/drawDimension.js

133 lines
2.8 KiB
JavaScript
Raw Normal View History

2021-04-03 03:33:09 +08:00
import * as THREE from '../../node_modules/three/src/Three';
2021-04-03 12:05:28 +08:00
const lineMaterial = new THREE.LineBasicMaterial({
linewidth: 2,
2021-04-04 08:59:14 +08:00
color: 0x156289,
2021-04-03 12:05:28 +08:00
})
const pointMaterial = new THREE.PointsMaterial({
2021-04-04 08:59:14 +08:00
color: 0x156289,
2021-04-03 12:05:28 +08:00
size: 4,
})
2021-04-04 08:59:14 +08:00
export async function drawDimension() {
2021-04-04 10:08:19 +08:00
let pts = await this.awaitPts(2)
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
if (pts.length != 2) return;
2021-04-03 03:33:09 +08:00
2021-04-04 08:59:14 +08:00
const line = new THREE.LineSegments(
new THREE.BufferGeometry().setAttribute('position',
2021-04-04 10:08:19 +08:00
new THREE.Float32BufferAttribute(3 * 8, 3)
2021-04-04 08:59:14 +08:00
),
lineMaterial.clone()
);
const point = new THREE.Points(
new THREE.BufferGeometry().setAttribute('position',
2021-04-04 10:08:19 +08:00
new THREE.Float32BufferAttribute(3, 3)
2021-04-04 08:59:14 +08:00
),
pointMaterial.clone()
2021-04-03 03:33:09 +08:00
)
2021-04-04 10:08:19 +08:00
const group = this.obj3d.children[0]
group.add(line)
group.add(point)
2021-04-03 03:33:09 +08:00
2021-04-04 08:59:14 +08:00
let dir, hyp, proj, perp, p1e, p2e, loc;
2021-04-04 10:08:19 +08:00
const p1 = new THREE.Vector2(...pts[0].geometry.attributes.position.array.slice(0, 2))
const p2 = new THREE.Vector2(...pts[1].geometry.attributes.position.array.slice(0, 2))
const p3 = new THREE.Vector2()
2021-04-04 08:59:14 +08:00
const onMove = (e) => {
2021-04-04 10:08:19 +08:00
2021-04-04 08:59:14 +08:00
loc = this.getLocation(e)
p3.set(loc.x, loc.y)
2021-04-03 03:33:09 +08:00
2021-04-04 08:59:14 +08:00
dir = p2.clone().sub(p1).normalize()
hyp = p3.clone().sub(p1)
proj = dir.multiplyScalar(hyp.dot(dir))
perp = hyp.sub(proj)
2021-04-03 12:05:28 +08:00
2021-04-04 08:59:14 +08:00
p1e = p1.clone().add(perp).toArray()
p2e = p2.clone().add(perp).toArray()
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
const linegeom = line.geometry.attributes.position.array
linegeom.set(p1.toArray(), 0)
linegeom.set(p1e, 3)
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
linegeom.set(p1e, 6)
linegeom.set(p2e, 9)
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
linegeom.set(p2e, 12)
linegeom.set(p2.toArray(), 15)
2021-04-03 12:05:28 +08:00
2021-04-04 10:08:19 +08:00
linegeom.set(p1e, 18)
linegeom.set(p3.toArray(), 21)
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
point.geometry.attributes.position.set(p3.toArray())
2021-04-03 03:33:09 +08:00
2021-04-04 08:59:14 +08:00
line.geometry.attributes.position.needsUpdate = true;
point.geometry.attributes.position.needsUpdate = true;
sc.render()
2021-04-03 03:33:09 +08:00
}
2021-04-04 08:59:14 +08:00
let onEnd, onKey;
2021-04-03 12:05:28 +08:00
2021-04-04 10:08:19 +08:00
let add = await new Promise((res) => {
2021-04-04 08:59:14 +08:00
onEnd = (e) => {
res(true)
this.updateOtherBuffers()
}
onKey = (e) => {
if (e.key == 'Escape') res(false)
}
this.canvas.addEventListener('pointermove', onMove)
this.canvas.addEventListener('pointerdown', onEnd)
window.addEventListener('keydown', onKey)
})
2021-04-03 03:33:09 +08:00
2021-04-04 08:59:14 +08:00
this.canvas.removeEventListener('pointermove', onMove)
this.canvas.removeEventListener('pointerdown', onEnd)
this.canvas.removeEventListener('keydown', onKey)
2021-04-03 03:33:09 +08:00
2021-04-04 10:08:19 +08:00
if (add) {
this.constraints.set(++this.c_id, //???
[
'pt_pt_distance', 10,
[pts[0].name, pts[1].name, -1, -1]
]
)
pts[0].userData.constraints.push(this.c_id)
pts[1].userData.constraints.push(this.c_id)
this.updateOtherBuffers()
line.name = this.c_id
point.name = this.c_id
} else {
group.children.splice(group.children.length - 2).forEach(
e => {
e.geometry.dispose()
e.material.dispose()
}
)
sc.render()
}
2021-04-03 03:33:09 +08:00
2021-04-03 12:05:28 +08:00
return
2021-04-03 03:33:09 +08:00
}