awv3
Version:
⚡ AWV3 embedded CAD
47 lines (43 loc) • 2.3 kB
JavaScript
import * as THREE from 'three'
import BaseGraphics from './base'
function closestAngle(value, to) {
const pi2 = 2 * Math.PI
while (Math.abs(value - pi2 - to) < Math.abs(value - to)) value -= pi2
while (Math.abs(value + pi2 - to) < Math.abs(value - to)) value += pi2
return value
}
export default class Angular extends BaseGraphics {
constructor(...args) {
super(...args, 2, 2, 2)
}
updateFromState(info, ...args) {
//take local coordinates of four points from CC data members
let [start, end, dim, corner] = ['startPt', 'endPt', 'dimPt', 'cornerPt'].map(x =>
new THREE.Vector3().fromArray(info.dimension.members[x].value),
)
let extendCrn = info.dimension.members.extendToCorner.value
//calculate radius & polar angles of the arc
const radius = corner.distanceTo(dim)
let startAng = Math.atan2(start.y - corner.y, start.x - corner.x),
endAng = Math.atan2(end.y - corner.y, end.x - corner.x)
//arc always goes from "start" to "end" according to "ccw" flag
if (!info.dimension.members.ccw.value) [start, end, startAng, endAng] = [end, start, endAng, startAng]
if (endAng < startAng) endAng += 2 * Math.PI
//check if dim-pos is outside of sector
let midAng = (startAng + endAng) * 0.5
let dimAng = Math.atan2(dim.y - corner.y, dim.x - corner.x)
dimAng = closestAngle(dimAng, midAng)
const outside = dimAng < startAng || dimAng > endAng
//set geometry for dimension
const [startFoot, endFoot] = [start, end].map(x => x.clone().sub(corner).setLength(radius).add(corner))
const startTang = new THREE.Vector3(Math.sin(startAng), -Math.cos(startAng), 0).multiplyScalar(outside ? -1 : 1)
const endTang = new THREE.Vector3(-Math.sin(endAng), Math.cos(endAng), 0).multiplyScalar(outside ? -1 : 1)
this.updateLine(0, extendCrn ? corner : start, startFoot)
this.updateLine(1, endFoot, extendCrn ? corner : end)
this.updateArc(0, corner, radius, startAng, dimAng)
this.updateArc(1, corner, radius, endAng, dimAng)
this.updateArrow(0, startFoot, startTang)
this.updateArrow(1, endFoot, endTang)
super.updateFromState(info, ...args)
}
}