From 0d366f19bb21af8f001d11a348b9d98a4e02923f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1n=20D=C3=A9nes?= Date: Tue, 11 Aug 2020 20:00:35 +0200 Subject: [PATCH] Basic case support --- src/cases.js | 80 ++++++++++++++++++++++++++-------------------------- src/cli.js | 15 ++++++++-- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/src/cases.js b/src/cases.js index db6caa2..688fd3a 100644 --- a/src/cases.js +++ b/src/cases.js @@ -2,46 +2,7 @@ const m = require('makerjs') const u = require('./utils') const a = require('./assert') -const Point = require('./point') - -const makerjs2jscad = exports._makerjs2jscad = (model, resolution = 32) => { - const commands = [] - m.model.walk(model, { - onPath: wp => { - const p = wp.pathContext - switch (p.type) { - case 'line': - commands.push(`new CSG.Path2D([ ${p.origin}, ${p.end} ]);`) - break - case 'arc': - const angle_start = p.startAngle > p.endAngle ? p.startAngle - 360 : p.startAngle - commands.push(`CSG.Path2D.arc({ - center: ${p.origin}, - radius: ${p.radius}, - startangle: ${angle_start}, - endangle: ${p.endAngle}, - resolution: ${resolution} - });`) - break - case 'circle': - commands.push(`CSG.Path2D.arc({ - center: ${p.origin}, - radius: ${p.radius}, - startangle: 0, - endangle: 360, - resolution: ${resolution} - });`) - break - default: - throw new Error(`Can't convert path type "${p.type}" to jscad!`) - } - } - }) - return commands -} - - -exports.parse = (config, points, outlines) => { +exports.parse = (config, outlines) => { const cases = a.sane(config, 'cases', 'object') const results = {} @@ -51,6 +12,9 @@ exports.parse = (config, points, outlines) => { // config sanitization parts = a.sane(case_config, `cases.${case_name}`, 'array') + const scripts = [] + const main = [] + let part_index = 0 for (const part of parts) { const part_name = `cases.${case_name}[${++part_index}]` @@ -67,8 +31,44 @@ exports.parse = (config, points, outlines) => { else if (operation == 'intersect') op = u.intersect else if (operation == 'stack') op = u.stack + const part_fn = `${part.outline}_fn` + const part_var = `${part.outline}_var` + scripts.push(m.exporter.toJscadScript(outline, { + functionName: part_fn, + extrude: extrude + })) + + let op_statement = `let ${case_name} = ${part_var};` + if (part_index > 1) { + op_statement = `${case_name} = ${case_name}.${operation}(${part_var});` + } + + main.push(` + + // creating part ${part_index} of case ${case_name} + let ${part_var} = ${part_fn}(); + ${part_var} = ${part_var}.rotateX(${rotate[0]}); + ${part_var} = ${part_var}.rotateY(${rotate[1]}); + ${part_var} = ${part_var}.rotateZ(${rotate[2]}); + ${part_var} = ${part_var}.translate(${shift}); + ${op_statement} + + `) } + + results[case_name] = ` + + // individual makerjs exports + ${scripts.join('\n\n')} + + // combination of parts + function main() { + ${main.join('')} + return ${case_name}; + } + + ` } return results diff --git a/src/cli.js b/src/cli.js index 61c7f07..8a168c5 100644 --- a/src/cli.js +++ b/src/cli.js @@ -14,6 +14,7 @@ const io = require('./io') const points_lib = require('./points') const outlines_lib = require('./outlines') const pcbs_lib = require('./pcbs') +const cases_lib = require('./cases') // command line args @@ -68,7 +69,7 @@ if (args.debug) { // outlines console.log('Generating outlines...') -const outlines = outlines_lib.parse(config.outlines, points) +const outlines = outlines_lib.parse(config.outlines || {}, points) for (const [name, outline] of Object.entries(outlines)) { if (!args.debug && name.startsWith('_')) continue io.dump_model(outline, path.join(args.o, `outlines/${name}`), args.debug) @@ -77,13 +78,23 @@ for (const [name, outline] of Object.entries(outlines)) { // pcbs console.log('Scaffolding PCBs...') -const pcbs = pcbs_lib.parse(config.pcbs, points, outlines) +const pcbs = pcbs_lib.parse(config.pcbs || {}, points, outlines) for (const [pcb_name, pcb_text] of Object.entries(pcbs)) { const pcb_file = path.join(args.o, `pcbs/${pcb_name}.kicad_pcb`) fs.mkdirpSync(path.dirname(pcb_file)) fs.writeFileSync(pcb_file, pcb_text) } +// cases + +console.log('Extruding cases...') +const cases = cases_lib.parse(config.cases || {}, outlines) +for (const [case_name, case_text] of Object.entries(cases)) { + const case_file = path.join(args.o, `cases/${case_name}.jscad`) + fs.mkdirpSync(path.dirname(case_file)) + fs.writeFileSync(case_file, case_text) +} + // goodbye console.log('Done.')