mirror of
https://github.com/Doodle3D/Doodle3D-Core.git
synced 2024-10-05 11:08:38 +02:00
82 lines
2.7 KiB
JavaScript
82 lines
2.7 KiB
JavaScript
|
import BaseTool from './BaseTool.js';
|
||
|
import { Vector, Utils } from 'cal';
|
||
|
import * as humanReadable from '../../utils/humanReadable.js';
|
||
|
import { dimensionsText } from '../texts.js';
|
||
|
// import createDebug from 'debug';
|
||
|
// const debug = createDebug('d3d:2d:tool:polygon');
|
||
|
|
||
|
export default class PolygonTool extends BaseTool {
|
||
|
constructor(dispatch, sceneSpaceContainer, renderRequest) {
|
||
|
super(dispatch, sceneSpaceContainer, renderRequest);
|
||
|
|
||
|
this.drawRuler = false;
|
||
|
|
||
|
this.rulerLength = 0;
|
||
|
this.rulerAngle = 0;
|
||
|
this.rulerPosition = new Vector();
|
||
|
|
||
|
// this.anglePosition = new Vector();
|
||
|
// this.angleDegrees = 0;
|
||
|
}
|
||
|
update(state) {
|
||
|
const activeShape = state.d2.activeShape && state.objectsById[state.d2.activeShape];
|
||
|
if (activeShape) {
|
||
|
this.drawRuler = true;
|
||
|
|
||
|
const pointA = activeShape.points[activeShape.points.length - 2];
|
||
|
const pointB = activeShape.points[activeShape.points.length - 1];
|
||
|
|
||
|
this.rulerPosition.copy(pointA.add(pointB).scale(0.5));
|
||
|
this.rulerLength = pointA.distanceTo(pointB);
|
||
|
this.rulerAngle = pointB
|
||
|
.subtract(pointA)
|
||
|
.scale(Utils.MathExtended.sign(pointB.subtract(pointA).x) || 1)
|
||
|
.angle();
|
||
|
|
||
|
// this.anglePosition.copy(pointA);
|
||
|
// this.angleDegrees = (pointB.subtract(pointA).angle() + (Math.PI * 2.0)) % (Math.PI * 2.0);
|
||
|
|
||
|
return true;
|
||
|
} else if (this.drawRuler) {
|
||
|
this.drawRuler = false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
draw(context, matrix) {
|
||
|
if (this.drawRuler) {
|
||
|
context.save();
|
||
|
|
||
|
const rulerPosition = this.rulerPosition.applyMatrix(matrix);
|
||
|
context.translate(rulerPosition.x, rulerPosition.y);
|
||
|
context.rotate(this.rulerAngle);
|
||
|
|
||
|
const text = humanReadable.distance(this.rulerLength);
|
||
|
dimensionsText.drawText(context, text, 0, -5);
|
||
|
|
||
|
context.restore();
|
||
|
|
||
|
context.beginPath();
|
||
|
|
||
|
// const anglePosition = this.anglePosition.applyMatrix(matrix);
|
||
|
// context.arc(anglePosition.x, anglePosition.y, 20, 0, this.angleDegrees, this.angleDegrees > Math.PI);
|
||
|
//
|
||
|
// context.strokeStyle = 'black';
|
||
|
// context.lineWidth = 1;
|
||
|
// context.stroke();
|
||
|
//
|
||
|
// const angleTextPos = new Vector(28, 0)
|
||
|
// .rotate((this.angleDegrees < Math.PI ? this.angleDegrees : this.angleDegrees - Math.PI * 2.0) / 2)
|
||
|
// .add(anglePosition);
|
||
|
// context.textAlign = 'start';
|
||
|
// context.textBaseline = 'middle';
|
||
|
// context.fillStyle = '#000';
|
||
|
// context.font = '10px Arial';
|
||
|
//
|
||
|
// const angleDegrees = this.angleDegrees < Math.PI ? this.angleDegrees : Math.PI * 2 - this.angleDegrees;
|
||
|
// dimensionsText.drawText(context, humanReadable.degrees(angleDegrees), angleTextPos.x, angleTextPos.y);
|
||
|
}
|
||
|
}
|
||
|
}
|