jsketcher/web/app/sketcher/tools/ellipse-edit.js
Val Erastov (xibyte) 4f7e7267ea ellipse rework
2020-07-18 13:09:47 -07:00

73 lines
No EOL
1.5 KiB
JavaScript

import {Tool} from './tool'
export class EllipseEditTool extends Tool {
constructor(viewer, ellipse) {
super('edit ellipse', viewer);
this.ellipse = ellipse;
}
restart() {
// this.sendHint('specify a center of the ellipse')
}
cleanup(e) {
}
mousedown(e) {
const p = this.viewer.screenToModel(e);
const dx = p.x - this.ellipse.c.x;
const dy = p.y - this.ellipse.c.y;
this.dRot = this.ellipse.rot.get() - Math.atan2(dy, dx);
}
mouseup(e) {
this.solveRequest(false);
this.viewer.toolManager.releaseControl();
}
mousemove(e) {
const p = this.viewer.screenToModel(e);
const dx = p.x - this.ellipse.c.x;
const dy = p.y - this.ellipse.c.y;
const rot = Math.atan2(dy, dx);
const ellRot = this.dRot + rot;
this.ellipse.rot.set(ellRot);
const eAng = - this.dRot;
const rm = (eAng + 10 * Math.PI) % Math.PI;
if (rm > Math.PI / 4 && rm < 3/4*Math.PI) {
const axisX = - Math.sin(ellRot);
const axisY = Math.cos(ellRot);
this.ellipse.ry.set(Math.abs(dx * axisX + dy * axisY))
} else {
const axisX = Math.cos(ellRot);
const axisY = Math.sin(ellRot);
this.ellipse.rx.set(Math.abs(dx * axisX + dy * axisY))
}
if (!Tool.dumbMode(e)) {
this.solveRequest(true);
}
this.viewer.refresh();
}
solveRequest(rough) {
this.viewer.parametricManager.prepare([{
visitParams: (cb) => {
cb(this.ellipse.rx);
cb(this.ellipse.ry);
}
}]);
this.viewer.parametricManager.solve(rough);
}
}