diff --git a/src/kiri-mode/cam/driver.js b/src/kiri-mode/cam/driver.js index 44220e29..0487499e 100644 --- a/src/kiri-mode/cam/driver.js +++ b/src/kiri-mode/cam/driver.js @@ -82,7 +82,6 @@ kiri.load(api => { }); }; - CAM.holes = function(indiv,rec,onProgress,onDone) { kiri.client.sync(); const settings = api.conf.get(); diff --git a/src2/mesh/build.js b/src2/mesh/build.js index af7fc591..9dd7bcf7 100644 --- a/src2/mesh/build.js +++ b/src2/mesh/build.js @@ -1,13 +1,14 @@ /** Copyright Stewart Allen -- All Rights Reserved */ import { broker } from '../moto/broker.js'; -import { h, $ } from '../moto/webui.js'; +import { $, h } from '../moto/webui.js'; import { api } from './api.js'; import { util } from './util.js'; import { space } from '../moto/space.js'; import { split } from './split.js'; import { newPolygon } from '../geo/polygon.js'; +const { div, label, input, hr } = h; const { dbug } = api; const devel = api.isDebug; @@ -235,40 +236,118 @@ api.welcome = function(version = "unknown") { // bind settings endpoint to api api.settings = function() { - const { util } = mesh; const { prefs } = api; const { surface, normals, space, sketch, wireframe } = prefs.map; const { dark } = space; - const set1 = h.div([ - h.label('dark mode'), - h.input({ type: "checkbox", + const set1 = div([ + label('dark mode'), + input({ type: "checkbox", onchange: ev => call.set_darkmode(ev.target.checked), - checked: dark + [ dark ? 'checked' : 'unchecked' ] : 1 }), - h.label('wireframe'), - h.input({ type: "checkbox", - onchange: ev => call.set_wireframe(ev.target.checked), - checked: wireframe + label('auto floor'), + input({ type: "checkbox", + onchange: ev => prefs.save( space.floor = !space.floor ), + [ space.floor !== false ? 'checked' : 'unchecked' ] : 1 }), - h.label('surface'), - h.input({ type: "checkbox", - onchange: ev => call.set_surface(ev.target.checked), - checked: surface - }), - 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 + label('auto center'), + input({ type: "checkbox", + onchange: ev => prefs.save( space.center = !space.center ), + [ space.center !== false ? 'checked' : 'unchecked' ] : 1 }), ]); - 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 @@ -446,7 +525,7 @@ function ui_build() { div({ class: "menu" }, [ div('Help'), div({ class: "menu-items" }, [ - menu_item('About', () => { api.welcome(mesh.version) }), + menu_item('About', () => { api.welcome(license.version) }), hr(), menu_item('Documentation', api.help), menu_item('Report Bugs', api.bugs), diff --git a/src2/mesh/model.js b/src2/mesh/model.js index 2f82a8de..8e93b316 100644 --- a/src2/mesh/model.js +++ b/src2/mesh/model.js @@ -223,10 +223,14 @@ class MeshModel extends meshObject { // moves mesh object center to target centerTo(to) { this.log('model-centerto', to); - let pos = this.position(); let { mid } = this.bounds; - this.translate(to.x - mid.x, to.y - mid.y, to.z - mid.z); - this.position(pos.x, pos.y, pos.z); + let abs = this.world_bounds.mid; + 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; } diff --git a/src2/moto/webui.js b/src2/moto/webui.js index 59f59279..6bb0704c 100644 --- a/src2/moto/webui.js +++ b/src2/moto/webui.js @@ -42,8 +42,11 @@ function build(data, context) { func[key] = val; elid = elid || `_${nextid++}`; } else if (tov === 'object') { - if (val.length) - html.push(` ${key}="${val.filter(v => v !== undefined).join(' ')}"`); + if (Array.isArray(val)) { + html.push(` ${key}="${val.filter(v => v !== undefined).join(' ')}"`); + } else { + html.push(` ${key}="${val}"`); + } } else if (tov !== 'undefined') { html.push(` ${key}="${val}"`); }