update CLI to work in CAM mode and add working samples

This commit is contained in:
Stewart Allen 2022-10-16 12:17:35 -04:00
commit d6757d1758
9 changed files with 346 additions and 124 deletions

View file

@ -5,6 +5,7 @@ Full docs @ https://docs.grid.space/projects/kiri-moto
# Release 3.6 # Release 3.6
* update CLI to work in CAM mode and add working samples
* improved FDM preview rendering speed and reduced memory usage * improved FDM preview rendering speed and reduced memory usage
* threaded task and message passing performance improvements * threaded task and message passing performance improvements
* refactor FDM supports and synthetic widgets to use more common code * refactor FDM supports and synthetic widgets to use more common code

View file

@ -0,0 +1,26 @@
{
"new": false,
"mode": "CAM",
"deviceName": "My Sienci LongMill",
"noclone":false,
"internal": 0,
"bedHeight": 2.5,
"bedWidth": 760,
"bedDepth": 760,
"maxHeight": 300,
"originCenter": false,
"spindleMax": 0,
"gcodeSpace": true,
"gcodeStrip": false,
"gcodePre": [
"G21 ; set units to MM (required)",
"G90 ; absolute position mode (required)",
"G0 F6000 ; default rapid move speed",
"G1 F1500 ; default cutting speed"
],
"gcodePost": ["M30 ; program end"],
"gcodeDwell": ["G4 P{time} ; dwell for {time}ms"],
"gcodeSpindle": [],
"gcodeChange": ["M6 T{tool} ; change tool to '{tool_name}'"],
"gcodeFExt": "nc"
}

View file

@ -0,0 +1,119 @@
{
"processName": "default",
"camLevelTool": 1000,
"camLevelSpindle": 1000,
"camLevelOver": 0,
"camLevelSpeed": 1000,
"camLevelDown": 1,
"camRoughTool": 1001,
"camRoughSpindle": 1000,
"camRoughDown": 3,
"camRoughOver": 0.5,
"camRoughSpeed": 1000,
"camRoughPlunge": 250,
"camRoughStock": 0,
"camRoughVoid": false,
"camRoughFlat": false,
"camRoughTop": false,
"camRoughIn": true,
"camRoughOn": true,
"camOutlineTool": 1000,
"camOutlineSpindle": 1000,
"camOutlineDown": 1,
"camOutlineOver": 0.4,
"camOutlineSpeed": 800,
"camOutlinePlunge": 250,
"camOutlineWide": false,
"camOutlineDogbone": false,
"camOutlineOmitThru": false,
"camOutlineOut": true,
"camOutlineIn": false,
"camOutlineOn": true,
"camContourTool": 1001,
"camContourSpindle": 1000,
"camContourOver": 0.25,
"camContourSpeed": 1000,
"camContourAngle": 85,
"camContourCurves": true,
"camContourIn": true,
"camContourXOn": true,
"camContourYOn": true,
"camTraceTool": 1000,
"camTraceSpindle": 1000,
"camTraceType": "clear",
"camTraceOver": 0.5,
"camTraceDown": 50,
"camTraceSpeed": 750,
"camTracePlunge": 200,
"camTraceLines": false,
"camDrillTool": 1000,
"camDrillSpindle": 1000,
"camDrillDownSpeed": 250,
"camDrillDown": 2,
"camDrillDwell": 250,
"camDrillLift": 2,
"camDrillingOn": false,
"camRegisterSpeed": 1000,
"camFlipAxis": "X",
"camFlipOther": "",
"camTabsWidth": 20,
"camTabsHeight": 5,
"camTabsDepth": 10,
"camTabsMidline": false,
"camDepthFirst": true,
"camEaseDown": false,
"camOriginTop": true,
"camZAnchor": "middle",
"camZOffset": 0,
"camZBottom": 0,
"camZClearance": 1,
"camZThru": 0,
"camFastFeed": 4000,
"camFastFeedZ": 250,
"camTolerance": 0.03,
"camStockX": 30,
"camStockY": 30,
"camStockZ": 1,
"camStockOffset": true,
"camStockClipTo": false,
"camStockOn": true,
"camConventional": false,
"outputOriginCenter": false,
"outputInvertX": false,
"outputInvertY": false,
"camExpertFast": false,
"ops": [{
"type": "rough",
"tool": 1001,
"spindle": 1000,
"down": 3,
"step": 0.5,
"rate": 1000,
"plunge": 250,
"leave": 0,
"voids": false,
"flats": false,
"inside": true,
"top": false
}],
"camTrueShadow": false,
"camDrillMark": true,
"camPocketSpindle": 1000,
"camPocketTool": 1665454124874,
"camPocketOver": 0.15,
"camPocketDown": 1,
"camPocketSpeed": 250,
"camPocketPlunge": 200,
"camPocketExpand": 0,
"camContourBottom": false,
"camTraceBottom": false,
"cmaPocketOutline": false,
"camRegisterThru": 5,
"camFlatness": 0,
"camContourBridge": 10,
"camForceZMax": false,
"camPocketSmooth": 0,
"cmaPocketRefine": 20,
"camPocketContour": false,
"camPocketEngrave": false
}

