Basic case support
This commit is contained in:
parent
0e4d2206a7
commit
0d366f19bb
2 changed files with 53 additions and 42 deletions
80
src/cases.js
80
src/cases.js
|
@ -2,46 +2,7 @@ const m = require('makerjs')
|
||||||
const u = require('./utils')
|
const u = require('./utils')
|
||||||
const a = require('./assert')
|
const a = require('./assert')
|
||||||
|
|
||||||
const Point = require('./point')
|
exports.parse = (config, outlines) => {
|
||||||
|
|
||||||
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) => {
|
|
||||||
|
|
||||||
const cases = a.sane(config, 'cases', 'object')
|
const cases = a.sane(config, 'cases', 'object')
|
||||||
const results = {}
|
const results = {}
|
||||||
|
@ -51,6 +12,9 @@ exports.parse = (config, points, outlines) => {
|
||||||
// config sanitization
|
// config sanitization
|
||||||
parts = a.sane(case_config, `cases.${case_name}`, 'array')
|
parts = a.sane(case_config, `cases.${case_name}`, 'array')
|
||||||
|
|
||||||
|
const scripts = []
|
||||||
|
const main = []
|
||||||
|
|
||||||
let part_index = 0
|
let part_index = 0
|
||||||
for (const part of parts) {
|
for (const part of parts) {
|
||||||
const part_name = `cases.${case_name}[${++part_index}]`
|
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 == 'intersect') op = u.intersect
|
||||||
else if (operation == 'stack') op = u.stack
|
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
|
return results
|
||||||
|
|
15
src/cli.js
15
src/cli.js
|
@ -14,6 +14,7 @@ const io = require('./io')
|
||||||
const points_lib = require('./points')
|
const points_lib = require('./points')
|
||||||
const outlines_lib = require('./outlines')
|
const outlines_lib = require('./outlines')
|
||||||
const pcbs_lib = require('./pcbs')
|
const pcbs_lib = require('./pcbs')
|
||||||
|
const cases_lib = require('./cases')
|
||||||
|
|
||||||
// command line args
|
// command line args
|
||||||
|
|
||||||
|
@ -68,7 +69,7 @@ if (args.debug) {
|
||||||
// outlines
|
// outlines
|
||||||
|
|
||||||
console.log('Generating 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)) {
|
for (const [name, outline] of Object.entries(outlines)) {
|
||||||
if (!args.debug && name.startsWith('_')) continue
|
if (!args.debug && name.startsWith('_')) continue
|
||||||
io.dump_model(outline, path.join(args.o, `outlines/${name}`), args.debug)
|
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
|
// pcbs
|
||||||
|
|
||||||
console.log('Scaffolding 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)) {
|
for (const [pcb_name, pcb_text] of Object.entries(pcbs)) {
|
||||||
const pcb_file = path.join(args.o, `pcbs/${pcb_name}.kicad_pcb`)
|
const pcb_file = path.join(args.o, `pcbs/${pcb_name}.kicad_pcb`)
|
||||||
fs.mkdirpSync(path.dirname(pcb_file))
|
fs.mkdirpSync(path.dirname(pcb_file))
|
||||||
fs.writeFileSync(pcb_file, pcb_text)
|
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
|
// goodbye
|
||||||
|
|
||||||
console.log('Done.')
|
console.log('Done.')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue