add extruder selector

This commit is contained in:
Stewart Allen 2020-04-10 11:53:07 -04:00
commit e706bb3699
6 changed files with 114 additions and 29 deletions

View file

@ -386,6 +386,7 @@ var gs_kiri_fdm = exports;
zoff = 0, zoff = 0,
meshIndex, meshIndex,
lastIndex, lastIndex,
lastOut,
closest, closest,
mindist, mindist,
minidx, minidx,
@ -553,6 +554,10 @@ var gs_kiri_fdm = exports;
layerout.height = layerout.height || closest.slice.height; layerout.height = layerout.height || closest.slice.height;
slices[minidx] = null; slices[minidx] = null;
closest.offset.z = zoff; closest.offset.z = zoff;
// detect extruder change and print purge block
if (lastOut && lastOut.extruder !== closest.slice.extruder) {
console.log({extruder_swap: closest.slice.extruder, from: lastOut.extruder});
}
// output seek to start point between mesh slices if previous data // output seek to start point between mesh slices if previous data
printPoint = print.slicePrintPath( printPoint = print.slicePrintPath(
closest.slice, closest.slice,
@ -561,6 +566,7 @@ var gs_kiri_fdm = exports;
layerout, layerout,
{ first: closest.slice.index === 0 } { first: closest.slice.index === 0 }
); );
lastOut = closest.slice,
lastIndex = minidx; lastIndex = minidx;
} }
@ -595,9 +601,10 @@ var gs_kiri_fdm = exports;
fan_power = device.gcodeFan, fan_power = device.gcodeFan,
trackLayers = device.gcodeLayer, trackLayers = device.gcodeLayer,
trackProgress = device.gcodeTrack, trackProgress = device.gcodeTrack,
extruder = 0, tool = 0,
nozzleSize = extruders[extruder].extNozzle, extruder = extruders[tool],
filamentSize = extruders[extruder].extFilament, offset_x = extruder.extOffsetX,
offset_y = extruder.extOffsetY,
time = 0, time = 0,
layer = 0, layer = 0,
pause = [], pause = [],
@ -766,8 +773,8 @@ var gs_kiri_fdm = exports;
while (layer < layers.length) { while (layer < layers.length) {
path = layers[layer]; path = layers[layer];
emitPerMM = print.extrudePerMM( emitPerMM = print.extrudePerMM(
nozzleSize, extruder.extNozzle,
filamentSize, extruder.extFilament,
path.layer === 0 ? path.layer === 0 ?
(process.firstSliceHeight || process.sliceHeight) : path.height); (process.firstSliceHeight || process.sliceHeight) : path.height);
@ -828,13 +835,14 @@ var gs_kiri_fdm = exports;
speedMMM = (out.speed || process.outputFeedrate) * 60; speedMMM = (out.speed || process.outputFeedrate) * 60;
// look for extruder change and recalc emit factor // look for extruder change and recalc emit factor
if (out.tool !== undefined && out.tool !== extruder) { if (out.tool !== undefined && out.tool !== tool) {
extruder = out.tool; tool = out.tool;
nozzleSize = extruders[extruder].extNozzle; extruder = extruders[tool];
filamentSize = extruders[extruder].extFilament; offset_x = extruder.extOffsetX;
offset_y = extruder.extOffsetY;
emitPerMM = print.extrudePerMM( emitPerMM = print.extrudePerMM(
nozzleSize, extruder.extNozzle,
filamentSize, extruder.extFilament,
path.layer === 0 ? path.layer === 0 ?
(process.firstSliceHeight || process.sliceHeight) : path.height); (process.firstSliceHeight || process.sliceHeight) : path.height);
} }
@ -844,8 +852,8 @@ var gs_kiri_fdm = exports;
dwell(out.speed); dwell(out.speed);
continue; continue;
} }
var x = out.point.x, var x = out.point.x + offset_x,
y = out.point.y, y = out.point.y + offset_y,
z = out.point.z; z = out.point.z;
// adjust for inversions and offsets // adjust for inversions and offsets

View file

