From cc93c9a6e9c6e43b655946416a1e788fba6e45cf Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Jul 2024 10:53:27 -0600 Subject: [PATCH 1/6] add gear generator to mesh tool --- src/geo/polygon.js | 14 +++++++++ src/mesh/api.js | 34 +++++++++++++++++++++ src/mesh/build.js | 1 + src/mesh/tool.js | 73 ++++++++++++++++++++++++++++++++++++++++++++++ src/mesh/work.js | 11 ++++++- web/mesh/index.css | 12 +++++++- 6 files changed, 143 insertions(+), 2 deletions(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index ee85691f..205cd65a 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -992,6 +992,20 @@ class Polygon { return this; } + /** + * @param {int[]} verts flat array of x,y,z vertices + */ + addVerts(verts) { + for (let i=0; i { + const nmdl = new mesh.model({ file: "gear", mesh: gear.toFloat32() }); + const ngrp = group.new([ nmdl ]); + ngrp.floor(); + }); + } + api.modal.dialog({ + title: "gear generator", + body: [ h.div({ class: "addgear" }, [ + h.label('number of teeth'), + h.input({ value: opt.teeth || 20, size: 5, id: "gteeth" }), + h.label('module (diam / teeth)'), + h.input({ value: opt.module || 3, size: 5, id: "gmodule" }), + h.label('pressure angle'), + h.input({ value: opt.angle || 20, size: 5, id: "gangle" }), + h.button({ _: "create", onclick() { + gengear( + api.modal.bound.gteeth.value, + api.modal.bound.gmodule.value, + api.modal.bound.gangle.value, + ) + } }) + ]) ] + }); + api.modal.bound.gteeth.focus(); } }; diff --git a/src/mesh/build.js b/src/mesh/build.js index 53255861..bcd2d987 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -373,6 +373,7 @@ function ui_build() { h.div({ class: "pop"}, [ h.button({ _: 'cylinder', onclick: add.cylinder }), h.button({ _: 'cube', onclick: add.cube }), + h.button({ _: 'gear', onclick: add.gear }), devel ? h.button({ _: 'input', onclick: add.input }) : undefined ]) ]), diff --git a/src/mesh/tool.js b/src/mesh/tool.js index 611a9bdc..556a9b9c 100644 --- a/src/mesh/tool.js +++ b/src/mesh/tool.js @@ -737,6 +737,79 @@ mesh.tool = class MeshTool { } return out; } + + generateGear(numTeeth, module, pressureAngle) { + // Adapted from: Public Domain Parametric Involute Spur Gear by Leemon Baird, 2011, Leemon@Leemon.com http://www.thingiverse.com/thing:5505 + // see also http://grabcad.com/questions/tutorial-how-to-model-involute-gears-in-solidworks-and-show-design-intent + + const pi = Math.PI; + + // degrees to radians + function degrees_to_radians(theta) { return theta / 180 * pi; } + + // polar to cartesian + function polar(r, theta) { return [r * Math.sin(theta), r * Math.cos(theta)]; } + + // point on involute curve + function q6(b, s, t, d) { return polar(d, s * (iang(b, d) + t)); } + + // unwind this many degrees to go from r1 to r2 + function iang(r1, r2) { return Math.sqrt((r2 / r1) * (r2 / r1) - 1) - Math.acos(r1 / r2); } + + // radius a fraction f up the curved side of the tooth + function q7(f, r, b, r2, t, s) { return q6(b, s, t, (1 - f) * Math.max(b, r) + f * r2); } + + // rotate an array of 2d points + function rotate(points_array, angle) { + let answer = []; + for (let i = 0; i < points_array.length; i++) { + let x = points_array[i][0]; + let y = points_array[i][1]; + let xr = x * Math.cos(angle) - y * Math.sin(angle); + let yr = y * Math.cos(angle) + x * Math.sin(angle); + answer.push([xr, yr]); + } + return answer; + } + + // involute gear maker + function build_gear(number_of_teeth) { + let p = mm_per_tooth * number_of_teeth / pi / 2; // radius of pitch circle + let c = p + mm_per_tooth / pi - clearance; // radius of outer circle + let b = p * Math.cos(pressure_angle); // radius of base circle + let r = p - (c - p) - clearance; // radius of root circle + let t = mm_per_tooth / 2 - backlash / 2; // tooth thickness at pitch circle + let k = -iang(b, p) - t / 2 / p; // angle where involute meets base circle on side of tooth + + // here is the magic - a set of [x,y] points to create a single gear tooth + let points = [polar(r, -3.142 / number_of_teeth), polar(r, r < b ? k : -pi / number_of_teeth), + q7(0 / 5, r, b, c, k, 1), q7(1 / 5, r, b, c, k, 1), q7(2 / 5, r, b, c, k, 1), q7(3 / 5, r, b, c, k, 1), q7(4 / 5, r, b, c, k, 1), q7(5 / 5, r, b, c, k, 1), + q7(5 / 5, r, b, c, k, -1), q7(4 / 5, r, b, c, k, -1), q7(3 / 5, r, b, c, k, -1), q7(2 / 5, r, b, c, k, -1), q7(1 / 5, r, b, c, k, -1), q7(0 / 5, r, b, c, k, -1), + polar(r, r < b ? -k : pi / number_of_teeth), polar(r, 3.142 / number_of_teeth)]; + + let answer = []; + + // create every gear tooth by rotating the first tooth + for (var i = 0; i < number_of_teeth; i++) { + answer = answer.concat(rotate(points, -i * 2 * pi / number_of_teeth)); + } + + return answer; // returns an array of [x,y] points + } + + // gear parameter setup + // number_of_teeth = numTeeth; // number of teeth (typically the only parameter to change) + // note: rest of parameters must be unchanged if you want gears to fit. + let mm_per_tooth = 9 * module * pi; // pixel size of one gear tooth (even though it says millimeters, it's pixels) must be same for two gears to fit each other + // let pressure_angle = pressureAngle; // in degrees, determines gear shape, range is 10 to 40 degrees, most common is 20 degrees + let clearance = 4; // freedom between two gear centers + let backlash = 4; // freedom between two gear contact points + let axle_radius = 20; // center hole radius in pixels + let pressure_angle = degrees_to_radians(pressureAngle); // convet degrees to radians + + return build_gear(numTeeth); + } + }; }); diff --git a/src/mesh/work.js b/src/mesh/work.js index 313cdeb6..20eec945 100644 --- a/src/mesh/work.js +++ b/src/mesh/work.js @@ -21,9 +21,10 @@ gapp.main("mesh.work", [], (root) => { const { Matrix4, Vector3, BufferGeometry, BufferAttribute, computeFaceNormal } = THREE; -const { mesh, moto } = root; +const { base, mesh, moto } = root; const { client, worker } = moto; const { util } = mesh; +const { newPolygon } = base; const cache = {}; // add scoped access to cache @@ -397,6 +398,14 @@ let model = { log(`${id} | rebuild complete`); send.done({ lines: layers }); });; + }, + + gen_gear(data, send) { + const { teeth, module, angle, z } = data; + let points = new mesh.tool().generateGear(teeth, module, angle); + let verts = points.map(v => [...v, 0]).flat(); + let poly = newPolygon().addVerts(verts).extrude(z || 10); + send.done(poly); } }; diff --git a/web/mesh/index.css b/web/mesh/index.css index 00c0cfab..bf3defb0 100644 --- a/web/mesh/index.css +++ b/web/mesh/index.css @@ -225,10 +225,20 @@ button:hover { gap: 4px; } -.addact input { +.addact input, .addgear input { text-align: center; } +.addgear { + gap: 5px; + display: grid; + grid-template-columns: 1fr 50px; +} + +.addgear button { + column-span: all; +} + .image-import { flex-direction: column; gap: 3px; From 2ad15baa3937718252e548a1f39869c9ed51d87b Mon Sep 17 00:00:00 2001 From: "Christian S." Date: Thu, 18 Jul 2024 07:59:32 +0200 Subject: [PATCH 2/6] Update de-de.js minor spelling mistakes --- web/kiri/lang/de-de.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/kiri/lang/de-de.js b/web/kiri/lang/de-de.js index ae5e3bd4..ce527cf9 100644 --- a/web/kiri/lang/de-de.js +++ b/web/kiri/lang/de-de.js @@ -486,12 +486,12 @@ kiri.lang['de-de'] = { ou_nozl_l: "In Grad Celsius", ou_bedd_s: "Betttemperatur", ou_bedd_l: "In Grad Celsius", - ou_feed_s: "Druckgewschwindigkeit", + ou_feed_s: "Druckgeschwindigkeit", ou_feed_l: ["Maximale Druckgeschwindigkeit","mm / s"], ou_fini_s: "Außengeschwindigkeit", ou_fini_l: ["Geschwindigkeit für Außenwände","mm / s"], - ou_move_s: "Bewegungsgeschwnidgkeit", - ou_move_l: ["Geschwndigkeit, wenn nicht gedruckt wird ","mm / s","0 = aktiviere G0 Befehle"], + ou_move_s: "Bewegungsgeschwindigkeit", + ou_move_l: ["Geschwindigkeit, wenn nicht gedruckt wird ","mm / s","0 = aktiviere G0 Befehle"], ou_shml_s: "Wand-Faktor", ou_flml_s: "Voll-Füll-Faktor", ou_spml_s: "Füll-Material-Faktor", From 156fe593acf65f025e3e1f42186ccf802f729fda Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Jul 2024 20:13:50 -0600 Subject: [PATCH 3/6] checkpoint gear generation work --- src/geo/base.js | 22 +++++++++++++++++++++ src/geo/point.js | 7 +++++++ src/geo/polygon.js | 2 ++ src/mesh/api.js | 12 ++++++++++-- src/mesh/tool.js | 48 ++++++++++++++++++++++++++++------------------ src/mesh/work.js | 33 ++++++++++++++++++++++++++----- 6 files changed, 98 insertions(+), 26 deletions(-) diff --git a/src/geo/base.js b/src/geo/base.js index e84b0f49..415d7c94 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -109,6 +109,25 @@ function sqr(v) { return v * v } +// radians rotatition around origin +function rotate(x,y,radians) { + return [ + x * Math.cos(radians) - y * Math.sin(radians), + y * Math.cos(radians) + x * Math.sin(radians) + ]; +} + +const deg2rad = (Math.PI / 180); +const rad2deg = (180 / Math.PI); + +function toRadians(degrees) { + return degrees * deg2rad; +} + +function toDegrees(radians) { + return radians * rad2deg; +} + /** * return distance between two points */ @@ -576,6 +595,7 @@ base.util = { pwait, ptimer, flatten, + rotate, dist2D, distSq, distSqv2, @@ -587,6 +607,8 @@ base.util = { offsetPrecision, circleCenter, numOrDefault, + toRadians, + toDegrees, thetaDiff, intersect, inRange, diff --git a/src/geo/point.js b/src/geo/point.js index 1bf6133b..0c857a89 100644 --- a/src/geo/point.js +++ b/src/geo/point.js @@ -551,6 +551,13 @@ class Point { this.z += delta.z; return this; } + + // radians rotatition in XY around origin + rotate(angle) { + const { x, y } = this; + this.x = x * Math.cos(angle) - y * Math.sin(angle); + this.y = y * Math.cos(angle) + x * Math.sin(angle); + } } function dot(u, v) { diff --git a/src/geo/polygon.js b/src/geo/polygon.js index 205cd65a..c251f66e 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -1094,6 +1094,7 @@ class Polygon { } else if (this.isClockwise() !== poly.isClockwise()) { this.reverse(); } + return this; } /** @@ -1105,6 +1106,7 @@ class Polygon { } else if (this.isClockwise() === poly.isClockwise()) { this.reverse(); } + return this; } /** diff --git a/src/mesh/api.js b/src/mesh/api.js index 649d623f..33c93f16 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -321,12 +321,14 @@ let add = { }, gear(opt = {}) { - function gengear(teeth, module, angle) { + function gengear(teeth, module, angle, twist, shaft) { api.modal.hide(); worker.model_gen_gear({ teeth: parseInt(teeth), module: parseFloat(module), - angle: parseFloat(angle) + angle: parseFloat(angle), + twist: parseFloat(twist), + shaft: parseFloat(shaft), }).then(gear => { const nmdl = new mesh.model({ file: "gear", mesh: gear.toFloat32() }); const ngrp = group.new([ nmdl ]); @@ -342,11 +344,17 @@ let add = { h.input({ value: opt.module || 3, size: 5, id: "gmodule" }), h.label('pressure angle'), h.input({ value: opt.angle || 20, size: 5, id: "gangle" }), + h.label('twist angle'), + h.input({ value: opt.twist || 0, size: 5, id: "gtwist" }), + h.label('shaft diameter'), + h.input({ value: opt.shaft || 10, size: 5, id: "gshaft" }), h.button({ _: "create", onclick() { gengear( api.modal.bound.gteeth.value, api.modal.bound.gmodule.value, api.modal.bound.gangle.value, + api.modal.bound.gtwist.value, + api.modal.bound.gshaft.value, ) } }) ]) ] diff --git a/src/mesh/tool.js b/src/mesh/tool.js index 556a9b9c..d2cf88c2 100644 --- a/src/mesh/tool.js +++ b/src/mesh/tool.js @@ -738,6 +738,8 @@ mesh.tool = class MeshTool { return out; } + // returns points array for a polygon + // extrusion and twist is handled in work.js generateGear(numTeeth, module, pressureAngle) { // Adapted from: Public Domain Parametric Involute Spur Gear by Leemon Baird, 2011, Leemon@Leemon.com http://www.thingiverse.com/thing:5505 // see also http://grabcad.com/questions/tutorial-how-to-model-involute-gears-in-solidworks-and-show-design-intent @@ -759,6 +761,15 @@ mesh.tool = class MeshTool { // radius a fraction f up the curved side of the tooth function q7(f, r, b, r2, t, s) { return q6(b, s, t, (1 - f) * Math.max(b, r) + f * r2); } + function qf(steps, r, b, r2, t, s) { + let res = []; + let step = 1/steps; + for (let f=0; f <= 1; f += step) { + res.push(q7(f, r, b, r2, t, s)); + } + return res; + } + // rotate an array of 2d points function rotate(points_array, angle) { let answer = []; @@ -780,32 +791,31 @@ mesh.tool = class MeshTool { let r = p - (c - p) - clearance; // radius of root circle let t = mm_per_tooth / 2 - backlash / 2; // tooth thickness at pitch circle let k = -iang(b, p) - t / 2 / p; // angle where involute meets base circle on side of tooth + let points = [ // [x,y] points for a single gear tooth + polar(r, -pi / number_of_teeth), + polar(r, r < b ? k : -pi / number_of_teeth), + ...qf(10, r, b, c, k, 1), + ...qf(10, r, b, c, k, -1).reverse(), + polar(r, r < b ? -k : pi / number_of_teeth), + // polar(r, 3.142 / number_of_teeth) + ]; - // here is the magic - a set of [x,y] points to create a single gear tooth - let points = [polar(r, -3.142 / number_of_teeth), polar(r, r < b ? k : -pi / number_of_teeth), - q7(0 / 5, r, b, c, k, 1), q7(1 / 5, r, b, c, k, 1), q7(2 / 5, r, b, c, k, 1), q7(3 / 5, r, b, c, k, 1), q7(4 / 5, r, b, c, k, 1), q7(5 / 5, r, b, c, k, 1), - q7(5 / 5, r, b, c, k, -1), q7(4 / 5, r, b, c, k, -1), q7(3 / 5, r, b, c, k, -1), q7(2 / 5, r, b, c, k, -1), q7(1 / 5, r, b, c, k, -1), q7(0 / 5, r, b, c, k, -1), - polar(r, r < b ? -k : pi / number_of_teeth), polar(r, 3.142 / number_of_teeth)]; - - let answer = []; - - // create every gear tooth by rotating the first tooth + let gear = []; + // create all gear teeth by rotating the first tooth for (var i = 0; i < number_of_teeth; i++) { - answer = answer.concat(rotate(points, -i * 2 * pi / number_of_teeth)); + gear.appendAll(rotate(points, -i * 2 * pi / number_of_teeth)); } - return answer; // returns an array of [x,y] points + return gear; // returns an array of [x,y] points } // gear parameter setup - // number_of_teeth = numTeeth; // number of teeth (typically the only parameter to change) - // note: rest of parameters must be unchanged if you want gears to fit. - let mm_per_tooth = 9 * module * pi; // pixel size of one gear tooth (even though it says millimeters, it's pixels) must be same for two gears to fit each other - // let pressure_angle = pressureAngle; // in degrees, determines gear shape, range is 10 to 40 degrees, most common is 20 degrees - let clearance = 4; // freedom between two gear centers - let backlash = 4; // freedom between two gear contact points - let axle_radius = 20; // center hole radius in pixels - let pressure_angle = degrees_to_radians(pressureAngle); // convet degrees to radians + let mm_per_tooth = 2 * module * pi; // mm size of one gear tooth + let clearance = 0; // freedom between two gear centers + let backlash = 0; // freedom between two gear contact points + let pressure_angle = degrees_to_radians(pressureAngle); + + console.log({ mm_per_tooth }); return build_gear(numTeeth); } diff --git a/src/mesh/work.js b/src/mesh/work.js index 20eec945..17373956 100644 --- a/src/mesh/work.js +++ b/src/mesh/work.js @@ -401,11 +401,34 @@ let model = { }, gen_gear(data, send) { - const { teeth, module, angle, z } = data; - let points = new mesh.tool().generateGear(teeth, module, angle); - let verts = points.map(v => [...v, 0]).flat(); - let poly = newPolygon().addVerts(verts).extrude(z || 10); - send.done(poly); + const { teeth, module, angle, twist, shaft, z } = data; + let points = new mesh.tool() + .generateGear(teeth, module, angle) + .map(v => [...v, 0]).flat(); + let poly = newPolygon().addVerts(points); + if (shaft) { + poly.addInner( + newPolygon().centerCircle({ + x:0, y:0, z:0 + }, shaft, Math.min(20+shaft,100)) + ); + } + let verts = poly.extrude(z || 15); + if (twist) { + let rad = base.util.toRadians(twist); + for (let i=0; i Date: Thu, 18 Jul 2024 20:32:38 -0600 Subject: [PATCH 4/6] clean up gear code --- src/mesh/tool.js | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/mesh/tool.js b/src/mesh/tool.js index d2cf88c2..b128ae1f 100644 --- a/src/mesh/tool.js +++ b/src/mesh/tool.js @@ -744,6 +744,7 @@ mesh.tool = class MeshTool { // Adapted from: Public Domain Parametric Involute Spur Gear by Leemon Baird, 2011, Leemon@Leemon.com http://www.thingiverse.com/thing:5505 // see also http://grabcad.com/questions/tutorial-how-to-model-involute-gears-in-solidworks-and-show-design-intent + // const pitch_radius = (numTeeth * module) / 2; const pi = Math.PI; // degrees to radians @@ -761,6 +762,7 @@ mesh.tool = class MeshTool { // radius a fraction f up the curved side of the tooth function q7(f, r, b, r2, t, s) { return q6(b, s, t, (1 - f) * Math.max(b, r) + f * r2); } + // lerp q7 0..1 with a given # steps function qf(steps, r, b, r2, t, s) { let res = []; let step = 1/steps; @@ -783,41 +785,37 @@ mesh.tool = class MeshTool { return answer; } + // gear parameter setup + let mm_per_tooth = module * pi; // mm size of one gear tooth + let clearance = 0.1; // freedom between two gear centers + let backlash = 0.1; // freedom between two gear contact points + let pressure_angle = degrees_to_radians(pressureAngle); + let gear = []; + // involute gear maker - function build_gear(number_of_teeth) { - let p = mm_per_tooth * number_of_teeth / pi / 2; // radius of pitch circle + { + let p = mm_per_tooth * numTeeth / pi / 2; // radius of pitch circle let c = p + mm_per_tooth / pi - clearance; // radius of outer circle let b = p * Math.cos(pressure_angle); // radius of base circle let r = p - (c - p) - clearance; // radius of root circle let t = mm_per_tooth / 2 - backlash / 2; // tooth thickness at pitch circle let k = -iang(b, p) - t / 2 / p; // angle where involute meets base circle on side of tooth let points = [ // [x,y] points for a single gear tooth - polar(r, -pi / number_of_teeth), - polar(r, r < b ? k : -pi / number_of_teeth), + polar(r, -pi / numTeeth), + polar(r, r < b ? k : -pi / numTeeth), ...qf(10, r, b, c, k, 1), ...qf(10, r, b, c, k, -1).reverse(), - polar(r, r < b ? -k : pi / number_of_teeth), - // polar(r, 3.142 / number_of_teeth) + polar(r, r < b ? -k : pi / numTeeth), + // polar(r, 3.142 / numTeeth) // omit b/c overlaps start when rotated ]; - let gear = []; // create all gear teeth by rotating the first tooth - for (var i = 0; i < number_of_teeth; i++) { - gear.appendAll(rotate(points, -i * 2 * pi / number_of_teeth)); + for (var i = 0; i < numTeeth; i++) { + gear.appendAll(rotate(points, -i * 2 * pi / numTeeth)); } - - return gear; // returns an array of [x,y] points } - // gear parameter setup - let mm_per_tooth = 2 * module * pi; // mm size of one gear tooth - let clearance = 0; // freedom between two gear centers - let backlash = 0; // freedom between two gear contact points - let pressure_angle = degrees_to_radians(pressureAngle); - - console.log({ mm_per_tooth }); - - return build_gear(numTeeth); + return gear; } }; From 9106d8ad21af2ba68e456b30c1631fefb1fd9270 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 19 Jul 2024 00:55:05 -0400 Subject: [PATCH 5/6] fix gear shaft diam, log gear pitch when created --- src/mesh/api.js | 2 +- src/mesh/build.js | 6 ++++-- src/mesh/tool.js | 2 ++ src/mesh/work.js | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/mesh/api.js b/src/mesh/api.js index 33c93f16..167ec308 100644 --- a/src/mesh/api.js +++ b/src/mesh/api.js @@ -347,7 +347,7 @@ let add = { h.label('twist angle'), h.input({ value: opt.twist || 0, size: 5, id: "gtwist" }), h.label('shaft diameter'), - h.input({ value: opt.shaft || 10, size: 5, id: "gshaft" }), + h.input({ value: opt.shaft || 5, size: 5, id: "gshaft" }), h.button({ _: "create", onclick() { gengear( api.modal.bound.gteeth.value, diff --git a/src/mesh/build.js b/src/mesh/build.js index bcd2d987..13ac1d36 100644 --- a/src/mesh/build.js +++ b/src/mesh/build.js @@ -118,7 +118,7 @@ const modal = api.modal = { let pinner; // transient logging window bottom/left const log = api.log = { - age: 10000, // age out lines more than 10 seconds old + age: 600000, // age out lines more than 10 minutes old data: [], // last n messages @@ -187,7 +187,9 @@ const log = api.log = { }; // bind endpoint for worker to log in the ui -gapp.broker.subscribe("mesh.log", log.emit); +gapp.broker.subscribe("mesh.log", msg => { + log.emit(msg); +}); // welcome dialog api.welcome = function(version = "unknown") { diff --git a/src/mesh/tool.js b/src/mesh/tool.js index b128ae1f..f75c3438 100644 --- a/src/mesh/tool.js +++ b/src/mesh/tool.js @@ -813,6 +813,8 @@ mesh.tool = class MeshTool { for (var i = 0; i < numTeeth; i++) { gear.appendAll(rotate(points, -i * 2 * pi / numTeeth)); } + + mesh.log(`gear pitch radius: ${p.round(3)}`); } return gear; diff --git a/src/mesh/work.js b/src/mesh/work.js index 17373956..75afc371 100644 --- a/src/mesh/work.js +++ b/src/mesh/work.js @@ -410,7 +410,7 @@ let model = { poly.addInner( newPolygon().centerCircle({ x:0, y:0, z:0 - }, shaft, Math.min(20+shaft,100)) + }, shaft / 2, Math.min(20 + shaft,100)) ); } let verts = poly.extrude(z || 15); From 96586c013728177ef681a3d1c2bf53976956387b Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Fri, 19 Jul 2024 00:56:01 -0400 Subject: [PATCH 6/6] bump rev 4.0.8 --- package.json | 2 +- src/main/mesh.js | 2 +- src/moto/license.js | 2 +- web/kiri/manifest.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0e8743f5..f448a148 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grid-apps", - "version": "4.0.7", + "version": "4.0.8", "description": "grid.space 3d slice & modeling tools", "author": "Stewart Allen ", "license": "MIT", diff --git a/src/main/mesh.js b/src/main/mesh.js index 2913a3e5..a52644f1 100644 --- a/src/main/mesh.js +++ b/src/main/mesh.js @@ -20,7 +20,7 @@ const { broker } = gapp; const { moto } = root; const { space } = moto; -const version = '1.3.0'; +const version = '1.4.0'; const call = broker.send; const dbindex = [ "admin", "space" ]; diff --git a/src/moto/license.js b/src/moto/license.js index da60adbc..4d5117e8 100644 --- a/src/moto/license.js +++ b/src/moto/license.js @@ -5,7 +5,7 @@ let terms = { COPYRIGHT: "Copyright (C) Stewart Allen - All Rights Reserved", LICENSE: "See the license.md file included with the source distribution", - VERSION: (is_self ? self : this).debug_version || "4.0.7" + VERSION: (is_self ? self : this).debug_version || "4.0.8" }; if (typeof(module) === 'object') { diff --git a/web/kiri/manifest.json b/web/kiri/manifest.json index a207a50a..fc0a46cb 100644 --- a/web/kiri/manifest.json +++ b/web/kiri/manifest.json @@ -1,5 +1,5 @@ { - "name": "Kiri:Moto 4.0.7", + "name": "Kiri:Moto 4.0.8", "short_name": "Kiri:Moto", "description": "Slicer for 3D printers, CNC mills, laser cutters and more", "start_url": "/kiri/",