CLI and output restructure, SVG/DXF/STL integration

This commit is contained in:
Bán Dénes 2021-07-14 19:33:33 +02:00
parent c49881c2b4
commit 42a3e2de55
7 changed files with 730 additions and 154 deletions

View file

@ -1,3 +1,11 @@
const yaml = require('js-yaml')
const json5 = require('json5')
const makerjs = require('makerjs')
const jscad = require('@jscad/openjscad')
const a = require('./assert')
const u = require('./utils')
const prepare = require('./prepare')
const units_lib = require('./units')
const points_lib = require('./points')
@ -7,16 +15,79 @@ const pcbs_lib = require('./pcbs')
const noop = () => {}
const twodee = (model, debug) => {
const assembly = makerjs.model.originate({
models: {
export: u.deepcopy(model)
},
units: 'mm'
})
const result = {
dxf: makerjs.exporter.toDXF(assembly),
}
if (debug) {
result.json = assembly
result.svg = makerjs.exporter.toSVG(assembly)
}
return result
}
const threedee = async (script, debug) => {
const compiled = await new Promise((resolve, reject) => {
jscad.compile(script, {}).then(compiled => {
resolve(compiled)
})
})
const result = {
stl: jscad.generateOutput('stla', compiled).asBuffer()
}
if (debug) {
result.jscad = script
}
return result
}
module.exports = {
version: '__ergogen_version',
process: (config, debug=false, logger=noop) => {
process: async (raw, debug=false, logger=noop) => {
logger('Preparing input...')
const prefix = 'Interpreting format... '
let config = raw
if (a.type(raw)() != 'object') {
try {
config = yaml.safeLoad(raw)
logger(prefix + 'YAML detected.')
} catch (yamlex) {
try {
config = json5.parse(raw)
logger(prefix + 'JSON detected.')
} catch (jsonex) {
try {
config = new Function(raw)()
logger(prefix + 'JS code detected.')
} catch (codeex) {
logger('YAML exception:', yamlex)
logger('JSON exception:', jsonex)
logger('Code exception:', codeex)
throw new Error('Input is not valid YAML, JSON, or JS code!')
}
}
}
if (!config) {
throw new Error('Input appears to be empty!')
}
}
logger('Preprocessing input...')
config = prepare.unnest(config)
config = prepare.inherit(config)
const results = {}
if (debug) {
results.raw = raw
results.canonical = config
}
// parsing units
logger('Calculating variables...')
const units = units_lib.parse(config)
if (debug) {
@ -24,10 +95,13 @@ module.exports = {
}
logger('Parsing points...')
if (!config.points) {
throw new Error('Input does not contain any points!')
}
const points = points_lib.parse(config.points, units)
if (debug) {
results.points = points
results.demo = points_lib.visualize(points)
results.demo = twodee(points_lib.visualize(points), debug)
}
logger('Generating outlines...')
@ -35,15 +109,15 @@ module.exports = {
results.outlines = {}
for (const [name, outline] of Object.entries(outlines)) {
if (!debug && name.startsWith('_')) continue
results.outlines[name] = outline
results.outlines[name] = twodee(outline, debug)
}
logger('Extruding cases...')
const cases = cases_lib.parse(config.cases || {}, outlines, units)
results.cases = {}
for (const [case_name, case_text] of Object.entries(cases)) {
for (const [case_name, case_script] of Object.entries(cases)) {
if (!debug && case_name.startsWith('_')) continue
results.cases[case_name] = case_text
results.cases[case_name] = await threedee(case_script, debug)
}
logger('Scaffolding PCBs...')
@ -56,6 +130,5 @@ module.exports = {
return results
},
visualize: points_lib.visualize,
inject_footprint: pcbs_lib.inject_footprint
}