mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-08 09:24:18 +01:00
73 lines
No EOL
1.5 KiB
JavaScript
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);
|
|
}
|
|
|
|
} |