UNPKG

awv3

Version:
47 lines (43 loc) 2.3 kB
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) } }