View file

@ -0,0 +1,69 @@
[
{
"id": 2000,
"number": 5,
"name": "ball 1/16",
"type": "ballmill",
"shaft_diam": 0.0625,
"shaft_len": 1,
"flute_diam": 0.0625,
"flute_len": 2,
"taper_tip": 0,
"metric": false
}, {
"id": 2001,
"number": 6,
"name": "ball 1/8",
"type": "ballmill",
"shaft_diam": 0.125,
"shaft_len": 1,
"flute_diam": 0.125,
"flute_len": 2,
"taper_tip": 0,
"metric": false
}, {
"id": 2002,
"number": 4,
"name": "ball 1/4",
"type": "ballmill",
"shaft_diam": 0.25,
"shaft_len": 1,
"flute_diam": 0.25,
"flute_len": 2,
"taper_tip": 0,
"metric": false
}, {
"id": 1000,
"number": 3,
"type": "endmill",
"name": "end 1/16",
"metric": false,
"shaft_diam": 0.0625,
"shaft_len": 1,
"flute_diam": 0.0625,
"flute_len": 1.5,
"taper_tip": 0
}, {
"id": 1001,
"number": 2,
"type": "endmill",
"name": "end 1/8",
"metric": false,
"shaft_diam": 0.125,
"shaft_len": 1,
"flute_diam": 0.125,
"flute_len": 1.5,
"taper_tip": 0
}, {
"id": 1002,
"number": 1,
"type": "endmill",
"name": "end 1/4",
"metric": false,
"shaft_diam": 0.25,
"shaft_len": 1,
"flute_diam": 0.25,
"flute_len": 2,
"taper_tip": 0
}
]

View file

@ -1,64 +1,62 @@
{ {
"noclone":false, "new": false,
"mode":"FDM", "mode": "FDM",
"internal":0, "deviceName":"Creality.Ender.3",
"imageURL":"", "noclone": false,
"imageScale":0.75, "internal": 0,
"imageAnchor":0, "imageURL": "",
"bedHeight":2.5, "imageScale": 0.75,
"bedWidth":220, "imageAnchor": 0,
"bedDepth":220, "bedHeight": 2.5,
"bedRound":false, "bedWidth": 220,
"bedBelt":false, "bedDepth": 220,
"maxHeight":300, "bedRound": false,
"originCenter":false, "bedBelt": false,
"extrudeAbs":true, "maxHeight": 300,
"spindleMax":0, "originCenter": false,
"gcodeFan":[ "M106 S{fan_speed}" ], "extrudeAbs": true,
"gcodeTrack":[], "spindleMax": 0,
"gcodeLayer":[], "gcodeFan": ["M106 S{fan_speed}"],
"gcodeTrack": [],
"gcodeLayer": [],
"gcodePre":[ "gcodePre":[
"M107 ; turn off filament cooling fan", "M107 ; turn off filament cooling fan",
"G90 ; set absolute positioning mode", "G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder", "M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature", "M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature", "M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes", "G28 ; home axes",
"G92 X0 Y0 Z0 E0 ; reset all axes positions", "G92 X0 Y0 Z0 E0 ; reset all axes positions",
"G1 X0 Y0 Z0.25 F180 ; move XY to 0,0 and Z 0.25mm over bed", "G1 X0 Y0 Z0.25 F180 ; move XY to 0,0 and Z 0.25mm over bed",
"G92 E0 ; zero the extruded", "G92 E0 ; zero the extruded",
"M190 S{bed_temp} T{tool} ; wait for bed to reach target temp", "M190 S{bed_temp} T{tool} ; wait for bed to reach target temp",
"M109 S{temp} T{tool} ; wait for extruder to reach target temp", "M109 S{temp} T{tool} ; wait for extruder to reach target temp",
"G92 E0 ; zero the extruded", "G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed" "G1 F225 ; set feed speed"
],
"gcodePost":[
"M107 ; turn off filament cooling fan",
"M104 S0 T{tool} ; turn off right extruder",
"M140 S0 T{tool} ; turn off bed",
"G1 X0 Y300 F1200 ; end move",
"M84 ; disable stepper motors"
], ],
"gcodePost":[ "gcodeProc": "",
"M107 ; turn off filament cooling fan", "gcodePause": [],
"M104 S0 T{tool} ; turn off right extruder", "gcodeDwell": [],
"M140 S0 T{tool} ; turn off bed", "gcodeSpindle": [],
"G1 X0 Y300 F1200 ; end move", "gcodeChange": [],
"M84 ; disable stepper motors" "gcodeFExt": "gcode",
], "gcodeSpace": true,
"gcodeProc":"", "gcodeStrip": false,
"gcodePause":[], "gcodeLaserOn": [],
"gcodeDwell":[],
"gcodeSpindle":[],
"gcodeChange":[],
"gcodeFExt":"gcode",
"gcodeSpace":true,
"gcodeStrip":false,
"gcodeLaserOn":[],
"gcodeLaserOff":[], "gcodeLaserOff":[],
"extruders":[ "extruders":[ {
{
"extFilament":1.75, "extFilament":1.75,
"extNozzle":0.4, "extNozzle":0.4,
"extSelect":[ "T0" ], "extSelect":[ "T0" ],
"extDeselect":[], "extDeselect":[],
"extOffsetX":0, "extOffsetX":0,
"extOffsetY":0 "extOffsetY":0
} } ],
],
"new":false,
"deviceName":"Creality.Ender.3"
} }

