fix other random breakage / omissions

This commit is contained in:
Stewart Allen 2025-06-14 09:03:41 -04:00
commit f35e9dc46a
4 changed files with 115 additions and 30 deletions

View file

@ -82,7 +82,6 @@ kiri.load(api => {
}); });
}; };
CAM.holes = function(indiv,rec,onProgress,onDone) { CAM.holes = function(indiv,rec,onProgress,onDone) {
kiri.client.sync(); kiri.client.sync();
const settings = api.conf.get(); const settings = api.conf.get();

View file

@ -1,13 +1,14 @@
/** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */ /** Copyright Stewart Allen <sa@grid.space> -- All Rights Reserved */
import { broker } from '../moto/broker.js'; import { broker } from '../moto/broker.js';
import { h, $ } from '../moto/webui.js'; import { $, h } from '../moto/webui.js';
import { api } from './api.js'; import { api } from './api.js';
import { util } from './util.js'; import { util } from './util.js';
import { space } from '../moto/space.js'; import { space } from '../moto/space.js';
import { split } from './split.js'; import { split } from './split.js';
import { newPolygon } from '../geo/polygon.js'; import { newPolygon } from '../geo/polygon.js';
const { div, label, input, hr } = h;
const { dbug } = api; const { dbug } = api;
const devel = api.isDebug; const devel = api.isDebug;
@ -235,40 +236,118 @@ api.welcome = function(version = "unknown") {
// bind settings endpoint to api // bind settings endpoint to api
api.settings = function() { api.settings = function() {
const { util } = mesh;
const { prefs } = api; const { prefs } = api;
const { surface, normals, space, sketch, wireframe } = prefs.map; const { surface, normals, space, sketch, wireframe } = prefs.map;
const { dark } = space; const { dark } = space;
const set1 = h.div([ const set1 = div([
h.label('dark mode'), label('dark mode'),
h.input({ type: "checkbox", input({ type: "checkbox",
onchange: ev => call.set_darkmode(ev.target.checked), onchange: ev => call.set_darkmode(ev.target.checked),
checked: dark [ dark ? 'checked' : 'unchecked' ] : 1
}), }),
h.label('wireframe'), label('auto floor'),
h.input({ type: "checkbox", input({ type: "checkbox",
onchange: ev => call.set_wireframe(ev.target.checked), onchange: ev => prefs.save( space.floor = !space.floor ),
checked: wireframe [ space.floor !== false ? 'checked' : 'unchecked' ] : 1
}), }),
h.label('surface'), label('auto center'),
h.input({ type: "checkbox", input({ type: "checkbox",
onchange: ev => call.set_surface(ev.target.checked), onchange: ev => prefs.save( space.center = !space.center ),
checked: surface [ space.center !== false ? 'checked' : 'unchecked' ] : 1
}),
h.label('normals'),
h.input({ type: "checkbox",
onchange: ev => call.set_normals(ev.target.checked),
checked: normals
}),
h.label('sketch'),
h.input({ type: "checkbox",
onchange: ev => call.set_sketch(ev.target.checked),
checked: sketch
}), }),
]); ]);
modal.show('Settings', set1); const set2 = div([
label({ class: "header", _: 'wire'}),
label('opacity'),
input({ type: "text", size: 5, value: parseFloat(wireframe.opacity),
onchange: ev => call.set_wireframe_opacity(ev.target.value)
}),
label('fog x'),
input({ type: "text", size: 5, value: parseFloat(wireframe.fog),
onchange: ev => call.set_wireframe_fog(ev.target.value)
}),
]);
const set3 = div([
label({ class: "header", _: 'normal'}),
label('length'),
input({ type: "text", size: 6, value: parseFloat(normals.length),
onchange: ev => call.set_normals_length(ev.target.value)
}),
label('color'),
input({ type: "text", size: 6,
value: util.toHexRGB(dark ? normals.color_dark : normals.color_lite),
onchange: ev => call.set_normals_color(util.fromHexRGB(ev.target.value))
}),
]);
const set4 = div([
label({ class: "header", _: 'surface'}),
label('radians'),
input({ type: "text", size: 5, value: parseFloat(surface.radians),
onchange: ev => call.set_surface_radians(ev.target.value)
}),
label('radius'),
input({ type: "text", size: 5, value: parseFloat(surface.radius || 0.2),
onchange: ev => call.set_surface_radius(ev.target.value)
}),
]);
const set5 = div([
label({ class: "header", _: 'snap'}),
label('value'),
input({ type: "text", size: 5, value: parseFloat(space.snap || 1),
onchange: ev => call.set_snap_value(ev.target.value)
}),
label('enabled'),
input({ type: "checkbox",
onchange: ev => prefs.save( space.snapon = !space.snapon ),
[ space.snapon === true ? 'checked' : 'unchecked' ] : 1
}),
]);
const set6 = div([
label({ class: "header", _: 'duplicate'}),
label('select'),
input({ type: "checkbox",
onchange: ev => prefs.save( space.dup_sel = !space.dup_sel ),
[ space.dup_sel === true ? 'checked' : 'unchecked' ] : 1
}),
label('shift'),
input({ type: "checkbox",
onchange: ev => prefs.save( space.dup_shift = !space.dup_shift ),
[ space.dup_shift === true ? 'checked' : 'unchecked' ] : 1
}),
]);
let ot = sketch.open_type;
let srr = () => { api.sketch.list().forEach(s => s.render()) };
const set7 = div([
label({ class: "header", _: 'open poly'}),
label('auto close'),
input({ type: "checkbox",
onchange: ev => prefs.save( ((sketch.open_close = !sketch.open_close) || true) && srr() ),
[ sketch.open_close === true ? 'checked' : 'unchecked' ] : 1
}),
label('width'),
input({ type: "text", size: 5, value: parseFloat(sketch.open_width || 1),
onchange: ev => prefs.save( (sketch.open_width = parseFloat(ev.target.value)) && srr() )
}),
label('type'),
h.select({ type: "text", value: sketch.open_type,
onchange: ev => prefs.save( (sketch.open_type = ev.target.value) && srr() )
}, [
h.option({ _: 'square', [ot === 'square' ? 'selected' : '']: '' }),
h.option({ _: 'miter', [ot === 'miter' ? 'selected' : '']: '' }),
h.option({ _: 'round', [ot === 'round' ? 'selected' : '']: ''}),
]),
]);
modal.show('settings', div({ class: "settings" }, [
set1, set2, set3, set4, set5, set6, set7
] ));
}; };
// bootstrap icons // bootstrap icons
@ -446,7 +525,7 @@ function ui_build() {
div({ class: "menu" }, [ div({ class: "menu" }, [
div('Help'), div('Help'),
div({ class: "menu-items" }, [ div({ class: "menu-items" }, [
menu_item('About', () => { api.welcome(mesh.version) }), menu_item('About', () => { api.welcome(license.version) }),
hr(), hr(),
menu_item('Documentation', api.help), menu_item('Documentation', api.help),
menu_item('Report Bugs', api.bugs), menu_item('Report Bugs', api.bugs),

View file

@ -223,10 +223,14 @@ class MeshModel extends meshObject {
// moves mesh object center to target // moves mesh object center to target
centerTo(to) { centerTo(to) {
this.log('model-centerto', to); this.log('model-centerto', to);
let pos = this.position();
let { mid } = this.bounds; let { mid } = this.bounds;
this.translate(to.x - mid.x, to.y - mid.y, to.z - mid.z); let abs = this.world_bounds.mid;
this.position(pos.x, pos.y, pos.z); this.translate(
-mid.x + (abs.x - to.x),
-mid.y + (abs.y - to.y),
-mid.z + (abs.z - to.z),
);
this.position(to.x, to.y, to.z);
return this; return this;
} }

View file

@ -42,8 +42,11 @@ function build(data, context) {
func[key] = val; func[key] = val;
elid = elid || `_${nextid++}`; elid = elid || `_${nextid++}`;
} else if (tov === 'object') { } else if (tov === 'object') {
if (val.length) if (Array.isArray(val)) {
html.push(` ${key}="${val.filter(v => v !== undefined).join(' ')}"`); html.push(` ${key}="${val.filter(v => v !== undefined).join(' ')}"`);
} else {
html.push(` ${key}="${val}"`);
}
} else if (tov !== 'undefined') { } else if (tov !== 'undefined') {
html.push(` ${key}="${val}"`); html.push(` ${key}="${val}"`);
} }