Doodle3D-Core/src/d2/tools/CircleTool.js

52 lines
1.6 KiB
JavaScript

import { Vector } from '@doodle3d/cal';
import BaseTool from './BaseTool.js';
import * as humanReadable from '../../utils/humanReadable.js';
import { dimensionsText } from '../texts.js';
// import createDebug from 'debug';
// const debug = createDebug('d3d:2d:tool:circle');
export default class PolygonTool extends BaseTool {
constructor(dispatch, sceneSpaceContainer, renderRequest) {
super(dispatch, sceneSpaceContainer, renderRequest);
this.drawRuler = false;
this.rulerLength = 0;
this.rulerPosition = new Vector();
}
update(state) {
const activeShape = state.d2.activeShape && state.objectsById[state.d2.activeShape];
if (activeShape) {
this.drawRuler = true;
this.rulerPosition.copy(new Vector().applyMatrix(activeShape.transform));
this.rulerLength = activeShape.circle.radius;
return true;
} else if (this.drawRuler) {
this.drawRuler = false;
return true;
}
return false;
}
draw(context, matrix) {
if (this.drawRuler) {
context.beginPath();
const rulerStart = this.rulerPosition.applyMatrix(matrix);
const rulerEnd = this.rulerPosition.add(new Vector(this.rulerLength, 0)).applyMatrix(matrix);
context.moveTo(rulerStart.x, rulerStart.y);
context.lineTo(rulerEnd.x, rulerEnd.y);
context.lineWidth = 2;
context.strokeStyle = '#333';
context.stroke();
const rulerPosition = rulerStart.add(rulerEnd).scale(0.5).add(new Vector(0, -5));
const text = humanReadable.distance(this.rulerLength);
dimensionsText.drawText(context, text, rulerPosition.x, rulerPosition.y);
}
}
}