View file

@ -1,70 +1,70 @@
{ {
"sName":"Ender3_test", "sName": "Ender3_test",
"sliceHeight":0.25, "arcTolerance": 0,
"sliceShells":3, "antiBacklash": 0,
"sliceShellOrder":"in-out", "sliceHeight": 0.25,
"sliceLayerStart":"last", "sliceShells": 3,
"sliceFillAngle":45, "sliceShellOrder": "in-out",
"sliceFillOverlap":0.3, "sliceLayerStart": "last",
"sliceFillSparse":0.2, "sliceFillAngle": 45,
"sliceFillType":"gyroid", "sliceFillOverlap": 0.3,
"sliceAdaptive":false, "sliceFillSparse": 0.2,
"sliceMinHeight":0, "sliceFillType": "gyroid",
"sliceSupportDensity":0.25, "sliceAdaptive": false,
"sliceSupportOffset":0.4, "sliceMinHeight": 0,
"sliceSupportGap":1, "sliceSupportDensity": 0.25,
"sliceSupportSize":6, "sliceSupportOffset": 0.4,
"sliceSupportArea":1, "sliceSupportGap": 1,
"sliceSupportExtra":0, "sliceSupportSize": 6,
"sliceSupportAngle":50, "sliceSupportArea": 1,
"sliceSupportNozzle":0, "sliceSupportExtra": 0,
"sliceSolidMinArea":1, "sliceSupportAngle": 50,
"sliceSolidLayers":3, "sliceSupportNozzle": 0,
"sliceBottomLayers":3, "sliceSolidMinArea": 1,
"sliceTopLayers":3, "sliceSolidLayers": 3,
"firstLayerRate":10, "sliceBottomLayers": 3,
"firstLayerPrintMult":1.15, "sliceTopLayers": 3,
"firstLayerYOffset":0, "firstLayerRate": 10,
"firstLayerBrim":0, "firstLayerFanSpeed": 0,
"firstLayerBeltLead":3, "firstLayerPrintMult": 1.15,
"outputTemp":210, "firstLayerYOffset": 0,
"outputBedTemp":60, "firstLayerBrim": 0,
"outputFeedrate":50, "firstLayerBeltLead": 3,
"outputFinishrate":50, "outputTemp": 210,
"outputSeekrate":80, "outputBedTemp": 60,
"outputShellMult":1.25, "outputFeedrate": 50,
"outputFillMult":1.25, "outputFinishrate": 50,
"outputSparseMult":1.25, "outputSeekrate": 80,
"outputRetractDist":4, "outputShellMult": 1.25,
"outputRetractSpeed":30, "outputFillMult": 1.25,
"outputRetractDwell":30, "outputSparseMult": 1.25,
"outputShortPoly":100, "outputRetractDist": 4,
"outputMinSpeed":10, "outputRetractSpeed": 30,
"outputCoastDist":0.1, "outputRetractDwell": 30,
"outputLayerRetract":true, "outputShortPoly": 100,
"detectThinWalls":true, "outputMinSpeed": 10,
"zHopDistance":0, "outputCoastDist": 0.1,
"antiBacklash":0, "outputLayerRetract": true,
"outputOriginCenter":false, "detectThinWalls": true,
"sliceFillRate":0, "outputOriginCenter": false,
"sliceSupportEnable":false, "sliceFillRate": 0,
"firstSliceHeight":0.25, "sliceSupportEnable": false,
"firstLayerFillRate":35, "firstSliceHeight": 0.25,
"firstLayerLineMult":1, "firstLayerFillRate": 35,
"firstLayerNozzleTemp":0, "firstLayerLineMult": 1,
"firstLayerBedTemp":0, "firstLayerNozzleTemp": 0,
"firstLayerBrimTrig":0, "firstLayerBedTemp": 0,
"outputRaft":false, "firstLayerBrimTrig": 0,
"outputRaftSpacing":0.2, "outputRaft": false,
"outputRetractWipe":0, "outputRaftSpacing": 0.2,
"outputBrimCount":2, "outputRetractWipe": 0,
"outputBrimOffset":2, "outputBrimCount": 2,
"outputLoopLayers":null, "outputBrimOffset": 2,
"outputInvertX":false, "outputLoopLayers": null,
"outputInvertY":false, "outputInvertX": false,
"arcTolerance":0, "outputInvertY": false,
"gcodePause":"", "outputFanSpeed": 255,
"ranges":[], "gcodePause": "",
"firstLayerFanSpeed":0, "ranges": [],
"outputFanSpeed":255 "zHopDistance": 0
} }

