checkpoint manual support work

This commit is contained in:
Stewart Allen 2020-11-22 17:01:36 -05:00
commit ace9858018
6 changed files with 74 additions and 18 deletions

View file

@ -663,7 +663,7 @@
d.setAttribute('class', 'col j-center');
d.onclick = function() {
API.selection.for_widgets(w => {
current.widget[w.id] = {extruder: i};
API.widgets.annotate(w.id).extruder = i;
});
API.platform.update_selected();
};
@ -1472,11 +1472,11 @@
sliceSupportOffset: UC.newInput(LANG.sp_offs_s, {title:LANG.sp_offs_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}),
sliceSupportGap: UC.newInput(LANG.sp_gaps_s, {title:LANG.sp_gaps_l, bound:UC.bound(0,5), convert:UC.toInt, modes:FDM, expert:true}),
fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}),
sliceSupportSpan: UC.newInput(LANG.sp_span_s, {title:LANG.sp_span_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceSupportEnable.checked}),
sliceSupportArea: UC.newInput(LANG.sp_area_s, {title:LANG.sp_area_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM}),
sliceSupportExtra: UC.newInput(LANG.sp_xpnd_s, {title:LANG.sp_xpnd_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, expert:true}),
fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}),
sliceSupportNozzle: UC.newSelect(LANG.sp_nozl_s, {title:LANG.sp_nozl_l, modes:FDM, expert:true}, "extruders"),
fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}),
sliceSupportSpan: UC.newInput(LANG.sp_span_s, {title:LANG.sp_span_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceSupportEnable.checked}),
sliceSupportEnable: UC.newBoolean(LANG.sp_auto_s, onBooleanClick, {title: LANG.sp_auto_l, modes:FDM, trigger:true}),
fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}),
@ -1926,7 +1926,7 @@
if (int && (event.ctrlKey || event.metaKey || API.feature.on_face_select)) {
let q = new THREE.Quaternion();
// find intersecting point, look "up" on Z and rotate to face that
q.setFromUnitVectors(int.face.normal, new THREE.Vector3(0,-1,0));
q.setFromUnitVectors(int.face.normal, new THREE.Vector3(0,0,-1));
API.selection.rotate(q);
}
if (API.view.get() !== VIEWS.ARRANGE) {

View file

@ -311,7 +311,12 @@
for: forAllWidgets,
load: Widget.loadFromCatalog,
meshes: meshArray,
opacity: setOpacity
opacity: setOpacity,
annotate: (id) => {
// add per widget annotation
// for things like extruder and supports
return settings.widget[id] = ( settings.widget[id] || {} );
}
},
work: KIRI.work
};
@ -1158,7 +1163,7 @@
}
forSelectedWidgets(w => {
w.setColor(color.selected, settings);
let ext = (settings.widget[w.id] || {}).extruder || 0;
let ext = API.widgets.annotate(w.id).extruder || 0;
let b = $(`sel-ext-${ext}`);
if (b) b.classList.add('pop-sel');
}, true);

View file

@ -111,6 +111,7 @@
if (groups.indexOf(this.group) < 0) {
groups.push(this.group);
}
// rotation stack (for undo)
this.roto = [];
this.mesh = null;
this.points = null;

View file

