add more options for cylinder generation

This commit is contained in:
Stewart Allen 2024-07-20 15:29:04 -04:00
commit d45d0b618b
3 changed files with 39 additions and 19 deletions

View file

@ -2133,8 +2133,7 @@ class Polygon {
let z_side_top = z; let z_side_top = z;
let z_side_bottom = z_bottom; let z_side_bottom = z_bottom;
console.log({ chamfer }); // chamfer bottom only on negative chamfer
if (chamfer < 0) { if (chamfer < 0) {
chamfer_top = 0; chamfer_top = 0;
chamfer_bottom = -chamfer; chamfer_bottom = -chamfer;
@ -2156,7 +2155,6 @@ class Polygon {
if (chamfer_bottom) { if (chamfer_bottom) {
let inset = this.offset(chamfer_bottom); let inset = this.offset(chamfer_bottom);
console.log({ inset });
if (inset.length === 1) { if (inset.length === 1) {
inset[0].setZ(0); inset[0].setZ(0);
bottom_face = inset[0].earcut(); bottom_face = inset[0].earcut();

View file

@ -15,6 +15,7 @@ const { Matrix4, Vector3 } = THREE;
const { base, mesh, moto } = root; const { base, mesh, moto } = root;
const { space } = moto; const { space } = moto;
const { util } = mesh; const { util } = mesh;
const { newPolygon } = base;
const worker = moto.client.fn const worker = moto.client.fn
const groups = []; const groups = [];
@ -382,36 +383,57 @@ let add = {
const vert = box.attributes.position.array; const vert = box.attributes.position.array;
const nmdl = new mesh.model({ file: "box", mesh: vert }); const nmdl = new mesh.model({ file: "box", mesh: vert });
const ngrp = group.new([ nmdl ]); const ngrp = group.new([ nmdl ]);
ngrp.scale(5, 5, 5).floor(); ngrp.scale(10, 10, 10).floor();
}, },
cylinder(opt = { facets: 30 }) { cylinder(opt = {}) {
function gencyl(facets) { function gencyl(opt = {}) {
let { diameter, height, facets, chamfer, bore } = opt;
api.modal.hide(); api.modal.hide();
facets = parseInt(facets); if (diameter && height) {
if (facets > 3) { const center = { x:0, y:0, z:0 };
api.log.emit(`add cylinder with ${facets} facets`); api.log.emit(`add cylinder faces=${facets} height=${height} diameter=${diameter}`);
const cyl = new THREE.CylinderGeometry(5,5,1,facets).toNonIndexed(); facets = Math.max(3, facets || diameter * 3)
const vert = cyl.attributes.position.array; const cyl = newPolygon().centerCircle(center, diameter/2, facets);
if (bore && bore < diameter) {
cyl.addInner(newPolygon().centerCircle(center, bore/2, facets));
}
const vert = cyl.extrude(height, { chamfer }).toFloat32();
const nmdl = new mesh.model({ file: "cylinder", mesh: vert }); const nmdl = new mesh.model({ file: "cylinder", mesh: vert });
const ngrp = group.new([ nmdl ]); const ngrp = group.new([ nmdl ]);
ngrp.floor(); ngrp.floor();
} }
} }
if (opt.facets > 2) { if (opt.facets && opt.diameter && opt.height) {
gencyl(opt.facets); gencyl(opt.diameter, opt.height, opt.facets);
} else { } else {
api.modal.dialog({ api.modal.dialog({
title: "cylinder", title: "cylinder",
body: [ h.div({ class: "addact" }, [ body: [ h.div({ class: "addgear" }, [
h.label('diameter'),
h.input({ value: opt.diameter || 20, size: 5, id: "_diameter" }),
h.label('height'),
h.input({ value: opt.height || 10, size: 5, id: "_height" }),
h.hr(),
h.label('bore'),
h.input({ value: opt.facets || 0, size: 5, id: "_bore" }),
h.label('facets'), h.label('facets'),
h.input({ value: opt.facets || 30, size: 5, id: "gencyl" }), h.input({ value: opt.facets || 0, size: 5, id: "_facets" }),
h.label('chamfer'),
h.input({ value: opt.chamfer || 0, size: 5, id: "_chamfer" }),
h.button({ _: "create", onclick() { h.button({ _: "create", onclick() {
gencyl(api.modal.bound.gencyl.value) const { _diameter, _facets, _height, _chamfer, _bore } = api.modal.bound;
gencyl({
diameter: parseFloat(_diameter.value),
height: parseFloat(_height.value),
facets: parseInt(_facets.value),
bore: parseFloat(_bore.value),
chamfer: parseFloat(_chamfer.value),
});
} }) } })
]) ] ]) ]
}); });
api.modal.bound.gencyl.focus(); api.modal.bound._diameter.focus();
} }
}, },

View file

@ -373,8 +373,8 @@ function ui_build() {
h.div({ _: "add", class: "head" }), h.div({ _: "add", class: "head" }),
h.div({ class: "back"}), h.div({ class: "back"}),
h.div({ class: "pop"}, [ h.div({ class: "pop"}, [
h.button({ _: 'cylinder', onclick: add.cylinder }), h.button({ _: 'cylinder', onclick() { add.cylinder() } }),
h.button({ _: 'cube', onclick: add.cube }), h.button({ _: 'cube', onclick() { add.cube() } }),
h.button({ _: 'gear', onclick() { add.gear() } }), h.button({ _: 'gear', onclick() { add.gear() } }),
devel ? h.button({ _: 'input', onclick: add.input }) : undefined devel ? h.button({ _: 'input', onclick: add.input }) : undefined
]) ])