@ -540,6 +540,23 @@ var gs_kiri_init = exports;
UI.deviceName.value = devicename; UI.deviceName.value = devicename;
UI.deviceOrigin.checked = proc.outputOriginCenter; UI.deviceOrigin.checked = proc.outputOriginCenter;
// add extruder selection buttons
if (dev.extruders) {
let selext = $('sel-ext');
selext.innerHTML = '';
let arr = [];
for (let i=dev.extruders.length-1; i>=0; i--) {
let b = DOC.createElement('button');
b.appendChild(DOC.createTextNode(i));
b.onclick = function() {
API.selection.for_widgets(w => {
current.widget[w.id] = {extruder: i};
});
};
selext.appendChild(b);
}
}
if (mode === 'CAM') { if (mode === 'CAM') {
proc.camOriginTop = dev.outputOriginTop; proc.camOriginTop = dev.outputOriginTop;
} }

View file

@ -51,6 +51,16 @@ let gs_kiri_widget = exports;
let Group = Widget.Groups = { let Group = Widget.Groups = {
forid: function(id) {
for (let i=0; i<groups.length; i++) {
if (groups[i].id === id) return groups[i];
}
let group = [];
group.id = id;
groups.push(group);
return group;
},
remove: function(widget) { remove: function(widget) {
groups.slice().forEach(group => { groups.slice().forEach(group => {
let pos = group.indexOf(widget); let pos = group.indexOf(widget);
@ -114,6 +124,9 @@ let gs_kiri_widget = exports;
this.id = id || new Date().getTime().toString(36)+(nextId++); this.id = id || new Date().getTime().toString(36)+(nextId++);
this.group = group || []; this.group = group || [];
this.group.push(this); this.group.push(this);
if (!this.group.id) {
this.group.id = this.id;
}
if (groups.indexOf(this.group) < 0) { if (groups.indexOf(this.group) < 0) {
groups.push(this.group); groups.push(this.group);
} }
@ -169,13 +182,13 @@ let gs_kiri_widget = exports;
}; };
Widget.loadFromState = function(id, ondone, move) { Widget.loadFromState = function(id, ondone, move) {
let widget = newWidget();
widget.id = id;
widget.saved = time();
KIRI.odb.get('ws-save-'+id, function(data) { KIRI.odb.get('ws-save-'+id, function(data) {
if (data) { if (data) {
let vertices = data.geo || data, let vertices = data.geo || data,
track = data.track || null; track = data.track || undefined,
group = data.group || id,
widget = newWidget(id, Group.forid(group));
widget.saved = time();
ondone(widget.loadVertices(vertices)); ondone(widget.loadVertices(vertices));
// restore widget position if specified // restore widget position if specified
if (move && track && track.pos) { if (move && track && track.pos) {
@ -308,7 +321,11 @@ let gs_kiri_widget = exports;
PRO.saveState = function(ondone) { PRO.saveState = function(ondone) {
let widget = this; let widget = this;
KIRI.odb.put('ws-save-'+this.id, {geo:widget.getGeoVertices(), track:widget.track}, function(result) { KIRI.odb.put('ws-save-'+this.id, {
geo:widget.getGeoVertices(),
track:widget.track,
group:this.group.id
}, function(result) {
widget.saved = time(); widget.saved = time();
if (ondone) ondone(); if (ondone) ondone();
}); });

View file

@ -1062,16 +1062,19 @@ self.kiri.copyright = exports.COPYRIGHT;
} }
function platformAdd(widget, shift, nolayout) { function platformAdd(widget, shift, nolayout) {
if (!settings.widget[widget.id]) {
settings.widget[widget.id] = {extruder: 0}; settings.widget[widget.id] = {extruder: 0};
}
WIDGETS.push(widget); WIDGETS.push(widget);
SPACE.platform.add(widget.mesh); SPACE.platform.add(widget.mesh);
platform.select(widget, shift); platform.select(widget, shift);
platform.compute_max_z(); platform.compute_max_z();
API.event.emit('widget.add', widget); API.event.emit('widget.add', widget);
if (nolayout) return; if (nolayout) return;
if (layoutOnAdd) platform.layout();
if (!grouping) { if (!grouping) {
platformGroupDone(); platformGroupDone();
} else if (layoutOnAdd) {
platform.layout();
} }
} }
@ -1097,6 +1100,7 @@ self.kiri.copyright = exports.COPYRIGHT;
if (MODE !== MODES.FDM) platform.layout(); if (MODE !== MODES.FDM) platform.layout();
SPACE.update(); SPACE.update();
platformUpdateSelected(); platformUpdateSelected();
if (layoutOnAdd) platform.layout();
API.event.emit('widget.delete', widget); API.event.emit('widget.delete', widget);
} }

View file

@ -157,16 +157,33 @@
<label class="label">depth:</label><label id="sel_depth" class="value">mm</label> <label class="label">depth:</label><label id="sel_depth" class="value">mm</label>
<label class="label">height:</label><label id="sel_height" class="value">mm</label> <label class="label">height:</label><label id="sel_height" class="value">mm</label>
&nbsp;&nbsp; &nbsp;&nbsp;
<div class="sel-span">
<label class="label">scale</label> <label class="label">scale</label>
<div id="sel-scale" class="sel-pop">
<div>
<label class="label">x</label><input id="scale_x" size="3" value="1"/> <label class="label">x</label><input id="scale_x" size="3" value="1"/>
<label class="label">y</label><input id="scale_y" size="3" value="1"/> <label class="label">y</label><input id="scale_y" size="3" value="1"/>
<label class="label">z</label><input id="scale_z" size="3" value="1"/> <label class="label">z</label><input id="scale_z" size="3" value="1"/>
<label class="label">uniform</label><input type="checkbox" id="scale_uni" checked> <label class="label">uniform</label><input type="checkbox" id="scale_uni" checked>
</div>
</div>
</div>
&nbsp;&nbsp; &nbsp;&nbsp;
<div class="sel-span">
<label class="label">rotate</label> <label class="label">rotate</label>
<div id="sel-rotate" class="sel-pop">
<div>
<button id="x+" title="hold SHIFT to rotate 5 degrees">x+</button><button id="x-" title="hold SHIFT to rotate 5 degrees">x-</button> <button id="x+" title="hold SHIFT to rotate 5 degrees">x+</button><button id="x-" title="hold SHIFT to rotate 5 degrees">x-</button>
<button id="y+" title="hold SHIFT to rotate 5 degrees">y+</button><button id="y-" title="hold SHIFT to rotate 5 degrees">y-</button> <button id="y+" title="hold SHIFT to rotate 5 degrees">y+</button><button id="y-" title="hold SHIFT to rotate 5 degrees">y-</button>
<button id="z+" title="hold SHIFT to rotate 5 degrees">z+</button><button id="z-" title="hold SHIFT to rotate 5 degrees">z-</button> <button id="z+" title="hold SHIFT to rotate 5 degrees">z+</button><button id="z-" title="hold SHIFT to rotate 5 degrees">z-</button>
</div>
</div>
</div>
&nbsp;&nbsp;
<div class="sel-span">
<label class="label">extruder</label>
<div class="sel-pop"><div id="sel-ext"><div></div>
</div>
</span> </span>
<span id="stock"> <span id="stock">
<label class="label">stock</label> <label class="label">stock</label>

View file

@ -52,6 +52,26 @@ input[type=range]::-moz-focus-outer {
font-family: monospace; font-family: monospace;
white-space: pre; white-space: pre;
} }
.sel-span {
position: relative;
display: inline-block;
}
.sel-pop {
display: none;
position: absolute;
bottom: 100%;
left: 0;
padding-bottom: 5px;
}
.sel-pop div {
background-color: white;
border: 1px solid #aaa;
border-radius: 5px;
padding: 5px;
}
.sel-span:hover .sel-pop {
display: block;
}
#widget-info { #widget-info {
text-align: center; text-align: center;
position: fixed; position: fixed;
@ -64,9 +84,11 @@ input[type=range]::-moz-focus-outer {
padding: 3px 8px 8px 8px; padding: 3px 8px 8px 8px;
background-color: rgba(170,221,255,0.75); background-color: rgba(170,221,255,0.75);
color: rgba(0,0,0,0.5); color: rgba(0,0,0,0.5);
z-index: 10;
} }
#widget-info label { #widget-info label {
border: 0; border: 0;
white-space: nowrap;
} }
#widget-info .value { #widget-info .value {
font-weight: bold; font-weight: bold;