@ -8,16 +8,23 @@
BASE = self.base,
UTIL = BASE.util,
FDM = KIRI.driver.FDM,
SPACE,
SPACE, API,
p1, p2, iw,
alert = [],
func = {};
FDM.init = function(kiri, api) {
API = api;
SPACE = api.const.SPACE;
api.event.on("mode.set", mode => {
if (mode !== 'FDM') {
clearAllWidgetSupports();
}
});
api.event.on("settings.load", (settings) => {
if (settings.mode !== 'FDM') return;
settings.process.outputOriginCenter = (settings.device.originCenter || false);
restoreSupports(api.widgets.all());
});
api.event.on("settings.saved", (settings) => {
let proc = settings.process;
@ -48,32 +55,41 @@
});
api.event.on("fdm.supports.clear", func.sclear = () => {
func.sdone();
clearAllWidgetSupports();
API.conf.save();
});
api.event.on("key.esc", () => {
func.sdone()
});
// api.event.on("mouse.hover.down", data => {
// console.log({hover_down: data.point});
// api.event.on("selection.rotate", (x,y,z) => {
// console.log('rotate', x,y,z);
// });
api.event.on("mouse.hover.up", int => {
console.log({hover_up: int, p1, p2, iw});
delbox('supp');
if (!iw) return;
let hy = (p1.y + p2.y) / 2;
let dy = Math.abs(p1.y - p2.y);
let dh = Math.abs(p1.y - p2.y);
let dw = api.conf.get().process.sliceSupportSize / 2;
addbox({x:p1.x, z:hy, y:-p1.z}, 0x0000dd, 'supp', {
x:dw, y:dw, z:dy
}, iw.mesh);
let ip = iw.track.pos;
let wa = api.widgets.annotate(iw.id);
let ws = (wa.support = wa.support || []);
let x = p1.x - ip.x, y = -p1.z - ip.y, z = hy;
let id = Date.now();
ws.push({x, y, z, dw, dh, id});
addWidgetSupport(iw, {x, y, z, dw, dh, id});
API.conf.save();
});
api.event.on("mouse.hover", data => {
const { int, type, point } = data;
if (int) {
if (int && type === 'widget') {
iw = int.object.widget || iw;
} else {
iw = null;
}
// delbox('intZ');
// delbox('intW');
delbox('supp');
// addbox(point, 0xff0000, 'intZ');
delbox('supp');
p1 = point;
let dir = new THREE.Vector3(0,1,0)
let ray = new THREE.Raycaster(point, dir);
@ -102,6 +118,38 @@
});
}
function restoreSupports(widgets) {
widgets.forEach(widget => {
const supports = API.widgets.annotate(widget.id).support || [];
supports.forEach(pos => {
addWidgetSupport(widget, pos);
});
});
}
function addWidgetSupport(widget, pos) {
const { x, y, z, dw, dh, id } = pos;
const sups = widget.sups = (widget.sups || {});
// prevent duplicate restore from repeated settings load calls
if (!sups[id]) {
pos.box = addbox({x, y, z}, 0x0000dd, 'supp', { x:dw, y:dw, z:dh }, widget.mesh);
sups[id] = pos;
}
}
function clearAllWidgetSupports() {
API.widgets.all().forEach(widget => {
clearWidgetSupports(widget);
});
}
function clearWidgetSupports(widget) {
Object.values(widget.sups || {}).forEach(support => {
widget.mesh.remove(support.box);
});
delete API.widgets.annotate(widget.id).support;
}
function delbox(name, group) {
const old = SPACE[`__${name}`];
if (old) {
@ -124,6 +172,7 @@
box.position.y = point.y;
box.position.z = point.z;
(group || SPACE.scene).add(box);
return box;
}
})();

View file

@ -407,6 +407,7 @@
};
FDM.prepareRender = function(levels, update, options) {
levels = levels.filter(level => level.length);
if (levels.length === 0) {
self.worker.print.maxSpeed = 0;
return [];

View file

@ -245,8 +245,8 @@ kiri.lang['en-us'] = {
sp_offs_l: "offset from part\nin millimeters",
sp_gaps_s: "gap layers",
sp_gaps_l: "number of layers\noffset from part",
sp_span_s: "max bridge",
sp_span_l: "span length that\ntriggers support\nin millimeters",
sp_span_s: "max span",
sp_span_l: "unsupported span that causes\na new support to be generated\nin millimeters",
sp_area_s: "min area",
sp_area_l: "minimum area for\na support column\nin millimeters",
sp_xpnd_s: "expand",