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
* update CLI to work in CAM mode and add working samples
* improved FDM preview rendering speed and reduced memory usage
* threaded task and message passing performance improvements
* 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,
"mode":"FDM",
"internal":0,
"imageURL":"",
"imageScale":0.75,
"imageAnchor":0,
"bedHeight":2.5,
"bedWidth":220,
"bedDepth":220,
"bedRound":false,
"bedBelt":false,
"maxHeight":300,
"originCenter":false,
"extrudeAbs":true,
"spindleMax":0,
"gcodeFan":[ "M106 S{fan_speed}" ],
"gcodeTrack":[],
"gcodeLayer":[],
"new": false,
"mode": "FDM",
"deviceName":"Creality.Ender.3",
"noclone": false,
"internal": 0,
"imageURL": "",
"imageScale": 0.75,
"imageAnchor": 0,
"bedHeight": 2.5,
"bedWidth": 220,
"bedDepth": 220,
"bedRound": false,
"bedBelt": false,
"maxHeight": 300,
"originCenter": false,
"extrudeAbs": true,
"spindleMax": 0,
"gcodeFan": ["M106 S{fan_speed}"],
"gcodeTrack": [],
"gcodeLayer": [],
"gcodePre":[
"M107 ; turn off filament cooling fan",
"G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes",
"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",
"G92 E0 ; zero the extruded",
"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",
"G92 E0 ; zero the extruded",
"G1 F225 ; set feed speed"
"M107 ; turn off filament cooling fan",
"G90 ; set absolute positioning mode",
"M82 ; set absolute positioning for extruder",
"M104 S{temp} T{tool} ; set extruder temperature",
"M140 S{bed_temp} T{tool} ; set bed temperature",
"G28 ; home axes",
"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",
"G92 E0 ; zero the extruded",
"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",
"G92 E0 ; zero the extruded",
"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":[
"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"
],
"gcodeProc":"",
"gcodePause":[],
"gcodeDwell":[],
"gcodeSpindle":[],
"gcodeChange":[],
"gcodeFExt":"gcode",
"gcodeSpace":true,
"gcodeStrip":false,
"gcodeLaserOn":[],
"gcodeProc": "",
"gcodePause": [],
"gcodeDwell": [],
"gcodeSpindle": [],
"gcodeChange": [],
"gcodeFExt": "gcode",
"gcodeSpace": true,
"gcodeStrip": false,
"gcodeLaserOn": [],
"gcodeLaserOff":[],
"extruders":[
{
"extruders":[ {
"extFilament":1.75,
"extNozzle":0.4,
"extSelect":[ "T0" ],
"extDeselect":[],
"extOffsetX":0,
"extOffsetY":0
}
],
"new":false,
"deviceName":"Creality.Ender.3"
} ],
}

View file

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

View file

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

View file

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

View file

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