View file

@ -42,6 +42,8 @@ CAM.prepare = async function(widgets, settings, update) {
}); });
const output = print.output.filter(level => Array.isArray(level)); const output = print.output.filter(level => Array.isArray(level));
if (render) // allows it to run from CLI
return render.path(output, (progress, layer) => { return render.path(output, (progress, layer) => {
update(0.75 + progress * 0.25, "render", layer); update(0.75 + progress * 0.25, "render", layer);
}, { }, {

View file

@ -9,6 +9,7 @@ let opts = {
controller: "src/cli/kiri-controller.json", controller: "src/cli/kiri-controller.json",
process: "src/cli/kiri-fdm-process.json", process: "src/cli/kiri-fdm-process.json",
device: "src/cli/kiri-fdm-device.json", device: "src/cli/kiri-fdm-device.json",
tools: "src/cli/kiri-cam-tools.json"
}; };
for (let i=0; i<args.length; i++) { for (let i=0; i<args.length; i++) {
let arg = args[i].split('='); let arg = args[i].split('=');
@ -37,6 +38,7 @@ if (opts.help) {
" --verbose | enable verbose logging", " --verbose | enable verbose logging",
" --dir=[dir] | root directory for file paths (default: '.')", " --dir=[dir] | root directory for file paths (default: '.')",
" --model=[file] | model file to load (or last parameter)", " --model=[file] | model file to load (or last parameter)",
" --tools=[file] | tools array for CAM mode",
" --source=[file] | source file list (defaults to kiri engine)", " --source=[file] | source file list (defaults to kiri engine)",
" --device=[file] | device definition file (json)", " --device=[file] | device definition file (json)",
" --process=[file] | process definition file (json)", " --process=[file] | process definition file (json)",
@ -128,6 +130,7 @@ function btoa(b) {
async function run() { async function run() {
let files = await fetch(opts.source, { format: "eval" } ); let files = await fetch(opts.source, { format: "eval" } );
let tools = await fetch(opts.tools, { format: "eval" } );
let device = await fetch(opts.device, { format: "eval" } ); let device = await fetch(opts.device, { format: "eval" } );
let process = await fetch(opts.process, { format: "eval" } ); let process = await fetch(opts.process, { format: "eval" } );
@ -202,8 +205,10 @@ async function run() {
engine.rotate(x,y,z); engine.rotate(x,y,z);
} }
}) })
.then(() => engine.setProcess(process))
.then(() => engine.setDevice(device)) .then(() => engine.setDevice(device))
.then(() => engine.setProcess(process))
.then(() => { if (device.mode === 'CAM') engine.setTools(tools) })
.then(() => engine.setMode(device.mode))
.then(eng => eng.slice()) .then(eng => eng.slice())
.then(eng => eng.prepare()) .then(eng => eng.prepare())
.then(eng => engine.export()) .then(eng => engine.export())

View file

@ -162,8 +162,10 @@ class Engine {
return new Promise((accept, reject) => { return new Promise((accept, reject) => {
let output = []; let output = [];
kiri.client.export(this.settings, segment => { kiri.client.export(this.settings, segment => {
this.listener({export:{segment}}); if (typeof segment === 'string') {
output.push(segment); this.listener({export:{segment}});
output.push(segment);
}
}, done => { }, done => {
this.listener({export:{done}}); this.listener({export:{done}});
accept(output.join('\r\n')); accept(output.join('\r\n'));