mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-17 22:15:44 +01:00
89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
import * as tk from '../../ui/toolkit.js'
|
|
import * as workbench from '../workbench'
|
|
import * as cad_utils from '../cad-utils'
|
|
import Vector from '../../math/vector'
|
|
import {Matrix3, ORIGIN} from '../../math/l3space'
|
|
import {revolveToWireframe} from '../revolve'
|
|
import {OpWizard, IMAGINE_MATERIAL, BASE_MATERIAL} from './wizard-commons'
|
|
|
|
export function RevolveWizard(app, face, initParams) {
|
|
OpWizard.call(this, app.viewer, initParams);
|
|
this.app = app;
|
|
this.face = face;
|
|
this.updatePolygons();
|
|
this.synch();
|
|
this.autoResoltion = true;
|
|
}
|
|
|
|
function defaultResolution(angle) {
|
|
return Math.max(2, Math.round(angle / 4.0 ));
|
|
}
|
|
|
|
RevolveWizard.prototype = Object.create( OpWizard.prototype );
|
|
|
|
RevolveWizard.prototype.DEFAULT_PARAMS = [180, defaultResolution(180)];
|
|
|
|
RevolveWizard.prototype.title = function() {
|
|
return "Revolve";
|
|
};
|
|
|
|
RevolveWizard.prototype.updatePolygons = function() {
|
|
this.polygons = workbench.getSketchedPolygons3D(this.app, this.face);
|
|
};
|
|
|
|
RevolveWizard.prototype.update = function(angle, resolution) {
|
|
let linesCounter = 0;
|
|
const segments = revolveToWireframe(this.polygons, this.polygons[0], angle / 180 * Math.PI, resolution);
|
|
for (let segment of segments) {
|
|
this.setupLine(linesCounter ++, segment[0], segment[1], IMAGINE_MATERIAL);
|
|
}
|
|
for (var i = 0; i < this.lines.length; i++) {
|
|
this.lines[i].visible = i < linesCounter;
|
|
}
|
|
};
|
|
|
|
RevolveWizard.prototype.createUI = function (angle, resolution) {
|
|
const ui = this.ui;
|
|
const folder = this.ui.folder;
|
|
tk.add(ui.box, folder);
|
|
ui.angle = tk.config(new tk.Number("Angle", angle, 5), {min: -360, max: 360, accelerator: 10});
|
|
ui.resolution = tk.config(new tk.Number("Resolution", resolution), {min: 2, accelerator: 2});
|
|
|
|
ui.angle.input.on('t-change', () => {
|
|
if (this.autoResoltion) {
|
|
ui.resolution.input.val(defaultResolution ( parseFloat(ui.angle.input.val()) ));
|
|
}
|
|
this.synch();
|
|
});
|
|
ui.resolution.input.on('t-change', () => {
|
|
this.autoResoltion = false;
|
|
this.synch();
|
|
});
|
|
tk.add(folder, ui.angle);
|
|
tk.add(folder, ui.resolution);
|
|
};
|
|
|
|
RevolveWizard.prototype.synch = function() {
|
|
this.update.apply(this, this.getParams());
|
|
this.app.viewer.render();
|
|
};
|
|
|
|
RevolveWizard.prototype.getParams = function() {
|
|
var angleValue = parseFloat(this.ui.angle.input.val());
|
|
var resolutionValue = parseFloat(this.ui.resolution.input.val());
|
|
return [angleValue, resolutionValue];
|
|
};
|
|
|
|
RevolveWizard.prototype.createRequest = function(done) {
|
|
const params = this.getParams();
|
|
done({
|
|
type : 'REVOLVE',
|
|
solids : [this.app.findSolidByCadId(this.face.solid.tCadId)],
|
|
face : this.app.findFace(this.face.id),
|
|
params : {
|
|
angle: params[0],
|
|
resolution: params[1]
|
|
},
|
|
protoParams: params
|
|
});
|
|
};
|