diff --git a/src/footprints/choc.js b/src/footprints/choc.js index b2c4fb7..e4e0040 100644 --- a/src/footprints/choc.js +++ b/src/footprints/choc.js @@ -17,8 +17,8 @@ module.exports = { (fp_line (start 7 -7) (end 7 -6) (layer F.SilkS) (width 0.15)) ${''/* pins */} - (pad 1 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net_from}) - (pad 2 thru_hole circle (at -5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net_to}) + (pad 1 thru_hole circle (at 5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net_from}) + (pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.net_to}) ${''/* middle shaft */} (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask)) diff --git a/src/footprints/index.js b/src/footprints/index.js index 04b1162..4c8f311 100644 --- a/src/footprints/index.js +++ b/src/footprints/index.js @@ -4,5 +4,6 @@ module.exports = { choc: require('./choc'), diode: require('./diode'), promicro: require('./promicro'), + rgb: require('./rgb'), pad: require('./pad') } \ No newline at end of file diff --git a/src/footprints/rgb.js b/src/footprints/rgb.js new file mode 100644 index 0000000..28f4a61 --- /dev/null +++ b/src/footprints/rgb.js @@ -0,0 +1,38 @@ +module.exports = { + static_nets: ['VCC', 'GND'], + nets: ['din', 'dout'], + params: { + side: 'F' + }, + body: p => ` + + (module WS2812B (layer F.Cu) (tedit 53BEE615) + + ${p.at /* parametric position */} + + (fp_line (start -1.75 -1.75) (end -1.75 1.75) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start -1.75 1.75) (end 1.75 1.75) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start 1.75 1.75) (end 1.75 -1.75) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start 1.75 -1.75) (end -1.75 -1.75) (layer ${p.param_side}.SilkS) (width 0.15)) + + (fp_line (start -2.5 -2.5) (end -2.5 2.5) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start -2.5 2.5) (end 2.5 2.5) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start 2.5 2.5) (end 2.5 -2.5) (layer ${p.param_side}.SilkS) (width 0.15)) + (fp_line (start 2.5 -2.5) (end -2.5 -2.5) (layer ${p.param_side}.SilkS) (width 0.15)) + + (fp_poly (pts (xy 4 2.2) (xy 4 0.375) (xy 5 1.2875)) (layer ${p.param_side}.SilkS) (width 0.1)) + + (pad 1 smd rect (at -2.2 -0.875 ${p.rot}) (size 2.6 1) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_VCC}) + (pad 2 smd rect (at -2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_dout}) + (pad 3 smd rect (at 2.2 0.875 ${p.rot}) (size 2.6 1) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_GND}) + (pad 4 smd rect (at 2.2 -0.875 ${p.rot}) (size 2.6 1) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_din}) + + (pad 11 smd rect (at -2.5 -1.6 ${p.rot}) (size 2 1.2) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_VCC}) + (pad 22 smd rect (at -2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_dout}) + (pad 33 smd rect (at 2.5 1.6 ${p.rot}) (size 2 1.2) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_GND}) + (pad 44 smd rect (at 2.5 -1.6 ${p.rot}) (size 2 1.2) (layers ${p.param_side}.Cu ${p.param_side}.Paste ${p.param_side}.Mask) ${p.net_din}) + + ) + + ` +} \ No newline at end of file diff --git a/src/outlines.js b/src/outlines.js index 4f2f292..e984539 100644 --- a/src/outlines.js +++ b/src/outlines.js @@ -237,13 +237,14 @@ exports.parse = (config = {}, points = {}) => { const bevel = a.sane(part.bevel || 0, `${name}.bevel`, 'number') const rect_mirror = a.sane(part.mirror || false, `${name}.mirror`, 'boolean') const rect = rectangle(size[0], size[1], corner, bevel, name) - arg = anchor.position(rect) + arg = anchor.position(u.deepcopy(rect)) if (rect_mirror) { const mirror_part = u.deepcopy(part) a.assert(mirror_part.ref, `Field "${name}.ref" must be speficied if mirroring is required!`) mirror_part.ref = `mirror_${mirror_part.ref}` anchor = a.anchor(mirror_part, name, points, false) - arg = u.stack(arg, anchor.position(rect)) + const mirror_rect = m.model.moveRelative(u.deepcopy(rect), [-size[0], 0]) + arg = u.union(arg, anchor.position(mirror_rect)) } break case 'circle': @@ -257,7 +258,7 @@ exports.parse = (config = {}, points = {}) => { a.assert(mirror_part.ref, `Field "${name}.ref" must be speficied if mirroring is required!`) mirror_part.ref = `mirror_${mirror_part.ref}` anchor = a.anchor(mirror_part, name, points, false) - arg = u.stack(arg, u.circle(anchor.p, radius)) + arg = u.union(arg, u.circle(anchor.p, radius)) } break case 'polygon': diff --git a/src/pcbs.js b/src/pcbs.js index b1825c7..3383fb6 100644 --- a/src/pcbs.js +++ b/src/pcbs.js @@ -206,12 +206,16 @@ exports.parse = (config, points, outlines) => { for (const [pcb_name, pcb_config] of Object.entries(pcbs)) { // config sanitization - a.detect_unexpected(pcb_config, `pcb.${pcb_name}`, ['edge', 'footprints']) - const edge = outlines[pcb_config.edge] - if (!edge) throw new Error(`Field "pcb.${pcb_name}.edge" doesn't name a valid outline!`) + a.detect_unexpected(pcb_config, `pcb.${pcb_name}`, ['outlines', 'footprints']) - // Edge.Cuts conversion - const kicad_edge = makerjs2kicad(edge) + // outline conversion + const config_outlines = a.sane(pcb_config.outlines, `pcb.${pcb_name}.outlines`, 'object') + const kicad_outlines = {} + for (const [outline_name, outline] of Object.entries(config_outlines)) { + const ref = a.in(outline.outline, `pcb.${pcb_name}.outlines.${outline_name}.outline`, Object.keys(outlines)) + const layer = a.sane(outline.layer || 'Edge.Cuts', `pcb.${pcb_name}.outlines.${outline_name}.outline`, 'string') + kicad_outlines[outline_name] = makerjs2kicad(outlines[ref], layer) + } // making a global net index registry const nets = {"": 0} @@ -247,12 +251,13 @@ exports.parse = (config, points, outlines) => { const netclass = kicad_netclass.replace('__ADD_NET', add_nets_arr.join('\n')) const nets_text = nets_arr.join('\n') const footprint_text = footprints.join('\n') + const outline_text = Object.values(kicad_outlines).join('\n') results[pcb_name] = ` ${kicad_prefix} ${nets_text} ${netclass} ${footprint_text} - ${kicad_edge} + ${outline_text} ${kicad_suffix} ` } diff --git a/test/fixtures/absolem.yaml b/test/fixtures/absolem.yaml index 1968959..947dab9 100644 --- a/test/fixtures/absolem.yaml +++ b/test/fixtures/absolem.yaml @@ -559,7 +559,7 @@ outlines: glue: uniform_s19 size: 14 bound: false - classic_s19_middle: + pcb_middle: raw: type: keys side: middle @@ -573,32 +573,26 @@ outlines: size: [25, 5] ref: thumbfan_home_thumb shift: [0, 12] + mirror: true helper2: type: rectangle size: [25, 5] ref: thumbfan_far_thumb shift: [-25, 12] - helper3: - type: rectangle - size: [25, 5] - ref: mirror_thumbfan_home_thumb - shift: [25, 12] - helper4: - type: rectangle - size: [25, 5] - ref: mirror_thumbfan_far_thumb - shift: [0, 12] + mirror: true outer_bounds: type: outline name: classic_s19_outline operation: intersect - mounting_holes: - type: outline - name: mounting_holes - operation: stack pcbs: main: - edge: intersected_outline + outlines: + edge: + outline: intersected_outline + layer: Edge.Cuts + middle: + outline: pcb_middle + layer: F.SilkS footprints: mcu: type: promicro @@ -634,3 +628,13 @@ pcbs: width: 3 height: 3 front: false + led: + type: rgb + anchor: + ref: + - matrix_inner_bottom + - mirror_matrix_inner_bottom + shift: [0, -48] + nets: + din: 'P9' + dout: ''