diff --git a/Makefile b/Makefile index 3de5e02..bad7b69 100644 --- a/Makefile +++ b/Makefile @@ -10,17 +10,17 @@ setup: npm install # outputs from -output/pcbs/board.kicad_pcb output/pcbs/top_plate.kicad_pcb output/pcbs/bottom_plate.kicad_pcb &: samoklava.yaml +output/pcbs/left.kicad_pcb output/pcbs/right.kicad_pcb &: input/config.yaml npm run gen output/pcbs/%.dsn: output/pcbs/%.kicad_pcb # file can not be present or the script will refuse to run - if [ -f "$@" ] ; then rm $@ ; fi + if [ -f "$@" ] ; then rm -f $@ ; fi ${container_cmd} run ${container_args} soundmonster/kicad-automation-scripts:latest /usr/lib/python2.7/dist-packages/kicad-automation/pcbnew_automation/export_dsn.py $< $@ output/routed_pcbs/%.ses: output/pcbs/%.dsn mkdir -p $(shell dirname $@) - ${container_cmd} run ${container_args} soundmonster/freerouting_cli:v0.1.0 java -jar /opt/freerouting_cli.jar -de $< -do $@ + ${container_cmd} run ${container_args} soundmonster/freerouting_cli:v0.1.0 java -jar /opt/freerouting_cli.jar -ap 10 -mt 26 -de $< -do $@ output/routed_pcbs/%.kicad_pcb: output/routed_pcbs/%.ses output/pcbs/%.kicad_pcb mkdir -p $(shell dirname $@) @@ -40,6 +40,14 @@ output/routed_pcbs/%-back.png: output/routed_pcbs/%.kicad_pcb mkdir -p $(shell dirname $@) ${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw -b --style builtin:oshpark-afterdark.json $< $@ +output/pcbs/%-front.png: output/pcbs/%.kicad_pcb + mkdir -p $(shell dirname $@) + ${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw --style builtin:oshpark-afterdark.json $< $@ + +output/pcbs/%-back.png: output/pcbs/%.kicad_pcb + mkdir -p $(shell dirname $@) + ${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 pcbdraw -b --style builtin:oshpark-afterdark.json $< $@ + output/gerbers/%/gerbers.zip: output/routed_pcbs/%.kicad_pcb mkdir -p $(shell dirname $@) ${container_cmd} run ${container_args} yaqwsx/kikit:v0.7 kikit fab jlcpcb --no-assembly $< $(shell dirname $@) @@ -48,9 +56,16 @@ clean: rm -rf output all: \ - output/routed_pcbs/board-front.png \ - output/routed_pcbs/board-back.png \ - output/gerbers/top_plate/gerbers.zip \ - output/gerbers/bottom_plate/gerbers.zip \ - output/gerbers/board/gerbers.zip + output/routed_pcbs/left-front.png \ + output/routed_pcbs/left-back.png \ + output/routed_pcbs/right-front.png \ + output/routed_pcbs/right-back.png \ + output/gerbers/left/gerbers.zip \ + output/gerbers/right/gerbers.zip + +preview: \ + output/pcbs/left-front.png \ + output/pcbs/left-back.png \ + output/pcbs/right-front.png \ + output/pcbs/right-back.png \ diff --git a/README.md b/README.md index 40cb670..7e92f91 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,48 @@ -# samoklava -## An autogenerated split 36 key keyboard +# Split Typematrix 2022 +## A Typematrix 2022 style autogenerated keyboard -## Disclaimer -This is an early experimental prototype. Please do not rely on the autogenerated files and double check them manually -before sending them off to a PCB fab. The author and other random strangers on the internet have been able to produce -working keyboard prototypes from this repo; this does not mean that everything will work every time. - -The author(s) waive(s) responsibility for any damage or regulatory violations caused by using this software (see -license). Please consult your local regulations around radio frequencies and what's allowed for DIY projects in your -country. +## Layout +The Typematrix 2022 was one of the first ortholinear ergo keyboards and arguably the best layout ever made `[citation needed]` +See [An evaluation of the TypeMatrix ergonomic keyboard](http://www.typematrix.com/documents/TypeMatrix_study.pdf) left | right -|- -![left](images/board-front.png) | ![right](images/board-back.png) +![left](images/left-front.png) | ![right](images/right-front.png) +backside|backside +![left bottom](images/left-back.png) | ![right bottom](images/right-back.png) -A 5x3 split keyboard with 3 thumb keys. There is nothing unique about the keyboard layout. It's inspired by Corne and -Kyria, and has the exact number of keys needed for the [Miryoku](https://github.com/manna-harbour/miryoku) layout. The interesting thing about this keyboard is that it's a declarative design: -* Layout is declared using [Ergogen](https://github.com/mrzealot/ergogen/). See [this fork](https://github.com/soundmonster/ergogen). +* Layout is declared using [Ergogen](https://github.com/mrzealot/ergogen/). * The build system uses Ergogen to translate YAML to a KiCad PCB and plate files for FR-4 fab or laser cutting * uses [kicad-automation-scripts](https://github.com/productize/kicad-automation-scripts) and [FreeRouting](https://github.com/freerouting/freerouting) to **automatically route the traces on the PCB** * uses [KiKit](https://github.com/yaqwsx/KiKit) to render PCB previews (see top of this file) and production-ready **Gerber files** ## Features -* Extra pins and a slider switch for battery for wireless Promicro clones (tested with nice!nano); the slider can be - shorted with a jumper if `CONFIG_ZMK_SLEEP` is preferred. -* Wired operation with QMK should be possible but is not tested; TRRS footprints are included and routed. The pinout is - identical with a five-column Corne sans the RGBLEDs. -* Reset switches are easily accessible. The footprints used are the same as on the Corne. +* **Typematrix 2022** inspired split layout +* **Kailh Choc PG1232** choc mini, ulta low profile key switches +* [Nice!nano](https://nicekeyboards.com/nice-nano) optimised, but any promicro should work (bottom up) +* [Nice!view](https://nicekeyboards.com/nice-view) support + +## Todo +* Remove clutter and unnecesary outlines +* Top plate generation +* Bottom Plate (Thick PCB with cutouts for all components placed at the bottom. Optimised for maximum thinness) +* Remove or document magic numbers +* Backlight +* 3D models for 2x1.5u big enter key caps +* SMD diodes +* Better nice!nano footprint, steal from https://github.com/bstiq/nice-nano-kicad +* Middle bracked PCB with touchpad (Holds both halves together rigidly) +* Align board edges with actual keycap size ## How to If you would like to modify this: * fork it -* change `samoklava.yaml` to your liking +* change `input/config.yaml` to your liking * push your changes; the `build.yml` GitHub Workflow will pick it up, autoroute and generate Gerbers, all in a zip file. See https://github.com/soundmonster/samoklava/actions * or: @@ -45,4 +51,13 @@ If you would like to modify this: * check the `output` folder for KiCad PCBs and Gerbers See the [workflow](.github/workflows/build.yml) or the [Makefile](Makefile) for more details. -See [my ZMK config](https://github.com/soundmonster/samoklava-zmk-config) for a suggested keymap. + +## Disclaimer + +**Work in progress!** + +Based on the work of Soundmonster https://github.com/soundmonster/samoklava/ + +Requires ergogen 4.x + +Only connect battery if a nice!nano board is used! \ No newline at end of file diff --git a/images/board-back.png b/images/board-back.png deleted file mode 100644 index d07c717..0000000 Binary files a/images/board-back.png and /dev/null differ diff --git a/images/board-front.png b/images/board-front.png deleted file mode 100644 index 3c38903..0000000 Binary files a/images/board-front.png and /dev/null differ diff --git a/images/left-back.png b/images/left-back.png new file mode 100644 index 0000000..3c3bebe Binary files /dev/null and b/images/left-back.png differ diff --git a/images/left-front.png b/images/left-front.png new file mode 100644 index 0000000..fdaf8b9 Binary files /dev/null and b/images/left-front.png differ diff --git a/images/right-back.png b/images/right-back.png new file mode 100644 index 0000000..666c75d Binary files /dev/null and b/images/right-back.png differ diff --git a/images/right-front.png b/images/right-front.png new file mode 100644 index 0000000..4c4637d Binary files /dev/null and b/images/right-front.png differ diff --git a/input/config.yaml b/input/config.yaml new file mode 100644 index 0000000..0b9e308 --- /dev/null +++ b/input/config.yaml @@ -0,0 +1,560 @@ +units: + kx: cx + ky: cy + px: cx + py: cy + kxo: 0.5 * cx + kyo: 0.5 * cy + + # Font units + font_x: 1 + font_y: 1 + font_xo: 0.5 font_x + font_yo: 0.5 * font_y + + # Nice Nano + # The nice nano footprint's center doesn't account + # for the 2.54mm "overhang" of the PCB beyond the pins. + mcu_overhang_y: 2.54 + mcu_spacing_x: 2.72 + mcu_x: 17.78 + mcu_spacing_x + mcu_y: 30.48 + mcu_overhang_y + mcu_xo: 0.5 * mcu_x + mcu_yo: 0.5 * mcu_y + 0.5 * mcu_overhang_y + + # Nice!View display + disp_x: 14 + disp_y: 36 + disp_jumper_y: 2.6 + disp_xo: 0.5 * disp_x + disp_yo: 0.5 * disp_y + + # Battery Connector + batc_x: 4.3 + batc_y: 4.6 + batc_xo: 0.5 * batc_x + batc_yo: 0.5 * batc_y + + # Battery Pads + batp_x: 3.75 + batp_y: 2.5 + batp_xo: 0.5 * batp_x + batp_yo: 0.5 * batp_y + + # Power Switch + sw_power_x: 3.1 + sw_power_y: 8.3 + sw_power_xo: 0.5 * sw_power_x + sw_power_yo: 0.5 * sw_power_y + + # Reset Switch + sw_reset_x: 3.4 + sw_reset_y: 5 + sw_reset_xo: 0.5 * sw_reset_x + sw_reset_yo: 0.5 * sw_reset_y + +points: + key: + padding: ky + spread: kx + width: kx + height: ky + zones: + matrix: + # Fix placement on KiCAD sheet. + anchor: + shift: [35, -100] + key.tags: key + columns: + left: + key: + spread: cx * 0.25 + width: cx * 1.5 + asym: left + column_net: C0 + q: + key: + spread: cx * 1.25 + column_net: C1 + w: + key.column_net: C2 + e: + key.column_net: C3 + r: + key.column_net: C4 + t: + key.column_net: C5 + + rows: + bottom: + row_net: R4 + home: + row_net: R3 + top: + row_net: R2 + num: + row_net: R1 + f: + row_net: R0 + + leftcluster: + key: + spread: cx * 1.5 + width: cx * 1.5 + kx: cx * 1.5 + asym: left + tags: key + anchor: + ref: matrix_left_bottom + shift: [0, -2cy] + columns: + one: + key.column_net: C0 + two: + key.column_net: C1 + three: + key.column_net: C2 + rows: + down: + row_net: R7 + up: + row_net: R6 + rightcluster: + key: + asym: right + tags: key + anchor: + ref: matrix_left_bottom + shift: [0.25 * cx, -2cy] + columns: + one: + key.column_net: C0 + two: + key.column_net: C1 + three: + key.column_net: C2 + rows: + down: + row_net: R7 + up: + row_net: R7 + + bigenters: + key: + spread: cx * 1.5 + width: cx * 1.5 + kx: cx * 1.5 + padding: 2cy + height: 2cy + tags: [key, enter] + + anchor: + ref: matrix_t_top + shift: [cx * 1.25, -1.5cy] + columns: + one: + key.column_net: C6 + rows: + enter: + row_net: R2 + back: + padding: cy * 1.5 + row_net: R1 + f: + height: cy + tags: key + row_net: R0 + spaces: + key.tags: key + anchor: + ref: leftcluster_three_up + shift: [0.25 * cx , 0] + columns: + alt: + key: + asym: right + column_net: C3 + space: + key: + width: 3.5cx + spread: 2.25cx + column_net: C4 + tags: [key,space] + rows: + space: + row_net: R6 + rightsym: + anchor: + ref: matrix_q_bottom + shift: [-cx, 0] + key: + asym: right + tags: key + columns: + sym: + key.column_net: C0 + rows: + bottom: + row_net: R4 + home: + row_net: R3 + top: + row_net: R2 + num: + row_net: R1 + f: + row_net: R0 + right: + anchor: + ref: rightsym_sym_bottom + shift: [-cx * 1.25 , -2cy] + key: + asym: right + spread: cx * 1.5 + width: cx * 1.5 + kx: cx * 1.5 + tags: key + columns: + sym: + key.column_net: C7 + rows: + ctl_down: + row_net: R6 + ctl_up: + row_net: R5 + bottom: + row_net: R4 + home: + row_net: R3 + top: + row_net: R2 + num: + row_net: R1 + f: + row_net: R0 + + # + # Controller + # + controller: + anchor: + ref: bigenters_one_f + shift: [0.75 * kx + mcu_xo, kyo -2.25 - mcu_yo] + key: + name: mcu + width: mcu_x + height: mcu_y + + + + mirror: &mirror + ref: bigenters_one_f + distance: 100 +outlines: + keys: + - what: rectangle + where: [key] + size: [kx - 3, ky - 5] # FIXME hole sizes + + plateoutline: + - what: polygon + operation: stack + fillet: 2 + points: + - ref: matrix_left_f + shift: [-cx * 0.75, cy * 0.5] + - ref: bigenters_one_f + shift: [cx * 0.75, cy * 0.5] + - ref: spaces_space_space + shift: [cx * 1.75, -cy * 0.5] + - ref: leftcluster_three_down + shift: [cx * 0.75 , cy * 0.5] + - ref: leftcluster_three_down + shift: [cx * 0.75 , -cy * 0.5] + - ref: leftcluster_one_down + shift: [-cx * 0.75, -cy * 0.5] + + mirrorplateoutline: + - what: polygon + operation: stack + fillet: 2 + points: + - ref: mirror_rightsym_sym_f + shift: [-cx * 2, cy * 0.5] + - ref: mirror_bigenters_one_f + shift: [cx * 0.75, cy * 0.5] + - ref: mirror_spaces_space_space + shift: [cx * 1.75, -cy * 0.5] + - ref: mirror_rightcluster_three_down + shift: [cx * 0.75 , cy * 0.5] + - ref: mirror_rightcluster_three_down + shift: [cx * 0.75 , -cy * 0.5] + - ref: mirror_rightcluster_one_down + shift: [-cx * 2, -cy * 0.5] + + + # Combination preview showing outline and keys. + topleft: + - name: plateoutline + - operation: subtract + name: keys + + topright: + - name: mirrorplateoutline + - operation: subtract + name: keys + + mcuears: + - what: rectangle + size: [mcu_x +10 , 6cy] + fillet: 2 + + pcb_left: + - name: plateoutline + - operation: add + name: mcuears + where: + ref: bigenters_one_f + shift: [0.75 * cx + mcu_x/2 -5, -2.5cy ] + + pcb_right: + - name: mirrorplateoutline + - operation: add + name: mcuears + where: + ref: mirror_bigenters_one_f + shift: [0.75 * cx + mcu_x/2 -5 , -2.5cy ] + + toprightpcb: + - name: pcb_right + - operation: subtract + name: keys + + topleftpcb: + - name: pcb_left + - operation: subtract + name: keys + + all: + - name: topleftpcb + - operation: stack + name: toprightpcb + + pcb_both: + - name: pcb_left + - operation: stack + name: pcb_right + +pcbs: + left: + outlines: + left: + outline: pcb_left + footprints: + choc: + what: chocmini + where: + - /^matrix_.*/ + - /leftcluster_.*/ + - [/^bigenters_.*/, key, -enter] + - /^spaces_.*/ + params: + keycaps: true + reverse: false + from: "{{colrow}}" + to: "{{column_net}}" + choc_enter: + what: chocmini + where: + - [/^bigenters_.*/, enter] + params: + keycaps: true + reverse: false + from: "{{colrow}}" + to: "{{column_net}}" + adjust: + rotate: 90 + diode: + what: diode + where: + - /^matrix_.*/ + - /leftcluster_.*/ + - /^bigenters_.*/ + - /^spaces_.*/ + params: + from: "{{colrow}}" + to: "{{row_net}}" + adjust: + shift: [-8, 0] + rotate: 270 + # Controller Area + promicro: + what: promicro + params: + # Pin Assignments (Controller on top facing down) + # Right Side + P0: 'DPD' # Display Data + P1: 'DPC' # Display Clock + # GND + # GND + P2: 'DPE' # Display CS (nice!view only) FIXME? ZPM default? + P3: 'R1' # Row + P4: 'R2' # Row + P5: 'R3' # Row + P6: 'R4' # Row + P7: 'R5' # Row + P8: 'R6' # Row + P9: 'R7' # Row + + # Left Side + RAW: 'BAT_P' # Battery Pos + # GND # Ground / Battery Neg + # RST # Reset pin + # VCC # External Power + P21: 'C0' # Column + P20: 'C1' # Column + P19: 'C2' # Column + P18: 'C3' # Column + P15: 'C4' # Column + P14: 'C5' # Column + P16: 'C6' # Column + P10: 'F10' # Free + + where: + ref: mcu + shift: [0,0] + rotate: -90 + display: + what: nice_view + params: + reverse: true + MOSI: DPD + SCK: DPC + CS: DPE + show_labels: false + jumpers_at_bottom: false + where: + ref: mcu + shift: [0, -1] # Move the display down a bit to be sure the cable fits between the headers + pads_bat: + what: jstph + params: + pos: BAT_P + neg: GND + where: + ref: mcu + shift: [-batc_x, -mcu_y/2 - 5] + #rotate: 270 + reset: + what: button + params: + from: GND + to: RST + where: + ref: mcu + shift: [batc_x, -mcu_y/2 - 8] + + right: + outlines: + right: + outline: pcb_right + footprints: + choc: + what: chocmini + where: + - [/^mirror.*/, key, -enter] + - /rightcluster_.*/ + params: + keycaps: true + reverse: false + from: "{{colrow}}" + to: "{{column_net}}" + choc_enter: + what: chocmini + where: + - [/^mirror.*/, key, enter] + params: + keycaps: true + reverse: false + from: "{{colrow}}" + to: "{{column_net}}" + adjust: + rotate: 270 + diode: + what: diode + where: + - [/^mirror.*/, key ] + - /rightcluster_.*/ + params: + from: "{{colrow}}" + to: "{{row_net}}" + adjust: + shift: [-8, 0] + rotate: 90 + # Controller Area + promicro: + what: promicro + params: + # Pin Assignments (Controller on top facing down) + # Right Side + P0: 'DPD' # Display Data + P1: 'DPC' # Display Clock + # GND + # GND + P2: 'DPE' # Display CS (nice!view only) FIXME? ZPM default? + P3: 'R1' # Row + P4: 'R2' # Row + P5: 'R3' # Row + P6: 'R4' # Row + P7: 'R5' # Row + P8: 'R6' # Row + P9: 'R7' # Row + + # Left Side + RAW: 'BAT_P' # Battery Pos + # GND # Ground / Battery Neg + # RST # Reset pin + # VCC # External Power + P21: 'C0' # Column + P20: 'C1' # Column + P19: 'C2' # Column + P18: 'C3' # Column + P15: 'C4' # Column + P14: 'C5' # Column + P16: 'C6' # Column + P10: 'C7' # Column + + where: + ref: mirror_mcu + shift: [0,0] + rotate: 90 + + display: + what: nice_view + params: + reverse: true + MOSI: DPD + SCK: DPC + CS: DPE + show_labels: false + jumpers_at_bottom: false + where: + ref: mirror_mcu + shift: [0, -1] # Move the display down a bit to be sure the cable fits between the headers + pads_bat: + what: jstph + params: + pos: BAT_P + neg: GND + where: + ref: mirror_mcu + shift: [-batc_x, -mcu_y/2 - 5] + #rotate: 270 + reset: + what: button + params: + from: GND + to: RST + where: + ref: mirror_mcu + shift: [batc_x, -mcu_y/2 - 8] \ No newline at end of file diff --git a/input/footprints/choc.js b/input/footprints/choc.js new file mode 100644 index 0000000..fb47fdd --- /dev/null +++ b/input/footprints/choc.js @@ -0,0 +1,199 @@ +// Kailh Choc PG1350 +// Nets +// from: corresponds to pin 1 +// to: corresponds to pin 2 +// Params +// hotswap: default is false +// if true, will include holes and pads for Kailh choc hotswap sockets +// reverse: default is false +// if true, will flip the footprint such that the pcb can be reversible +// keycaps: default is false +// if true, will add choc sized keycap box around the footprint +// +// note: hotswap and reverse can be used simultaneously +// +// Changes compared to original ergogen footprint: +// - Added hotswap socket outlines to silk screen +// - Moved switch corner marks from user layer to silk screen +// - Added option to show 1.5u keycap outline +// - Changed keycap outline to show the exact choc keycap dimensions instead of padded dimensions (17.5mm length vs 18mm) + +module.exports = { + params: { + designator: 'S', + hotswap: false, + hotswap_tht: false, + reverse: false, + keycaps: false, + keycaps_x: 18, + keycaps_y: 17, + show_1_5u_outline: false, + from: undefined, + to: undefined + }, + body: p => { + + const keycap_xo = 0.5 * p.keycaps_x; + const keycap_yo = 0.5 * p.keycaps_y; + + const standard = ` + (module PG1350 (layer F.Cu) (tedit 5DD50112) + ${p.at /* parametric position */} + (attr virtual) + + ${'' /* footprint reference */} + (fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15)))) + (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15)))) + + ${''/* corner marks - front */} + (fp_line (start -7 -6) (end -7 -7) (layer F.SilkS) (width 0.15)) + (fp_line (start -7 7) (end -6 7) (layer F.SilkS) (width 0.15)) + (fp_line (start -6 -7) (end -7 -7) (layer F.SilkS) (width 0.15)) + (fp_line (start -7 7) (end -7 6) (layer F.SilkS) (width 0.15)) + (fp_line (start 7 6) (end 7 7) (layer F.SilkS) (width 0.15)) + (fp_line (start 7 -7) (end 6 -7) (layer F.SilkS) (width 0.15)) + (fp_line (start 6 7) (end 7 7) (layer F.SilkS) (width 0.15)) + (fp_line (start 7 -7) (end 7 -6) (layer F.SilkS) (width 0.15)) + + ${''/* corner marks - back */} + (fp_line (start -7 -6) (end -7 -7) (layer B.SilkS) (width 0.15)) + (fp_line (start -7 7) (end -6 7) (layer B.SilkS) (width 0.15)) + (fp_line (start -6 -7) (end -7 -7) (layer B.SilkS) (width 0.15)) + (fp_line (start -7 7) (end -7 6) (layer B.SilkS) (width 0.15)) + (fp_line (start 7 6) (end 7 7) (layer B.SilkS) (width 0.15)) + (fp_line (start 7 -7) (end 6 -7) (layer B.SilkS) (width 0.15)) + (fp_line (start 6 7) (end 7 7) (layer B.SilkS) (width 0.15)) + (fp_line (start 7 -7) (end 7 -6) (layer B.SilkS) (width 0.15)) + + + ${''/* middle shaft */} + (pad "" np_thru_hole circle (at 0 0) (size 3.429 3.429) (drill 3.429) (layers *.Cu *.Mask)) + + ${''/* stabilizers */} + (pad "" np_thru_hole circle (at 5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask)) + (pad "" np_thru_hole circle (at -5.5 0) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask)) + ` + + const hotswap = ` + ${''/* Middle hole for hot swap sockets */} + (pad "" np_thru_hole circle (at 0 -5.95) (size 3 3) (drill 3) (layers *.Cu *.Mask)) + ` + + const hotswap_tht = ` + (pad 2 thru_hole circle (at 0 5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.to.str}) + ` + const tht = ` + (pad 2 thru_hole circle (at 0 -5.9) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.to.str}) + ` + + const keycap = ` + ${'' /* keycap marks - 1u */} + (fp_line (start ${ -keycap_xo } ${ -keycap_yo }) (end ${ keycap_xo } ${ -keycap_yo }) (layer Dwgs.User) (width 0.15)) + (fp_line (start ${ keycap_xo } ${ -keycap_yo }) (end ${ keycap_xo } ${ keycap_yo }) (layer Dwgs.User) (width 0.15)) + (fp_line (start ${ keycap_xo } ${ keycap_yo }) (end ${ -keycap_xo } ${ keycap_yo }) (layer Dwgs.User) (width 0.15)) + (fp_line (start ${ -keycap_xo } ${ keycap_yo }) (end ${ -keycap_xo } ${ -keycap_yo }) (layer Dwgs.User) (width 0.15)) + ` + + function pins(def_neg, def_pos, def_side) { + let pad_1 = ` + (pad 1 connect custom (at ${def_neg}3.275 -5.95 ${p.rot}) (size 0.5 0.5) (layers ${def_side}.Cu ${def_side}.Mask) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy -1.3 -1.3) (xy -1.3 1.3) (xy 0.05 1.3) (xy 1.3 0.25) (xy 1.3 -1.3) + ) (width 0)) + ) ${p.from.str}) + `; + if(def_side == 'B') { + pad_1 = ` + (pad 1 connect custom (at ${def_neg}3.275 -5.95 ${p.rot}) (size 0.5 0.5) (layers ${def_side}.Cu ${def_side}.Mask) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy -1.3 -1.3) (xy -1.3 0.25) (xy -0.05 1.3) (xy 1.3 1.3) (xy 1.3 -1.3) + ) (width 0)) + ) ${p.from.str}) + ` + } + + const hotswap = ` + ${'' /* holes */} + (pad "" np_thru_hole circle (at ${def_pos}5 -3.75) (size 3 3) (drill 3) (layers *.Cu *.Mask)) + + ${'' /* net pads */} + ${pad_1} + (pad 2 smd rect (at ${def_pos}8.275 -3.75 ${p.rot}) (size 2.6 2.6) (layers ${def_side}.Cu ${def_side}.Paste ${def_side}.Mask) ${p.to.str}) + + ${''/* hotswap outline - front */} + (fp_line (start -2 -6.7) (end -2 -7.7) (layer "F.SilkS") (width 0.15) (tstamp 1da291cc-3aa5-4632-8f99-7dae246a7f56)) + (fp_line (start -7 -1.5) (end -7 -2) (layer "F.SilkS") (width 0.15) (tstamp 238b4f36-a253-431c-a93e-34af7da002ac)) + (fp_line (start -7 -6.2) (end -2.5 -6.2) (layer "F.SilkS") (width 0.15) (tstamp 4bee3b93-9a25-4a62-bc3b-7a216b6aba9d)) + (fp_line (start -2.5 -2.2) (end -2.5 -1.5) (layer "F.SilkS") (width 0.15) (tstamp 5193b92c-0f95-414f-9c12-4288fbf1289f)) + (fp_line (start -7 -5.6) (end -7 -6.2) (layer "F.SilkS") (width 0.15) (tstamp 7b669a9c-8885-4737-8192-e35d45fe2c93)) + (fp_line (start -1.5 -8.2) (end -2 -7.7) (layer "F.SilkS") (width 0.15) (tstamp 7e881b05-98b1-4290-99fa-d895271485f2)) + (fp_line (start -2.5 -1.5) (end -7 -1.5) (layer "F.SilkS") (width 0.15) (tstamp 8ef8ab63-d78b-49e0-89aa-d7de17fdbe74)) + (fp_line (start 2 -7.7) (end 1.5 -8.2) (layer "F.SilkS") (width 0.15) (tstamp 9b4b514c-b288-40ab-af4d-fb8827371f01)) + (fp_line (start 1.5 -3.7) (end -1 -3.7) (layer "F.SilkS") (width 0.15) (tstamp 9d6f01bf-507b-4b70-82a7-182a04da9e3f)) + (fp_line (start 1.5 -8.2) (end -1.5 -8.2) (layer "F.SilkS") (width 0.15) (tstamp c1815e63-5999-4d25-8dc0-c63ae372e426)) + (fp_line (start 2 -4.2) (end 1.5 -3.7) (layer "F.SilkS") (width 0.15) (tstamp d868ec48-42f4-4608-baef-8e135bf87a69)) + (fp_arc (start -0.91 -2.11) (end -0.8 -3.7) (angle -90) (layer F.SilkS) (width 0.15)) + (fp_arc (start -2.55 -6.75) (end -2.52 -6.2) (angle -90) (layer F.SilkS) (width 0.15)) + + ${''/* hotswap outline - back */} + (fp_line (start -1.5 -3.7) (end 1 -3.7) (layer "B.SilkS") (width 0.15) (tstamp 0ebc7e3d-c040-4c6e-aaf8-1870c68a4ff3)) + (fp_line (start 2 -6.7) (end 2 -7.7) (layer "B.SilkS") (width 0.15) (tstamp 119cd2ee-6025-406f-acfc-adcac3592135)) + (fp_line (start -2 -4.2) (end -1.5 -3.7) (layer "B.SilkS") (width 0.15) (tstamp 21f7e9f1-0a4c-49be-a4ca-8c8253ab27e6)) + (fp_line (start 1.5 -8.2) (end 2 -7.7) (layer "B.SilkS") (width 0.15) (tstamp 5d8b52e3-6cf3-4957-a7be-c8e9a1edb540)) + (fp_line (start -2 -7.7) (end -1.5 -8.2) (layer "B.SilkS") (width 0.15) (tstamp 6752af1f-7117-4db8-a4d6-67772bc5edb1)) + (fp_line (start -1.5 -8.2) (end 1.5 -8.2) (layer "B.SilkS") (width 0.15) (tstamp 6a9026f4-97ad-4ca6-b8a7-4b78e7eaa11b)) + (fp_line (start 2.5 -2.2) (end 2.5 -1.5) (layer "B.SilkS") (width 0.15) (tstamp 7982b0aa-ef8e-47f9-a2a9-295924d921de)) + (fp_line (start 2.5 -1.5) (end 7 -1.5) (layer "B.SilkS") (width 0.15) (tstamp 9ceea79f-ef80-4e41-a251-1e78376f0a53)) + (fp_line (start 7 -5.6) (end 7 -6.2) (layer "B.SilkS") (width 0.15) (tstamp a587fbd2-119d-431c-964c-d65c1fee09ba)) + (fp_line (start 7 -1.5) (end 7 -2) (layer "B.SilkS") (width 0.15) (tstamp aede887e-5713-4410-b301-8003185f738f)) + (fp_line (start 7 -6.2) (end 2.5 -6.2) (layer "B.SilkS") (width 0.15) (tstamp c0ed410a-0280-4a8c-8ff3-f58b7b1340fc)) + (fp_arc (start 0.97 -2.17) (end 2.5 -2.17) (angle -90) (layer B.SilkS) (width 0.15)) + (fp_arc (start 2.499999 -6.7) (end 2 -6.690001) (angle -88.9) (layer B.SilkS) (width 0.15)) + `; + + const tht = ` + ${''/* pins */} + (pad 1 thru_hole circle (at ${def_pos}5 -3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.from.str}) + ` + + const hotswap_tht = ` + ${''/* pins - with inverse y direction */} + (pad 1 thru_hole circle (at ${def_pos}5 3.8) (size 2.032 2.032) (drill 1.27) (layers *.Cu *.Mask) ${p.from.str}) + ` + + let final = ''; + if(p.hotswap) { + final += hotswap; + if(p.hotswap_tht) { + final += hotswap_tht; + } + } else { + final += tht; + } + + return final; + } + if(p.reverse) { + return ` + ${standard} + ${p.keycaps ? keycap : ''} + ${p.hotswap ? hotswap : tht} + ${p.hotswap && p.hotswap_tht ? hotswap_tht : ''} + ${pins('-', '', 'B')} + ${pins('', '-', 'F')}) + ` + } else { + return ` + ${standard} + ${p.keycaps ? keycap : ''} + ${pins('-', '', 'B')}) + ` + } + } + } diff --git a/input/footprints/diode.js b/input/footprints/diode.js new file mode 100644 index 0000000..f6b6a8b --- /dev/null +++ b/input/footprints/diode.js @@ -0,0 +1,53 @@ +module.exports = { + params: { + designator: 'D', + include_tht: true, + from: undefined, + to: undefined + }, + body: p => { + + const tht = ` + (pad 1 thru_hole rect (at -3.81 0 ${p.rot}) (size 1.778 1.778) (drill 0.9906) (layers *.Cu *.Mask) ${p.to.str}) + (pad 2 thru_hole circle (at 3.81 0 ${p.rot}) (size 1.905 1.905) (drill 0.9906) (layers *.Cu *.Mask) ${p.from.str}) + `; + + const footprint = ` + (module ComboDiode (layer F.Cu) (tedit 5B24D78E) + ${p.at /* parametric position */} + (attr virtual) + + ${'' /* footprint reference */} + (fp_text reference "${p.ref}" (at 0 0) (layer F.SilkS) ${p.ref_hide} (effects (font (size 1.27 1.27) (thickness 0.15)))) + (fp_text value "" (at 0 0) (layer F.SilkS) hide (effects (font (size 1.27 1.27) (thickness 0.15)))) + + ${''/* diode symbols */} + (fp_line (start 0.25 0) (end 0.75 0) (layer F.SilkS) (width 0.1)) + (fp_line (start 0.25 0.4) (end -0.35 0) (layer F.SilkS) (width 0.1)) + (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer F.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end 0.25 -0.4) (layer F.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end -0.35 0.55) (layer F.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end -0.35 -0.55) (layer F.SilkS) (width 0.1)) + (fp_line (start -0.75 0) (end -0.35 0) (layer F.SilkS) (width 0.1)) + (fp_line (start 0.25 0) (end 0.75 0) (layer B.SilkS) (width 0.1)) + (fp_line (start 0.25 0.4) (end -0.35 0) (layer B.SilkS) (width 0.1)) + (fp_line (start 0.25 -0.4) (end 0.25 0.4) (layer B.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end 0.25 -0.4) (layer B.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end -0.35 0.55) (layer B.SilkS) (width 0.1)) + (fp_line (start -0.35 0) (end -0.35 -0.55) (layer B.SilkS) (width 0.1)) + (fp_line (start -0.75 0) (end -0.35 0) (layer B.SilkS) (width 0.1)) + + ${''/* SMD pads on both sides */} + (pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.to.str}) + (pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.from.str}) + (pad 1 smd rect (at -1.65 0 ${p.rot}) (size 0.9 1.2) (layers B.Cu B.Paste B.Mask) ${p.to.str}) + (pad 2 smd rect (at 1.65 0 ${p.rot}) (size 0.9 1.2) (layers F.Cu F.Paste F.Mask) ${p.from.str}) + + ${''/* THT terminals */} + ${ p.include_tht ? tht : '' } + ) + ` + + return footprint; + } +} diff --git a/input/footprints/icon_bat.js b/input/footprints/icon_bat.js new file mode 100644 index 0000000..75ebdec --- /dev/null +++ b/input/footprints/icon_bat.js @@ -0,0 +1,56 @@ +module.exports = { + params: { + designator: 'ICON', + side: 'F', + reverse: false, + spacing: 1 + }, + body: p => { + const spacing_adj = p.spacing / 2; + + const top = ` + (module icon_bat (layer F.Cu) (tedit 64461058) + ${p.at /* parametric position */} + (attr virtual) + + `; + + const front = ` + (fp_text reference "${p.ref}" (at 0 3 ${p.rot}) (layer F.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center ${-0.55 - spacing_adj} 0) (end ${-0.05 - spacing_adj} 0) (layer F.SilkS) (width 0.1)) + (fp_line (start ${-0.55 - spacing_adj} -0.3) (end ${-0.55 - spacing_adj} 0.3) (layer F.SilkS) (width 0.1)) + (fp_line (start ${-0.85 - spacing_adj} 0) (end ${-0.25 - spacing_adj} 0) (layer F.SilkS) (width 0.1)) + + (fp_circle (center ${0.55 + spacing_adj} 0) (end ${1.05 + spacing_adj} 0) (layer F.SilkS) (width 0.1)) + (fp_line (start ${0.25 + spacing_adj} 0) (end ${0.85 + spacing_adj} 0) (layer F.SilkS) (width 0.1)) + ` + + const back = ` + (fp_circle (center ${-0.55 - spacing_adj} 0) (end ${-1.05 - spacing_adj} 0) (layer B.SilkS) (width 0.1)) + (fp_line (start ${-0.25 - spacing_adj} 0) (end ${-0.85 - spacing_adj} 0) (layer B.SilkS) (width 0.1)) + + (fp_circle (center ${0.55 + spacing_adj} 0) (end ${0.05 + spacing_adj} 0) (layer B.SilkS) (width 0.1)) + (fp_line (start ${0.55 + spacing_adj} -0.3) (end ${0.55 + spacing_adj} 0.3) (layer B.SilkS) (width 0.1)) + (fp_line (start ${0.85 + spacing_adj} 0) (end ${0.25 + spacing_adj} 0) (layer B.SilkS) (width 0.1)) + ` + + const bottom = ` + ) + ` + + let final = top; + + if(p.side == "F" || p.reverse) { + final += front; + } + if(p.side == "B" || p.reverse) { + final += back; + } + + final += bottom; + + return final; + } +} diff --git a/input/footprints/nice_nano_pretty.js b/input/footprints/nice_nano_pretty.js new file mode 100644 index 0000000..96b50a7 --- /dev/null +++ b/input/footprints/nice_nano_pretty.js @@ -0,0 +1,1820 @@ +// Arduino ProMicro atmega32u4au +// Take care to bridge the pads on the correct side of the pcb +// To orient the MCU up, meaning power led faces away from pcb, bridge the pads on the side of the pcb with the MCU +// To orient the MCU down, meaning power led faces the pcb, bridge the pads on the opposite side of the pcb +// +// From: +// https://github.com/Albert-IV/ergogen-contrib/blob/main/src/footprints/promicro_pretty.js +// +// But you must use the ergogen v4 updated version from this PR: +// https://github.com/Albert-IV/ergogen-contrib/pull/2 + +module.exports = { + params: { + class: 'MCU', + RAW: {type: 'net', value: 'RAW'}, + GND: {type: 'net', value: 'GND'}, + RST: {type: 'net', value: 'RST'}, + VCC: {type: 'net', value: 'VCC'}, + P21: {type: 'net', value: 'P21'}, + P20: {type: 'net', value: 'P20'}, + P19: {type: 'net', value: 'P19'}, + P18: {type: 'net', value: 'P18'}, + P15: {type: 'net', value: 'P15'}, + P14: {type: 'net', value: 'P14'}, + P16: {type: 'net', value: 'P16'}, + P10: {type: 'net', value: 'P10'}, + P1: {type: 'net', value: 'P1'}, + P0: {type: 'net', value: 'P0'}, + P2: {type: 'net', value: 'P2'}, + P3: {type: 'net', value: 'P3'}, + P4: {type: 'net', value: 'P4'}, + P5: {type: 'net', value: 'P5'}, + P6: {type: 'net', value: 'P6'}, + P7: {type: 'net', value: 'P7'}, + P8: {type: 'net', value: 'P8'}, + P9: {type: 'net', value: 'P9'}, + + show_labels: false, + label_layer: 'Fab', + RAW_label: '', + GND_label: '', + RST_label: '', + VCC_label: '', + P21_label: '', + P20_label: '', + P19_label: '', + P18_label: '', + P15_label: '', + P14_label: '', + P16_label: '', + P10_label: '', + P1_label: '', + P0_label: '', + P2_label: '', + P3_label: '', + P4_label: '', + P5_label: '', + P6_label: '', + P7_label: '', + P8_label: '', + P9_label: '', + }, + body: p => { + const get_pin_net_name = (p, pin_name) => { + return p[pin_name].name; + }; + + const get_pin_label_override = (p, pin_name) => { + prop_name = `${pin_name}_label`; + return p[prop_name]; + }; + + const get_pin_label = (p, pin_name) => { + label = get_pin_label_override(p, pin_name); + if(label == '') { + label = get_pin_net_name(p, pin_name); + } + + if(label === undefined) { + label = '""'; + } + + return label; + }; + + const pin_labels = ` + (fp_text user ${ get_pin_label(p, 'P21') } (at -3.81 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P2') } (at -3.81 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P2') } (at -3.81 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P21') } (at -3.81 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'VCC') } (at -6.35 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -6.35 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -6.35 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'VCC') } (at -6.35 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'RST') } (at -8.89 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -8.89 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -8.89 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'RST') } (at -8.89 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -11.43 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P0') } (at -11.43 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P0') } (at -11.43 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'GND') } (at -11.43 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'RAW') } (at -13.97 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P1') } (at -13.97 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P1') } (at -13.97 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'RAW') } (at -13.97 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P20') } (at -1.27 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P3') } (at -1.27 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P3') } (at -1.27 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P20') } (at -1.27 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P19') } (at 1.27 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P4') } (at 1.27 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P4') } (at 1.27 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P19') } (at 1.27 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P18') } (at 3.81 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P5') } (at 3.81 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P5') } (at 3.81 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P18') } (at 3.81 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P15') } (at 6.35 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P6') } (at 6.35 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P6') } (at 6.35 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P15') } (at 6.35 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P14') } (at 8.89 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P7') } (at 8.89 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P7') } (at 8.89 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P14') } (at 8.89 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P16') } (at 11.43 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P8') } (at 11.43 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P8') } (at 11.43 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P16') } (at 11.43 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P10') } (at 13.97 -2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P9') } (at 13.97 2.75) (layer F.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user ${ get_pin_label(p, 'P9') } (at 13.97 2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_text user ${ get_pin_label(p, 'P10') } (at 13.97 -2.75) (layer B.${p.label_layer}) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + ` + + return ` + (module ProMicro (layer F.Cu) (tedit 6135B927) + ${p.at /* parametric position */} + (attr virtual) + + ${'' /* footprint description, tags and reference */} + (descr "Solder-jumper reversible Pro Micro footprint") + (tags "promicro ProMicro reversible solder jumper") + (fp_text reference "${p.ref}" (at -16.256 -0.254 ${p.rot + 90}) (layer F.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + + ${''/* extra border around "RAW", in case the rectangular shape is not distinctive enough */} + (fp_line (start -15.24 6.35) (end -12.7 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 6.35) (end -15.24 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 6.35) (end -12.7 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 8.89) (end -15.24 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 -6.35) (end -12.7 -6.35) (layer B.SilkS) (width 0.15)) + (fp_line (start -15.24 -6.35) (end -15.24 -8.89) (layer B.SilkS) (width 0.15)) + (fp_line (start -12.7 -6.35) (end -12.7 -8.89) (layer B.SilkS) (width 0.15)) + (fp_line (start -12.7 -8.89) (end -15.24 -8.89) (layer B.SilkS) (width 0.15)) + + (fp_circle (center 13.97 0.762) (end 14.095 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 13.97 0.762) (end 14.095 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 13.97 -0.762) (end 14.095 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 13.97 -0.762) (end 14.095 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 11.43 0.762) (end 11.555 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 11.43 0.762) (end 11.555 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 11.43 -0.762) (end 11.555 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 11.43 -0.762) (end 11.555 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 8.89 0.762) (end 9.015 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 8.89 0.762) (end 9.015 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 8.89 -0.762) (end 9.015 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 8.89 -0.762) (end 9.015 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 6.35 0.762) (end 6.475 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 6.35 0.762) (end 6.475 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 6.35 -0.762) (end 6.475 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 6.35 -0.762) (end 6.475 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 3.81 0.762) (end 3.935 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 3.81 0.762) (end 3.935 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 3.81 -0.762) (end 3.935 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 3.81 -0.762) (end 3.935 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 1.27 0.762) (end 1.395 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 1.27 0.762) (end 1.395 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center 1.27 -0.762) (end 1.395 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center 1.27 -0.762) (end 1.395 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -1.27 0.762) (end -1.145 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -1.27 0.762) (end -1.145 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -1.27 -0.762) (end -1.145 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -1.27 -0.762) (end -1.145 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -3.81 0.762) (end -3.685 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -3.81 0.762) (end -3.685 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -3.81 -0.762) (end -3.685 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -3.81 -0.762) (end -3.685 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -6.35 0.762) (end -6.225 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -6.35 0.762) (end -6.225 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -6.35 -0.762) (end -6.225 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -6.35 -0.762) (end -6.225 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -8.89 0.762) (end -8.765 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -8.89 0.762) (end -8.765 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -8.89 -0.762) (end -8.765 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -8.89 -0.762) (end -8.765 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -11.43 -0.762) (end -11.305 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -11.43 -0.762) (end -11.305 -0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -11.43 0.762) (end -11.305 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -11.43 0.762) (end -11.305 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -13.97 0.762) (end -13.845 0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -13.97 0.762) (end -13.845 0.762) (layer F.Mask) (width 0.25)) + (fp_circle (center -13.97 -0.762) (end -13.845 -0.762) (layer B.Mask) (width 0.25)) + (fp_circle (center -13.97 -0.762) (end -13.845 -0.762) (layer F.Mask) (width 0.25)) + (fp_poly (pts (xy 14.478 -5.08) (xy 13.462 -5.08) (xy 13.462 -6.096) (xy 14.478 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 11.938 -5.08) (xy 10.922 -5.08) (xy 10.922 -6.096) (xy 11.938 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 9.398 -5.08) (xy 8.382 -5.08) (xy 8.382 -6.096) (xy 9.398 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 6.858 -5.08) (xy 5.842 -5.08) (xy 5.842 -6.096) (xy 6.858 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 4.318 -5.08) (xy 3.302 -5.08) (xy 3.302 -6.096) (xy 4.318 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 1.778 -5.08) (xy 0.762 -5.08) (xy 0.762 -6.096) (xy 1.778 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -0.762 -5.08) (xy -1.778 -5.08) (xy -1.778 -6.096) (xy -0.762 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -3.302 -5.08) (xy -4.318 -5.08) (xy -4.318 -6.096) (xy -3.302 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -5.842 -5.08) (xy -6.858 -5.08) (xy -6.858 -6.096) (xy -5.842 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -8.382 -5.08) (xy -9.398 -5.08) (xy -9.398 -6.096) (xy -8.382 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -10.922 -5.08) (xy -11.938 -5.08) (xy -11.938 -6.096) (xy -10.922 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -13.462 -5.08) (xy -14.478 -5.08) (xy -14.478 -6.096) (xy -13.462 -6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 13.462 5.08) (xy 14.478 5.08) (xy 14.478 6.096) (xy 13.462 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 10.922 5.08) (xy 11.938 5.08) (xy 11.938 6.096) (xy 10.922 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 8.382 5.08) (xy 9.398 5.08) (xy 9.398 6.096) (xy 8.382 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 5.842 5.08) (xy 6.858 5.08) (xy 6.858 6.096) (xy 5.842 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 3.302 5.08) (xy 4.318 5.08) (xy 4.318 6.096) (xy 3.302 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy 0.762 5.08) (xy 1.778 5.08) (xy 1.778 6.096) (xy 0.762 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -1.778 5.08) (xy -0.762 5.08) (xy -0.762 6.096) (xy -1.778 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -4.318 5.08) (xy -3.302 5.08) (xy -3.302 6.096) (xy -4.318 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -6.858 5.08) (xy -5.842 5.08) (xy -5.842 6.096) (xy -6.858 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -9.398 5.08) (xy -8.382 5.08) (xy -8.382 6.096) (xy -9.398 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -11.938 5.08) (xy -10.922 5.08) (xy -10.922 6.096) (xy -11.938 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -14.478 5.08) (xy -13.462 5.08) (xy -13.462 6.096) (xy -14.478 6.096)) (layer B.Mask) (width 0.1)) + (fp_poly (pts (xy -13.462 -5.08) (xy -14.478 -5.08) (xy -14.478 -6.096) (xy -13.462 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 1.778 -5.08) (xy 0.762 -5.08) (xy 0.762 -6.096) (xy 1.778 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -10.922 -5.08) (xy -11.938 -5.08) (xy -11.938 -6.096) (xy -10.922 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -8.382 -5.08) (xy -9.398 -5.08) (xy -9.398 -6.096) (xy -8.382 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -3.302 -5.08) (xy -4.318 -5.08) (xy -4.318 -6.096) (xy -3.302 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -0.762 -5.08) (xy -1.778 -5.08) (xy -1.778 -6.096) (xy -0.762 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 6.858 -5.08) (xy 5.842 -5.08) (xy 5.842 -6.096) (xy 6.858 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 11.938 -5.08) (xy 10.922 -5.08) (xy 10.922 -6.096) (xy 11.938 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -5.842 -5.08) (xy -6.858 -5.08) (xy -6.858 -6.096) (xy -5.842 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 4.318 -5.08) (xy 3.302 -5.08) (xy 3.302 -6.096) (xy 4.318 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 9.398 -5.08) (xy 8.382 -5.08) (xy 8.382 -6.096) (xy 9.398 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 14.478 -5.08) (xy 13.462 -5.08) (xy 13.462 -6.096) (xy 14.478 -6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 13.462 5.08) (xy 14.478 5.08) (xy 14.478 6.096) (xy 13.462 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 10.922 5.08) (xy 11.938 5.08) (xy 11.938 6.096) (xy 10.922 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 8.382 5.08) (xy 9.398 5.08) (xy 9.398 6.096) (xy 8.382 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 5.842 5.08) (xy 6.858 5.08) (xy 6.858 6.096) (xy 5.842 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 3.302 5.08) (xy 4.318 5.08) (xy 4.318 6.096) (xy 3.302 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy 0.762 5.08) (xy 1.778 5.08) (xy 1.778 6.096) (xy 0.762 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -1.778 5.08) (xy -0.762 5.08) (xy -0.762 6.096) (xy -1.778 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -4.318 5.08) (xy -3.302 5.08) (xy -3.302 6.096) (xy -4.318 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -6.858 5.08) (xy -5.842 5.08) (xy -5.842 6.096) (xy -6.858 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -9.398 5.08) (xy -8.382 5.08) (xy -8.382 6.096) (xy -9.398 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -11.938 5.08) (xy -10.922 5.08) (xy -10.922 6.096) (xy -11.938 6.096)) (layer F.Mask) (width 0.1)) + (fp_poly (pts (xy -14.478 5.08) (xy -13.462 5.08) (xy -13.462 6.096) (xy -14.478 6.096)) (layer F.Mask) (width 0.1)) + (pad 2 smd custom (at -11.43 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + ) ${p.GND.str}) + (pad "" thru_hole circle (at -13.97 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask) + (zone_connect 0)) + (pad "" thru_hole circle (at -11.43 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -8.89 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -6.35 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -3.81 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -1.27 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 1.27 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 3.81 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 6.35 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 8.89 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 11.43 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 13.97 7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 13.97 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 11.43 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 8.89 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 6.35 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 3.81 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 1.27 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -1.27 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -3.81 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -6.35 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -8.89 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -11.43 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -13.97 -7.62) (size 1.6 1.6) (drill 1.1) (layers *.Cu *.Mask)) + (pad "" smd custom (at -13.97 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 24 smd custom (at -13.97 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P1.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" thru_hole rect (at -13.97 7.62 ${p.rot}) (size 1.6 1.6) (drill 1.1) (layers F.Cu F.Mask) + (zone_connect 0)) + (pad "" thru_hole rect (at -13.97 -7.62 ${p.rot}) (size 1.6 1.6) (drill 1.1) (layers B.Cu B.Mask) + (zone_connect 0)) + (pad "" smd custom (at -11.43 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -11.43 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 23 smd custom (at -11.43 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P0.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -8.89 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -8.89 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 22 smd custom (at -8.89 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.GND.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -6.35 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -6.35 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 21 smd custom (at -6.35 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.GND.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -3.81 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -3.81 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 20 smd custom (at -3.81 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P2.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -1.27 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -1.27 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 19 smd custom (at -1.27 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P3.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 1.27 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 1.27 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 18 smd custom (at 1.27 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P4.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 3.81 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 3.81 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 17 smd custom (at 3.81 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P5.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 6.35 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 6.35 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 16 smd custom (at 6.35 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P6.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 8.89 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 8.89 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 15 smd custom (at 8.89 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P7.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 11.43 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 11.43 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 14 smd custom (at 11.43 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P8.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 13.97 6.35 ${p.rot + 180}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 13.97 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 13 smd custom (at 13.97 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P9.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad 1 smd custom (at -13.97 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.RAW.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad 3 smd custom (at -8.89 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.RST.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -8.89 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -8.89 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -11.43 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 2 smd custom (at -11.43 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.GND.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 4 smd custom (at -6.35 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.VCC.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -11.43 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -6.35 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 6 smd custom (at -1.27 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P20.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad 7 smd custom (at 1.27 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P19.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 13.97 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 1.27 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at 8.89 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 8 smd custom (at 3.81 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P18.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 1.27 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 12 smd custom (at 13.97 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P10.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 3.81 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at 6.35 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 13.97 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -3.81 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 3.81 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -1.27 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 9 smd custom (at 6.35 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P15.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -6.35 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -3.81 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -1.27 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at 6.35 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 10 smd custom (at 8.89 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P14.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 8.89 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at 11.43 -5.842 ${p.rot}) (size 0.1 0.1) (layers F.Cu F.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 11 smd custom (at 11.43 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P16.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 11.43 -6.35 ${p.rot}) (size 0.25 1) (layers F.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 5 smd custom (at -3.81 -4.826 ${p.rot}) (size 1.2 0.5) (layers F.Cu F.Mask) ${p.P21.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad 1 smd custom (at -13.97 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.RAW.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad "" smd custom (at -11.43 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -11.43 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 2 smd custom (at -11.43 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -8.89 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -8.89 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 3 smd custom (at -8.89 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.RST.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -6.35 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -6.35 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 4 smd custom (at -6.35 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.VCC.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -3.81 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -3.81 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 5 smd custom (at -3.81 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P21.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -1.27 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -1.27 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 6 smd custom (at -1.27 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P20.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 1.27 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 1.27 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 7 smd custom (at 1.27 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P19.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 3.81 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 3.81 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 8 smd custom (at 3.81 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P18.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 6.35 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 6.35 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 9 smd custom (at 6.35 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P15.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 8.89 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 8.89 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 10 smd custom (at 8.89 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P14.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 11.43 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 11.43 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 11 smd custom (at 11.43 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P16.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 13.97 6.35 ${p.rot + 180}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 13.97 5.842 ${p.rot + 180}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 12 smd custom (at 13.97 4.826 ${p.rot + 180}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P10.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -13.97 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -13.97 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 24 smd custom (at -13.97 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P1.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad 23 smd custom (at -11.43 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P0.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -11.43 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -11.43 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 22 smd custom (at -8.89 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.GND.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -8.89 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -8.89 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 21 smd custom (at -6.35 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.GND.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -6.35 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -6.35 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 20 smd custom (at -3.81 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P2.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -3.81 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -3.81 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 19 smd custom (at -1.27 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P3.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at -1.27 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at -1.27 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 18 smd custom (at 1.27 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P4.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 1.27 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 1.27 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 17 smd custom (at 3.81 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P5.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 3.81 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 3.81 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 16 smd custom (at 6.35 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P6.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 6.35 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 6.35 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 15 smd custom (at 8.89 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P7.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 8.89 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 8.89 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 14 smd custom (at 11.43 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P8.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 11.43 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 11.43 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 13 smd custom (at 13.97 -4.826 ${p.rot}) (size 1.2 0.5) (layers B.Cu B.Mask) ${p.P9.str} + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 0) (xy -0.6 0) (xy -0.6 -1) (xy 0 -0.4) (xy 0.6 -1) + ) (width 0)) + )) + (pad "" smd custom (at 13.97 -6.35 ${p.rot}) (size 0.25 1) (layers B.Cu) + (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + )) + (pad "" smd custom (at 13.97 -5.842 ${p.rot}) (size 0.1 0.1) (layers B.Cu B.Mask) + (clearance 0.1) (zone_connect 0) + (options (clearance outline) (anchor rect)) + (primitives + (gr_poly (pts + (xy 0.6 -0.4) (xy -0.6 -0.4) (xy -0.6 -0.2) (xy 0 0.4) (xy 0.6 -0.2) + ) (width 0)) + )) + (pad 23 smd custom (at -11.43 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P0.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 23 smd custom (at -11.43 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P0.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 2 smd custom (at -11.43 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.GND.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 2 thru_hole circle (at -11.43 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.GND.str}) + (pad 23 thru_hole circle (at -11.43 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P0.str}) + (pad 24 thru_hole circle (at -13.97 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P1.str}) + (pad 1 thru_hole circle (at -13.97 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.RAW.str}) + (pad 24 smd custom (at -13.97 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P1.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 1 smd custom (at -13.97 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.RAW.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 1 smd custom (at -13.97 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.RAW.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 24 smd custom (at -13.97 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P1.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 22 thru_hole circle (at -8.89 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.GND.str}) + (pad 3 thru_hole circle (at -8.89 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.RST.str}) + (pad 22 smd custom (at -8.89 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.GND.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 3 smd custom (at -8.89 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.RST.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 3 smd custom (at -8.89 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.RST.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 22 smd custom (at -8.89 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.GND.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 21 thru_hole circle (at -6.35 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.GND.str}) + (pad 4 thru_hole circle (at -6.35 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.VCC.str}) + (pad 21 smd custom (at -6.35 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.GND.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 4 smd custom (at -6.35 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.VCC.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 4 smd custom (at -6.35 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.VCC.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 21 smd custom (at -6.35 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.GND.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 20 thru_hole circle (at -3.81 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P2.str}) + (pad 5 thru_hole circle (at -3.81 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P21.str}) + (pad 20 smd custom (at -3.81 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P2.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 5 smd custom (at -3.81 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P21.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 5 smd custom (at -3.81 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P21.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 20 smd custom (at -3.81 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P2.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 19 thru_hole circle (at -1.27 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P3.str}) + (pad 6 thru_hole circle (at -1.27 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P20.str}) + (pad 19 smd custom (at -1.27 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P3.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 6 smd custom (at -1.27 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P20.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 6 smd custom (at -1.27 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P20.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 19 smd custom (at -1.27 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P3.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 18 thru_hole circle (at 1.27 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P4.str}) + (pad 7 thru_hole circle (at 1.27 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P19.str}) + (pad 18 smd custom (at 1.27 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P4.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 7 smd custom (at 1.27 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P19.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 7 smd custom (at 1.27 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P19.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 18 smd custom (at 1.27 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P4.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 17 thru_hole circle (at 3.81 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P5.str}) + (pad 8 thru_hole circle (at 3.81 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P18.str}) + (pad 17 smd custom (at 3.81 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P5.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 8 smd custom (at 3.81 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P18.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 8 smd custom (at 3.81 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P18.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 17 smd custom (at 3.81 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P5.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 16 thru_hole circle (at 6.35 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P6.str}) + (pad 9 thru_hole circle (at 6.35 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P15.str}) + (pad 16 smd custom (at 6.35 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P6.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 9 smd custom (at 6.35 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P15.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 9 smd custom (at 6.35 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P15.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 16 smd custom (at 6.35 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P6.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 15 thru_hole circle (at 8.89 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P7.str}) + (pad 10 thru_hole circle (at 8.89 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P14.str}) + (pad 15 smd custom (at 8.89 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P7.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 10 smd custom (at 8.89 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P14.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 10 smd custom (at 8.89 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P14.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 15 smd custom (at 8.89 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P7.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 14 thru_hole circle (at 11.43 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P8.str}) + (pad 11 thru_hole circle (at 11.43 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P16.str}) + (pad 14 smd custom (at 11.43 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P8.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 11 smd custom (at 11.43 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P16.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 11 smd custom (at 11.43 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P16.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 14 smd custom (at 11.43 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P8.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + (pad 13 thru_hole circle (at 13.97 0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P9.str}) + (pad 12 thru_hole circle (at 13.97 -0.762 ${p.rot + 180}) (size 0.8 0.8) (drill 0.4) (layers *.Cu) ${p.P10.str}) + (pad 13 smd custom (at 13.97 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers B.Cu) ${p.P9.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 12 smd custom (at 13.97 -0.762 ${p.rot}) (size 0.25 0.25) (layers B.Cu) ${p.P10.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end -0.766 0.766) (width 0.25)) + (gr_line (start -0.766 0.766) (end -0.766 4.822) (width 0.25)) + (gr_line (start -0.766 4.822) (end 0 5.588) (width 0.25)) + )) + (pad 12 smd custom (at 13.97 -0.762 ${p.rot}) (size 0.25 0.25) (layers F.Cu) ${p.P10.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.766 -0.766) (width 0.25)) + (gr_line (start 0.766 -0.766) (end 0.766 -3.298) (width 0.25)) + (gr_line (start 0.766 -3.298) (end 0 -4.064) (width 0.25)) + )) + (pad 13 smd custom (at 13.97 0.762 ${p.rot + 180}) (size 0.25 0.25) (layers F.Cu) ${p.P9.str} + (zone_connect 0) + (options (clearance outline) (anchor circle)) + (primitives + (gr_line (start 0 0) (end 0.762 -0.762) (width 0.25)) + (gr_line (start 0.762 -0.762) (end 0.762 -3.302) (width 0.25)) + (gr_line (start 0.762 -3.302) (end 0 -4.064) (width 0.25)) + )) + + ${''/* Outline of nice!nano */} + (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer F.Fab) (width 0.15)) + (fp_line (start -15.24 8.89) (end 15.24 8.89) (layer F.Fab) (width 0.15)) + (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer F.Fab) (width 0.15)) + (fp_line (start -17.78 8.89) (end -15.24 8.89) (layer F.Fab) (width 0.15)) + (fp_line (start -15.24 -8.89) (end -17.78 -8.89) (layer F.Fab) (width 0.15)) + (fp_line (start 15.24 -8.89) (end -15.24 -8.89) (layer F.Fab) (width 0.15)) + + (fp_line (start 15.24 8.89) (end 15.24 -8.89) (layer B.Fab) (width 0.15)) + (fp_line (start -15.24 8.89) (end 15.24 8.89) (layer B.Fab) (width 0.15)) + (fp_line (start -17.78 -8.89) (end -17.78 8.89) (layer B.Fab) (width 0.15)) + (fp_line (start -17.78 8.89) (end -15.24 8.89) (layer B.Fab) (width 0.15)) + (fp_line (start -15.24 -8.89) (end -17.78 -8.89) (layer B.Fab) (width 0.15)) + (fp_line (start 15.24 -8.89) (end -15.24 -8.89) (layer B.Fab) (width 0.15)) + + (fp_line (start -19.304 -3.556) (end -17.78 -3.556) (layer Dwgs.User) (width 0.15)) + (fp_line (start -17.78 3.81) (end -19.304 3.81) (layer Dwgs.User) (width 0.15)) + (fp_line (start -19.304 3.81) (end -19.304 -3.556) (layer Dwgs.User) (width 0.15)) + ${''/* Labels for pins */} + ${ p.show_labels ? pin_labels : ''} + ) + ` + } + } diff --git a/input/footprints/nice_view.js b/input/footprints/nice_view.js new file mode 100644 index 0000000..09def9e --- /dev/null +++ b/input/footprints/nice_view.js @@ -0,0 +1,236 @@ +module.exports = { + params: { + designator: 'DISP', + side: 'F', + reverse: false, + MOSI: {type: 'net', value: 'MOSI'}, + SCK: {type: 'net', value: 'SCK'}, + VCC: {type: 'net', value: 'VCC'}, + GND: {type: 'net', value: 'GND'}, + CS: {type: 'net', value: 'CS'}, + show_labels: {type: 'boolean', value: true}, + jumpers_at_bottom: false, + }, + body: p => { + + let dst_nets = [ + p.MOSI.str, + p.SCK.str, + p.VCC.str, + p.GND.str, + p.CS.str, + ]; + local_nets = [ + p.local_net("1").str, + p.local_net("2").str, + p.VCC.str, + p.local_net("4").str, + p.local_net("5").str, + ]; + + let socket_nets = dst_nets; + if(p.reverse) { + socket_nets = local_nets; + } else if(p.side == 'B') { + socket_nets = dst_nets.slice().reverse(); + } + + let jumpers_offset = 0; + let jumpers_rot = 0; + let labels_offset = 0; + let label_vcc_offset = 0; + + let jumpers_front_top = dst_nets; + let jumpers_front_bottom = local_nets; + let jumpers_back_top = dst_nets; + let jumpers_back_bottom = local_nets.slice().reverse(); + if(p.jumpers_at_bottom) { + jumpers_offset = 5.7; + jumpers_rot = 180; + labels_offset = jumpers_offset + 2 + 1 + 0.1; + label_vcc_offset = 4.85; + + jumpers_front_top = local_nets; + jumpers_front_bottom = dst_nets; + jumpers_back_top = local_nets.slice().reverse(); + jumpers_back_bottom = dst_nets; + } + + const top = ` + (module nice!view (layer F.Cu) (tedit 6448AF5B) + ${p.at /* parametric position */} + (attr virtual) + (fp_text reference "${p.ref}" (at 0 20 ${p.rot}) (layer ${p.side}.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + ` + const front = ` + (fp_line (start -6.5 -18) (end 6.5 -18) (layer F.Fab) (width 0.15)) + (fp_line (start 6.5 18) (end -6.5 18) (layer F.Fab) (width 0.15)) + (fp_line (start -7 17.5) (end -7 -17.5) (layer F.Fab) (width 0.15)) + (fp_line (start 7 17.5) (end 7 -17.5) (layer F.Fab) (width 0.15)) + (fp_line (start -6.41 15.37) (end -6.41 18.03) (layer F.SilkS) (width 0.12)) + (fp_line (start 6.41 18.03) (end -6.41 18.03) (layer F.SilkS) (width 0.12)) + (fp_line (start 6.88 14.9) (end 6.88 18.45) (layer F.CrtYd) (width 0.15)) + (fp_line (start 6.88 18.45) (end -6.82 18.45) (layer F.CrtYd) (width 0.15)) + (fp_line (start -6.82 18.45) (end -6.82 14.9) (layer F.CrtYd) (width 0.15)) + (fp_line (start -6.82 14.9) (end 6.88 14.9) (layer F.CrtYd) (width 0.15)) + (fp_line (start 6.41 15.37) (end 6.41 18.03) (layer F.SilkS) (width 0.12)) + (fp_line (start 6.41 15.37) (end -6.41 15.37) (layer F.SilkS) (width 0.12)) + (fp_arc (start -6.5 17.5) (end -7 17.5) (angle -90) (layer F.Fab) (width 0.15)) + (fp_arc (start 6.5 17.5) (end 6.5 18) (angle -90) (layer F.Fab) (width 0.15)) + (fp_arc (start 6.5 -17.5) (end 6.5 -18) (angle 90) (layer F.Fab) (width 0.15)) + (fp_arc (start -6.5 -17.5) (end -6.5 -18) (angle -90) (layer F.Fab) (width 0.15)) + (fp_text user %R (at 0 20 ${p.rot}) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + + ` + + const front_jumpers = ` + (fp_line (start 5.93 ${12.9 + jumpers_offset}) (end 5.93 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -5.93 ${14.9 + jumpers_offset}) (end -5.93 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -5.93 ${12.9 + jumpers_offset}) (end -4.23 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -4.23 ${14.9 + jumpers_offset}) (end -5.93 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -4.23 ${12.9 + jumpers_offset}) (end -4.23 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -3.39 ${14.9 + jumpers_offset}) (end -3.39 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -3.39 ${12.9 + jumpers_offset}) (end -1.69 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -1.69 ${14.9 + jumpers_offset}) (end -3.39 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start -1.69 ${12.9 + jumpers_offset}) (end -1.69 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 3.39 ${12.9 + jumpers_offset}) (end 3.39 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 3.39 ${14.9 + jumpers_offset}) (end 1.69 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 1.69 ${14.9 + jumpers_offset}) (end 1.69 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 1.69 ${12.9 + jumpers_offset}) (end 3.39 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 5.93 ${14.9 + jumpers_offset}) (end 4.23 ${14.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 4.23 ${14.9 + jumpers_offset}) (end 4.23 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + (fp_line (start 4.23 ${12.9 + jumpers_offset}) (end 5.93 ${12.9 + jumpers_offset}) (layer F.Fab) (width 0.15)) + + (pad 14 smd rect (at -5.08 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[0] }) + (pad 15 smd rect (at -2.54 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[1] }) + (pad 16 smd rect (at 2.54 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[3] }) + (pad 17 smd rect (at 5.08 ${13.45 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_top[4] }) + + (pad 10 smd rect (at -5.08 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[0] }) + (pad 11 smd rect (at -2.54 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[1] }) + (pad 12 smd rect (at 2.54 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[3] }) + (pad 13 smd rect (at 5.08 ${14.35 + jumpers_offset} ${90 + p.rot}) (size 0.6 1.2) (layers F.Cu F.Mask) ${ jumpers_front_bottom[4] }) + ` + + const back = ` + (fp_line (start 6.41 15.37) (end 6.41 18.03) (layer B.SilkS) (width 0.12)) + (fp_line (start 6.41 15.37) (end -6.41 15.37) (layer B.SilkS) (width 0.12)) + (fp_line (start 6.41 18.03) (end -6.41 18.03) (layer B.SilkS) (width 0.12)) + (fp_line (start 6.88 14.9) (end 6.88 18.45) (layer B.CrtYd) (width 0.15)) + (fp_line (start 6.88 18.45) (end -6.82 18.45) (layer B.CrtYd) (width 0.15)) + (fp_line (start -6.82 18.45) (end -6.82 14.9) (layer B.CrtYd) (width 0.15)) + (fp_line (start -6.82 14.9) (end 6.88 14.9) (layer B.CrtYd) (width 0.15)) + (fp_line (start -6.41 15.37) (end -6.41 18.03) (layer B.SilkS) (width 0.12)) + (fp_line (start -6.5 18) (end 6.5 18) (layer B.Fab) (width 0.15)) + (fp_line (start 7 -17.5) (end 7 17.5) (layer B.Fab) (width 0.15)) + (fp_line (start 6.5 -18) (end -6.5 -18) (layer B.Fab) (width 0.15)) + (fp_line (start -7 -17.5) (end -7 17.5) (layer B.Fab) (width 0.15)) + (fp_arc (start -6.5 -17.5) (end -7 -17.5) (angle 90) (layer B.Fab) (width 0.15)) + (fp_arc (start 6.5 -17.5) (end 6.5 -18) (angle 90) (layer B.Fab) (width 0.15)) + (fp_arc (start 6.5 17.5) (end 6.5 18) (angle -90) (layer B.Fab) (width 0.15)) + (fp_arc (start -6.5 17.5) (end -6.5 18) (angle 90) (layer B.Fab) (width 0.15)) + ` + + const back_jumpers = ` + (fp_line (start -5.93 ${12.9 + jumpers_offset}) (end -5.93 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -5.93 ${14.9 + jumpers_offset}) (end -4.23 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -4.23 ${12.9 + jumpers_offset}) (end -5.93 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -4.23 ${14.9 + jumpers_offset}) (end -4.23 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -3.39 ${14.9 + jumpers_offset}) (end -1.69 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -1.69 ${12.9 + jumpers_offset}) (end -3.39 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 4.23 ${14.9 + jumpers_offset}) (end 5.93 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 5.93 ${14.9 + jumpers_offset}) (end 5.93 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 3.39 ${12.9 + jumpers_offset}) (end 1.69 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -1.69 ${14.9 + jumpers_offset}) (end -1.69 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start -3.39 ${12.9 + jumpers_offset}) (end -3.39 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 1.69 ${12.9 + jumpers_offset}) (end 1.69 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 1.69 ${14.9 + jumpers_offset}) (end 3.39 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 3.39 ${14.9 + jumpers_offset}) (end 3.39 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 5.93 ${12.9 + jumpers_offset}) (end 4.23 ${12.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + (fp_line (start 4.23 ${12.9 + jumpers_offset}) (end 4.23 ${14.9 + jumpers_offset}) (layer B.Fab) (width 0.15)) + + (pad 24 smd rect (at 5.08 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[0] }) + (pad 25 smd rect (at 2.54 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[1] }) + (pad 26 smd rect (at -2.54 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[3] }) + (pad 27 smd rect (at -5.08 ${13.45 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_top[4] }) + + (pad 20 smd rect (at 5.08 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[0] }) + (pad 21 smd rect (at 2.54 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[1] }) + (pad 22 smd rect (at -2.54 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[3] }) + (pad 23 smd rect (at -5.08 ${14.35 + jumpers_offset} ${270 + p.rot}) (size 0.6 1.2) (layers B.Cu B.Mask) ${ jumpers_back_bottom[4] }) + ` + + const labels = ` + (fp_text user DA (at -5.08 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS) + (effects (font (size 1 0.7) (thickness 0.1))) + ) + (fp_text user CS (at 5.12 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS) + (effects (font (size 1 0.7) (thickness 0.1))) + ) + (fp_text user GND (at 2.62 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS) + (effects (font (size 1 0.7) (thickness 0.1))) + ) + (fp_text user VCC (at 0.15 ${14.4 + label_vcc_offset} ${p.rot}) (layer F.SilkS) + (effects (font (size 1 0.7) (thickness 0.1))) + ) + (fp_text user CL (at -2.48 ${12.5 + labels_offset} ${p.rot}) (layer F.SilkS) + (effects (font (size 1 0.7) (thickness 0.1))) + ) + (fp_text user CS (at -4.98 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS) + (effects (font (size 1 0.7) (thickness 0.1)) (justify mirror)) + ) + (fp_text user VCC (at 0.15 ${14.4 + label_vcc_offset} ${p.rot}) (layer B.SilkS) + (effects (font (size 1 0.7) (thickness 0.1)) (justify mirror)) + ) + (fp_text user DA (at 5.22 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS) + (effects (font (size 1 0.7) (thickness 0.1)) (justify mirror)) + ) + (fp_text user CL (at 2.72 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS) + (effects (font (size 1 0.7) (thickness 0.1)) (justify mirror)) + ) + (fp_text user GND (at -2.38 ${12.5 + labels_offset} ${p.rot}) (layer B.SilkS) + (effects (font (size 1 0.7) (thickness 0.1)) (justify mirror)) + ) + ` + + const bottom = ` + (pad 1 thru_hole oval (at -5.08 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[0] }) + (pad 2 thru_hole oval (at -2.54 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[1] }) + (pad 3 thru_hole oval (at 0 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[2] }) + (pad 4 thru_hole oval (at 2.54 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[3] }) + (pad 5 thru_hole circle (at 5.08 16.7 ${270 + p.rot}) (size 1.7 1.7) (drill 1) (layers *.Cu *.Mask) ${ socket_nets[4] }) + + (fp_line (start 5.4 13.4) (end 5.4 -11.9) (layer Dwgs.User) (width 0.15)) + (fp_line (start -5.4 13.4) (end -5.4 -11.9) (layer Dwgs.User) (width 0.15)) + (fp_line (start 5.4 -11.9) (end -5.4 -11.9) (layer Dwgs.User) (width 0.15)) + (fp_line (start -5.4 13.4) (end 5.4 13.4) (layer Dwgs.User) (width 0.15)) + ) + ` + + let final = top; + + if(p.side == "F" || p.reverse) { + final += front; + } + if(p.side == "B" || p.reverse) { + final += back; + } + + if(p.reverse) { + final += front_jumpers; + final += back_jumpers; + + if(p.show_labels) { + final += labels; + } + } + + final += bottom; + + return final; + } +} \ No newline at end of file diff --git a/input/footprints/pads.js b/input/footprints/pads.js new file mode 100644 index 0000000..0385915 --- /dev/null +++ b/input/footprints/pads.js @@ -0,0 +1,175 @@ +module.exports = { + params: { + designator: 'PAD', + side: 'F', + reverse: true, + width: 1.25, + height: 2.5, + space: 2, + mirror: true, + pads: 2, + net_1: {type: 'net', value: 'PAD_1'}, + net_2: {type: 'net', value: 'PAD_2'}, + net_3: {type: 'net', value: 'PAD_3'}, + net_4: {type: 'net', value: 'PAD_4'}, + net_5: {type: 'net', value: 'PAD_5'}, + net_6: {type: 'net', value: 'PAD_5'}, + label_1: '', + label_2: '', + label_3: '', + label_4: '', + label_5: '', + label_6: '', + label_at_bottom: false, + }, + body: p => { + + const gen_nets = (p) => { + const all_nets = [ + p.net_1.str, p.net_2.str, p.net_3.str, + p.net_4.str, p.net_5.str, p.net_6.str, + ]; + const all_labels = [ + p.label_1, p.label_2, p.label_3, + p.label_4, p.label_5, p.label_6, + ]; + + pad_cnt = p.pads; + if(pad_cnt > all_nets.length || pad_cnt > all_labels.length) { + pad_cnt = Math.min(all_nets.length, all_labels.length); + } + + let nets = []; + for(let i = 0; i < pad_cnt; i++) { + let net = [ + all_nets[i], + all_labels[i], + ]; + nets.push(net); + } + + return nets; + } + + const gen_pad = (pad_idx, pad_cnt, net_str, net_label, width, height, space, rot, layer, label_at_bottom) => + { + // Calculate the pad position from center + const pos_x_raw = (width + space) * pad_idx; + + // Adjust it so that the pads are centered in the middle + const pos_x = ( + pos_x_raw - (width + space) * (pad_cnt - 1) / 2 + ); + + let label_pos_y = -1 * (height / 2 + 0.2); + let label_justify_direction = "left"; + if(label_at_bottom) { + label_pos_y = label_pos_y * -1; + label_justify_direction = "right"; + } + + if(label_at_bottom == false || layer == 'B') { + if((rot > 0 && rot <= 180) || (rot <= -180)) { + label_justify_direction = "right"; + } else { + label_justify_direction = "left"; + } + } else { + if((rot > 0 && rot <= 180) || (rot <= -180)) { + label_justify_direction = "left"; + } else { + label_justify_direction = "right"; + } + } + + let justify_mirror = ''; + if(layer == 'B') { + justify_mirror = 'mirror' + } + + let label_justify = ''; + if(justify_mirror != '' || label_justify_direction != '') { + label_justify = `(justify ${label_justify_direction} ${justify_mirror})`; + } + + let pad = ` + (pad ${pad_idx + 1} smd rect (at ${pos_x} 0 ${rot}) (size ${width} ${height}) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) ${net_str}) + ` + + if(net_label) { + pad += ` + (fp_text user "${net_label}" (at ${pos_x} ${label_pos_y} ${90 + rot}) (layer ${layer}.SilkS) + (effects (font (size 1 1) (thickness 0.1)) ${label_justify}) + ) + ` + } + + return pad; + } + + const gen_pads = (nets, width, height, space, rot, layer, label_at_bottom, mirror) => { + + if(mirror) { + nets = nets.slice().reverse(); + } + + let pads = ''; + for (let [net_idx, net] of nets.entries()) { + + const net_str = net[0]; + const net_label = net[1]; + + const pad = gen_pad( + net_idx, + nets.length, + net_str, + net_label, + width, + height, + space, + rot, + layer, + label_at_bottom, + ); + + pads += pad; + } + + return pads; + } + + const nets = gen_nets(p); + + let pads_front = ''; + if(p.side == 'F' || p.reverse) { + pads_front = gen_pads( + nets, + p.width, p.height, p.space, p.rot, "F", + p.label_at_bottom, false, + ); + } + + let pads_back = ''; + if(p.side == 'B' || p.reverse) { + pads_back = gen_pads( + nets, + p.width, p.height, p.space, p.rot, "B", + p.label_at_bottom, p.mirror, + ); + } + const fp = ` + (module pads (layer F.Cu) (tedit 6446BF3D) + ${p.at /* parametric position */} + (attr smd) + + (fp_text reference "${p.ref}" (at 0 2.2) (layer F.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + ${pads_front} + ${pads_back} + ) + ` + + return fp; + } +} diff --git a/input/footprints/smd_0805.js b/input/footprints/smd_0805.js new file mode 100644 index 0000000..91644cb --- /dev/null +++ b/input/footprints/smd_0805.js @@ -0,0 +1,220 @@ +module.exports = { + params: { + designator: 'SMD', + side: 'F', + reverse: true, + space: 2, + mirror: true, + swap_pad_direction: false, + components: 2, + net_1_from: {type: 'net', value: 'SMD_1_F'}, + net_1_to: {type: 'net', value: 'SMD_1_T'}, + net_2_from: {type: 'net', value: 'SMD_2_F'}, + net_2_to: {type: 'net', value: 'SMD_2_T'}, + net_3_from: {type: 'net', value: 'SMD_3_F'}, + net_3_to: {type: 'net', value: 'SMD_3_T'}, + net_4_from: {type: 'net', value: 'SMD_4_F'}, + net_4_to: {type: 'net', value: 'SMD_4_T'}, + net_5_from: {type: 'net', value: 'SMD_5_F'}, + net_5_to: {type: 'net', value: 'SMD_5_T'}, + net_6_from: {type: 'net', value: 'SMD_6_F'}, + net_6_to: {type: 'net', value: 'SMD_6_T'}, + label_1: '', + label_2: '', + label_3: '', + label_4: '', + label_5: '', + label_6: '', + label_at_bottom: false, + }, + body: p => { + + const gen_nets = (p) => { + const all_nets_from = [ + p.net_1_from.str, p.net_2_from.str, p.net_3_from.str, + p.net_4_from.str, p.net_5_from.str, p.net_6_from.str, + ]; + const all_nets_to = [ + p.net_1_to.str, p.net_2_to.str, p.net_3_to.str, + p.net_4_to.str, p.net_5_to.str, p.net_6_to.str, + ]; + const all_labels = [ + p.label_1, p.label_2, p.label_3, + p.label_4, p.label_5, p.label_6, + ]; + + pad_cnt = p.components; + if(pad_cnt > all_nets_from.length || pad_cnt > all_nets_to.length || + pad_cnt > all_labels.length) { + pad_cnt = Math.min( + all_nets_from.length, all_nets_to.length, all_labels.length + ); + } + + let nets = []; + for(let i = 0; i < pad_cnt; i++) { + let net = [ + all_nets_from[i], + all_nets_to[i], + all_labels[i], + ]; + nets.push(net); + } + + return nets; + } + + const gen_pad = (pad_idx, pad_cnt, net_from, net_to, net_label, space, rot, layer, label_at_bottom) => + { + const width = 1.025; + const height= 3.36; + + // Calculate the pad position from center + const pos_x_raw = (width + space) * pad_idx; + + // Adjust it so that the pads are centered in the middle + const pos_x = ( + pos_x_raw - (width + space) * (pad_cnt - 1) / 2 + ); + + let label_pos_y = -1 * (height / 2 + 0.2); + let label_justify_direction = "left"; + if(label_at_bottom) { + label_pos_y = label_pos_y * -1; + label_justify_direction = "right"; + } + + if(label_at_bottom == false || layer == 'B') { + if((rot > 0 && rot <= 180) || (rot <= -180)) { + label_justify_direction = "right"; + } else { + label_justify_direction = "left"; + } + } else { + if((rot > 0 && rot <= 180) || (rot <= -180)) { + label_justify_direction = "left"; + } else { + label_justify_direction = "right"; + } + } + + let justify_mirror = ''; + if(layer == 'B') { + justify_mirror = 'mirror' + } + + let label_justify = ''; + if(justify_mirror != '' || label_justify_direction != '') { + label_justify = `(justify ${label_justify_direction} ${justify_mirror})`; + } + + let label_fab_justify = ''; + if(justify_mirror) { + label_fab_justify = `(justify ${justify_mirror})`; + } + + const pad_num = pad_idx*2+1; + let pad = ` + (fp_line (start ${0.625 + pos_x} -1) (end ${0.625 + pos_x} 1) (layer ${layer}.Fab) (width 0.1)) + (fp_line (start ${-0.625 + pos_x} -1) (end ${0.625 + pos_x} -1) (layer ${layer}.Fab) (width 0.1)) + (fp_line (start ${-0.625 + pos_x} 1) (end ${-0.625 + pos_x} -1) (layer ${layer}.Fab) (width 0.1)) + (fp_line (start ${0.625 + pos_x} 1) (end ${-0.625 + pos_x} 1) (layer ${layer}.Fab) (width 0.1)) + + (fp_line (start ${0.95 + pos_x} -1.68) (end ${0.95 + pos_x} 1.68) (layer ${layer}.CrtYd) (width 0.05)) + (fp_line (start ${-0.95 + pos_x} -1.68) (end ${0.95 + pos_x} -1.68) (layer ${layer}.CrtYd) (width 0.05)) + (fp_line (start ${-0.95 + pos_x} 1.68) (end ${-0.95 + pos_x} -1.68) (layer ${layer}.CrtYd) (width 0.05)) + (fp_line (start ${0.95 + pos_x} 1.68) (end ${-0.95 + pos_x} 1.68) (layer ${layer}.CrtYd) (width 0.05)) + + (fp_line (start ${0.735 + pos_x} 0.227064) (end ${0.735 + pos_x} -0.227064) (layer ${layer}.SilkS) (width 0.12)) + (fp_line (start ${-0.735 + pos_x} 0.227064) (end ${-0.735 + pos_x} -0.227064) (layer ${layer}.SilkS) (width 0.12)) + + (pad ${pad_num} smd roundrect (at ${0 + pos_x} 0.9125 ${90 + rot}) (size 1.025 1.4) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) (roundrect_rratio 0.243902) ${net_from}) + (pad ${pad_num + 1} smd roundrect (at ${0 + pos_x} -0.9125 ${90 + rot}) (size 1.025 1.4) (layers ${layer}.Cu ${layer}.Paste ${layer}.Mask) (roundrect_rratio 0.243902) ${net_to}) + ` + + if(net_label) { + pad += ` + (fp_text user "${net_label}" (at ${0 + pos_x} 0 ${90 + rot}) (layer ${layer}.Fab) + (effects (font (size 0.5 0.5) (thickness 0.08)) ${label_fab_justify}) + ) + (fp_text user "${net_label}" (at ${pos_x} ${label_pos_y} ${90 + rot}) (layer ${layer}.SilkS) + (effects (font (size 1 1) (thickness 0.1)) ${label_justify}) + ) + ` + } + + return pad; + } + + const gen_pads = (nets, space, rot, layer, label_at_bottom, mirror, swap_pad_direction) => { + + if(mirror) { + nets = nets.slice().reverse(); + } + + let pads = ''; + for (let [net_idx, net] of nets.entries()) { + + let net_from = net[0]; + let net_to = net[1]; + const net_label = net[2]; + + if(swap_pad_direction) { + net_from = net[1]; + net_to = net[0]; + } + + const pad = gen_pad( + net_idx, + nets.length, + net_from, + net_to, + net_label, + space, + rot, + layer, + label_at_bottom, + swap_pad_direction, + ); + + pads += pad; + } + + return pads; + } + + const nets = gen_nets(p); + + let pads_front = ''; + if(p.side == 'F' || p.reverse) { + pads_front = gen_pads( + nets, + p.space, p.rot, "F", + p.label_at_bottom, false, p.swap_pad_direction, + ); + } + + let pads_back = ''; + if(p.side == 'B' || p.reverse) { + pads_back = gen_pads( + nets, + p.space, p.rot, "B", + p.label_at_bottom, p.mirror, p.swap_pad_direction, + ); + } + const fp = ` + (module smd_805 (layer F.Cu) (tedit 6446BF3D) + ${p.at /* parametric position */} + (attr smd) + + (fp_text reference "${p.ref}" (at 0 3) (layer F.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + ${pads_front} + ${pads_back} + ) + ` + + return fp; + } +} diff --git a/input/footprints/switch_power.js b/input/footprints/switch_power.js new file mode 100644 index 0000000..d48eea3 --- /dev/null +++ b/input/footprints/switch_power.js @@ -0,0 +1,116 @@ +// Should be compatible with: +// - G-Switch MK-12C02-G015 +// - Alps SSSS811101 +// - PCM12SMTR + +module.exports = { + params: { + designator: 'SW', + side: 'F', + from: {type: 'net', value: 'BAT_P'}, + to: {type: 'net', value: 'RAW'}, + reverse: false, + }, + body: p => { + const shared_1 = ` + (module power_switch (layer F.Cu) (tedit 644556E6) + ${p.at /* parametric position */} + (attr smd) + + `; + + const front_switch = ` + (fp_text reference "${p.ref}" (at -3.6 0 ${-90 + p.rot}) (layer F.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + + (fp_line (start 0.415 -3.45) (end -0.375 -3.45) (layer F.SilkS) (width 0.12)) + (fp_line (start -0.375 3.45) (end 0.415 3.45) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.425 1.6) (end -1.425 -0.1) (layer F.SilkS) (width 0.12)) + (fp_line (start 1.425 2.85) (end 1.425 -2.85) (layer F.SilkS) (width 0.12)) + (fp_line (start 1.795 4.4) (end -2.755 4.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.795 1.65) (end 1.795 4.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.095 1.65) (end 1.795 1.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.095 -1.65) (end 3.095 1.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.795 -1.65) (end 3.095 -1.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.795 -4.4) (end 1.795 -1.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.755 -4.4) (end 1.795 -4.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.755 4.4) (end -2.755 -4.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.425 -1.4) (end -1.425 -1.6) (layer F.SilkS) (width 0.12)) + (fp_line (start -1.305 -3.35) (end -1.305 3.35) (layer F.Fab) (width 0.1)) + (fp_line (start 1.295 -3.35) (end -1.305 -3.35) (layer F.Fab) (width 0.1)) + (fp_line (start 1.295 3.35) (end 1.295 -3.35) (layer F.Fab) (width 0.1)) + (fp_line (start -1.305 3.35) (end 1.295 3.35) (layer F.Fab) (width 0.1)) + (fp_line (start 2.595 0.1) (end 1.295 0.1) (layer F.Fab) (width 0.1)) + (fp_line (start 2.645 0.15) (end 2.595 0.1) (layer F.Fab) (width 0.1)) + (fp_line (start 2.845 0.35) (end 2.645 0.15) (layer F.Fab) (width 0.1)) + (fp_line (start 2.845 1.2) (end 2.845 0.35) (layer F.Fab) (width 0.1)) + (fp_line (start 2.645 1.4) (end 2.845 1.2) (layer F.Fab) (width 0.1)) + (fp_line (start 1.345 1.4) (end 2.645 1.4) (layer F.Fab) (width 0.1)) + + (pad "" smd rect (at 1.125 -3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask)) + (pad "" smd rect (at -1.085 -3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask)) + (pad "" smd rect (at -1.085 3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask)) + (pad 1 smd rect (at -1.735 2.25 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -1.735 -0.75 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask) ${p.from.str}) + (pad 3 smd rect (at -1.735 -2.25 ${90 + p.rot}) (size 0.7 1.5) (layers F.Cu F.Paste F.Mask) ${p.to.str}) + (pad "" smd rect (at 1.125 3.65 ${90 + p.rot}) (size 1 0.8) (layers F.Cu F.Paste F.Mask)) + + ` + const back_switch = ` + ${'' /* Add the optional parts here */} + (fp_text user "${p.ref}" (at -3.5 0 ${90 + p.rot}) (layer B.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start 2.595 -0.1) (end 1.295 -0.1) (layer B.Fab) (width 0.1)) + (fp_line (start -1.305 3.35) (end -1.305 -3.35) (layer B.Fab) (width 0.1)) + (fp_line (start 2.645 -0.15) (end 2.595 -0.1) (layer B.Fab) (width 0.1)) + (fp_line (start -1.425 1.4) (end -1.425 1.6) (layer B.SilkS) (width 0.12)) + (fp_line (start 0.415 3.45) (end -0.375 3.45) (layer B.SilkS) (width 0.12)) + (fp_line (start -0.375 -3.45) (end 0.415 -3.45) (layer B.SilkS) (width 0.12)) + (fp_line (start -1.425 -1.6) (end -1.425 0.1) (layer B.SilkS) (width 0.12)) + (fp_line (start 1.425 -2.85) (end 1.425 2.85) (layer B.SilkS) (width 0.12)) + (fp_line (start 1.795 4.4) (end 1.795 1.65) (layer B.CrtYd) (width 0.05)) + (fp_line (start -2.755 4.4) (end 1.795 4.4) (layer B.CrtYd) (width 0.05)) + (fp_line (start 2.845 -1.2) (end 2.845 -0.35) (layer B.Fab) (width 0.1)) + (fp_line (start 1.345 -1.4) (end 2.645 -1.4) (layer B.Fab) (width 0.1)) + (fp_line (start 1.795 -4.4) (end -2.755 -4.4) (layer B.CrtYd) (width 0.05)) + (fp_line (start 1.795 -1.65) (end 1.795 -4.4) (layer B.CrtYd) (width 0.05)) + (fp_line (start 3.095 -1.65) (end 1.795 -1.65) (layer B.CrtYd) (width 0.05)) + (fp_line (start 2.845 -0.35) (end 2.645 -0.15) (layer B.Fab) (width 0.1)) + (fp_line (start 2.645 -1.4) (end 2.845 -1.2) (layer B.Fab) (width 0.1)) + (fp_line (start 1.295 -3.35) (end 1.295 3.35) (layer B.Fab) (width 0.1)) + (fp_line (start 1.295 3.35) (end -1.305 3.35) (layer B.Fab) (width 0.1)) + (fp_line (start -1.305 -3.35) (end 1.295 -3.35) (layer B.Fab) (width 0.1)) + (fp_line (start -2.755 -4.4) (end -2.755 4.4) (layer B.CrtYd) (width 0.05)) + (fp_line (start 3.095 1.65) (end 3.095 -1.65) (layer B.CrtYd) (width 0.05)) + (fp_line (start 1.795 1.65) (end 3.095 1.65) (layer B.CrtYd) (width 0.05)) + (pad "" smd rect (at -1.085 -3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask)) + (pad "" smd rect (at 1.125 -3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask)) + (pad 4 smd rect (at -1.735 2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask)) + (pad "" smd rect (at -1.085 3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask)) + (pad 5 smd rect (at -1.735 0.75 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.from.str}) + (pad 6 smd rect (at -1.735 -2.25 ${270 + p.rot}) (size 0.7 1.5) (layers B.Cu B.Paste B.Mask) ${p.to.str}) + (pad "" smd rect (at 1.125 3.65 ${270 + p.rot}) (size 1 0.8) (layers B.Cu B.Paste B.Mask)) + ` + + const shared_2 = ` + (pad "" np_thru_hole circle (at 0.025 -1.5 ${90 + p.rot}) (size 0.9 0.9) (drill 0.9) (layers *.Cu *.Mask)) + (pad "" np_thru_hole circle (at 0.025 1.5 ${90 + p.rot}) (size 0.9 0.9) (drill 0.9) (layers *.Cu *.Mask)) + ) + ` + + let final = shared_1; + + if(p.side == "F" || p.reverse) { + final += front_switch; + } + if(p.side == "B" || p.reverse) { + final += back_switch; + } + + final += shared_2; + + return final; + } + } \ No newline at end of file diff --git a/input/footprints/switch_reset.js b/input/footprints/switch_reset.js new file mode 100644 index 0000000..0ef93bf --- /dev/null +++ b/input/footprints/switch_reset.js @@ -0,0 +1,90 @@ +// Compatible with +// EVQ-P7A01P +module.exports = { + params: { + designator: 'SW', + side: 'F', + reverse: false, + from: {type: 'net', value: 'GND'}, + to: {type: 'net', value: 'RST'}, + }, + body: p => { + const top = ` + (module sw_reset_side (layer F.Cu) (tedit 64473C6F) + ${p.at /* parametric position */} + (attr smd) + + (fp_text reference "${p.ref}" (at 0 3.5 ${p.rot}) (layer ${p.side}.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15))) + ) + ` + const front = ` + (fp_line (start 1.7 2.75) (end -1.7 2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.7 2.75) (end -1.7 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.1 0.85) (end 2.1 -0.85) (layer F.Fab) (width 0.1)) + (fp_line (start 1.7 -1.1) (end 2.35 -1.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.7 -2.75) (end 1.7 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -1.75) (end 1.45 1.75) (layer F.Fab) (width 0.1)) + (fp_line (start 1.7 1.1) (end 1.7 2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.35 1.1) (end 1.7 1.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.7 -2.75) (end 1.7 -1.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.55 -1.75) (end 1.55 1.75) (layer F.SilkS) (width 0.12)) + (fp_line (start 2.1 -0.85) (end 1.45 -0.85) (layer F.Fab) (width 0.1)) + (fp_line (start 2.35 -1.1) (end 2.35 1.1) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.1 0.85) (end 1.45 0.85) (layer F.Fab) (width 0.1)) + (fp_line (start -1.55 1.75) (end -1.55 -1.75) (layer F.SilkS) (width 0.12)) + (fp_line (start 1.45 1.75) (end -1.4 1.75) (layer F.Fab) (width 0.1)) + (fp_line (start -1.45 1.75) (end -1.45 -1.75) (layer F.Fab) (width 0.1)) + (fp_line (start -1.45 -1.75) (end 1.45 -1.75) (layer F.Fab) (width 0.1)) + + (pad 1 smd rect (at -0.72 -1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.from.str}) + + (pad 1 smd rect (at -0.72 1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.from.str}) + (pad 2 smd rect (at 0.72 -1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.to.str}) + (pad 2 smd rect (at 0.72 1.8 ${90 + p.rot}) (size 1.4 1.05) (layers F.Cu F.Paste F.Mask) ${p.to.str}) + ` + const back = ` + (fp_line (start -1.45 1.75) (end 1.45 1.75) (layer B.Fab) (width 0.1)) + (fp_line (start 1.45 1.75) (end 1.45 -1.75) (layer B.Fab) (width 0.1)) + (fp_line (start 1.7 -1.1) (end 1.7 -2.75) (layer B.CrtYd) (width 0.05)) + (fp_line (start 2.35 -1.1) (end 1.7 -1.1) (layer B.CrtYd) (width 0.05)) + (fp_line (start 1.7 2.75) (end 1.7 1.1) (layer B.CrtYd) (width 0.05)) + (fp_line (start 1.55 1.75) (end 1.55 -1.75) (layer B.SilkS) (width 0.12)) + (fp_line (start 2.1 0.85) (end 1.45 0.85) (layer B.Fab) (width 0.1)) + (fp_line (start 2.35 1.1) (end 2.35 -1.1) (layer B.CrtYd) (width 0.05)) + (fp_line (start 2.1 -0.85) (end 1.45 -0.85) (layer B.Fab) (width 0.1)) + (fp_line (start -1.55 -1.75) (end -1.55 1.75) (layer B.SilkS) (width 0.12)) + (fp_line (start 1.45 -1.75) (end -1.4 -1.75) (layer B.Fab) (width 0.1)) + (fp_line (start -1.45 -1.75) (end -1.45 1.75) (layer B.Fab) (width 0.1)) + (fp_line (start 1.7 -2.75) (end -1.7 -2.75) (layer B.CrtYd) (width 0.05)) + (fp_line (start -1.7 -2.75) (end -1.7 2.75) (layer B.CrtYd) (width 0.05)) + (fp_line (start 2.1 -0.85) (end 2.1 0.85) (layer B.Fab) (width 0.1)) + (fp_line (start 1.7 1.1) (end 2.35 1.1) (layer B.CrtYd) (width 0.05)) + (fp_line (start -1.7 2.75) (end 1.7 2.75) (layer B.CrtYd) (width 0.05)) + (pad 1 smd rect (at -0.72 -1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.from.str}) + (pad 2 smd rect (at 0.72 1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.to.str}) + (pad 2 smd rect (at 0.72 -1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.to.str}) + (pad 1 smd rect (at -0.72 1.8 ${270 + p.rot}) (size 1.4 1.05) (layers B.Cu B.Paste B.Mask) ${p.from.str}) + (fp_text user ${p.ref} (at 0 3.5 ${p.rot}) (layer B.SilkS) ${p.ref_hide} + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + ` + + const bottom = ` + ) + ` + + let final = top; + + if(p.side == "F" || p.reverse) { + final += front; + } + if(p.side == "B" || p.reverse) { + final += back; + } + + final += bottom; + + return final; + } + } diff --git a/input/footprints/text.js b/input/footprints/text.js new file mode 100644 index 0000000..4a0df38 --- /dev/null +++ b/input/footprints/text.js @@ -0,0 +1,44 @@ +module.exports = { + params: { + designator: 'TXT', + side: 'F', + reverse: false, + text: 'Awesomeness', + }, + body: p => { + const top = ` + (module text (layer F.Cu) (tedit 6449CD11) + ${p.at /* parametric position */} + (attr virtual) + + `; + + const front = ` + (fp_text user "${p.text}" (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + ` + const back = ` + (fp_text user "${p.text}" (at 0 0) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + ` + + const bottom = ` + ) + ` + + let final = top; + + if(p.side == "F" || p.reverse) { + final += front; + } + if(p.side == "B" || p.reverse) { + final += back; + } + + final += bottom; + + return final; + } +} diff --git a/package-lock.json b/package-lock.json index 58a3073..55d060b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { - "name": "samoklava", + "name": "typematrix_split_ergogen", "lockfileVersion": 2, "requires": true, "packages": { "": { "dependencies": { - "ergogen": "github:soundmonster/ergogen#samoklava" + "ergogen": "github:ergogen/ergogen" } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -24,163 +24,6 @@ "resolved": "https://registry.npmjs.org/@danmarshall/jscad-typings/-/jscad-typings-1.0.0.tgz", "integrity": "sha512-MGGIGDItK2UQSsz7yTrXErQXDAFXR3UPxyQ7WZ5RHOwnv60CBXjmkJlXYMYPkSvo+7fUuQL2/ODcvECtc/fi9g==" }, - "node_modules/@jscad/csg": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.6.tgz", - "integrity": "sha512-GoUXhTwO0L+Cxba8VfFFLGm+ECd0xZKoIAPpeUYsDiCVsIZ6XK+3GLgBgn5waeumQNh+H6WsHjMMRKXBrDBreA==", - "deprecated": "See @jscad/modeling" - }, - "node_modules/@jscad/dxf-serializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/dxf-serializer/-/dxf-serializer-0.0.4.tgz", - "integrity": "sha512-/d3192aL8WAWX7KU5MRc61y7n9ZIzPik/F+d+rCtb7uxMmhzt7j5mcno4CDwSrfeIrzK8U+8Pyrdq13QkHOaLA==" - }, - "node_modules/@jscad/gcode-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/gcode-deserializer/-/gcode-deserializer-0.0.4.tgz", - "integrity": "sha512-RielAllRKm2oz+lG0On0aOeB2+qI7/lbzc/kQPzcBeObnqyuJKyHMVeFHDQ18o9Zjyrkv4g2QA6FDcVTbrmr0Q==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." - }, - "node_modules/@jscad/io": { - "version": "0.3.7", - "resolved": "git+ssh://git@github.com/ergogen/oldjscadio.git#692cf142062208b0097b2d4852c30d6cc51eea8d", - "license": "MIT", - "dependencies": { - "@jscad/dxf-serializer": "^0.0.4", - "@jscad/gcode-deserializer": "^0.0.4", - "@jscad/io-utils": "^0.1.2", - "@jscad/json-deserializer": "^0.0.4", - "@jscad/json-serializer": "^0.0.5", - "@jscad/obj-deserializer": "^0.0.4", - "@jscad/stl-deserializer": "^0.1.2", - "@jscad/stl-serializer": "^0.0.6", - "@jscad/svg-deserializer": "^0.2.3", - "@jscad/svg-serializer": "^0.0.4" - } - }, - "node_modules/@jscad/io-utils": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@jscad/io-utils/-/io-utils-0.1.3.tgz", - "integrity": "sha512-aCVUZovewI4njtEJ1fvjhasqd8EHIzQaPb88MtFWf/ff1NdGOu/vRH3yGG8vu0NZektGEDCKp028g2nTBL7aFg==" - }, - "node_modules/@jscad/json-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/json-deserializer/-/json-deserializer-0.0.4.tgz", - "integrity": "sha512-Z0lm1kTrJzA6Irv+TQmX4q2MWl97rLU2H9LDdC5y9utsO1J47Krllta2DJECWj7KfYcbf/je3kRZ2CQ7dHvaBA==", - "dependencies": { - "@jscad/csg": "0.3.6" - } - }, - "node_modules/@jscad/json-serializer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@jscad/json-serializer/-/json-serializer-0.0.5.tgz", - "integrity": "sha512-xQCBwjyRuEXolIRiCIZEf7k/FDERFTzyt1amY12u4ZWULY4QWU4d4fY5KaSkaZkBdkXE/leh0AylR0Q6mUwBKA==", - "dependencies": { - "@jscad/csg": "0.3.6", - "@jscad/io-utils": "^0.1.2" - } - }, - "node_modules/@jscad/obj-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/obj-deserializer/-/obj-deserializer-0.0.4.tgz", - "integrity": "sha512-uD57ahy1DfW9siy/nbwA4hAO5nE/gt/ZJoTbUfso3DnfwwqUbM42lw/AYAcFYw8Ab2U2GybDulKTPT3lr+eJdA==" - }, - "node_modules/@jscad/openjscad": { - "version": "1.6.1", - "resolved": "git+ssh://git@github.com/ergogen/oldjscad.git#040637f3d8d4da0ad0a9ffdfe1a33a791c8008f4", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@jscad/csg": "0.3.6", - "@jscad/io": "github:ergogen/oldjscadio", - "@jscad/openscad-openjscad-translator": "0.0.10", - "@jscad/scad-api": "^0.5.1", - "astring": "^1.0.2", - "brace": "0.10.0", - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "most-gestures": "^0.3.0", - "webworkify": "^1.4.0" - }, - "bin": { - "openjscad": "src/cli/cli.js" - } - }, - "node_modules/@jscad/openscad-openjscad-translator": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@jscad/openscad-openjscad-translator/-/openscad-openjscad-translator-0.0.10.tgz", - "integrity": "sha512-gw4iD8qVDm7Qb0PFYuwP4yYMU90wOQ0992WBLwqQSaLdKET0c2UlVJUu1jM5GUzxVEyJwm2ZbS1/c+JwOdTc6Q==", - "deprecated": "See @jscad/scad-deserializer", - "dependencies": { - "lodash": "^4.17.4", - "sylvester": "github:kaosat-dev/node-sylvester" - } - }, - "node_modules/@jscad/scad-api": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@jscad/scad-api/-/scad-api-0.5.1.tgz", - "integrity": "sha512-1BlfqcAf0xIicbaKU1bCOxHh0+aHJ7fBRY6r+7/e+0uMrfoqHoULGqkAZCwnftt0cPj5uAP8JSlyOinHKaFIJw==", - "deprecated": "See @jscad/modeling", - "dependencies": { - "@jscad/csg": "0.3.7" - } - }, - "node_modules/@jscad/scad-api/node_modules/@jscad/csg": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.7.tgz", - "integrity": "sha512-CuqKgXEZDH1FzbwQTdMWQ0FiEGi+LrP32tP6nW6rdWEEBjL6w19F3OrShD7SP8mK9IcqiuhgN9JcbWaiBswWlQ==", - "deprecated": "See @jscad/modeling" - }, - "node_modules/@jscad/stl-deserializer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@jscad/stl-deserializer/-/stl-deserializer-0.1.2.tgz", - "integrity": "sha512-2HpFv0G0TfV1v2psHvnx/PAOZ7iYmqp0REnOT/pQ9T5LRkdHrI1uvgzT4VHp9lOdK6vD5jO9uwRyj8dFWQhLYw==", - "dependencies": { - "@jscad/csg": "0.3.6", - "@jscad/io-utils": "^0.1.2" - } - }, - "node_modules/@jscad/stl-serializer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@jscad/stl-serializer/-/stl-serializer-0.0.6.tgz", - "integrity": "sha512-yf47E+rCtE3sdoMIIVeOGmB/gaQzrgN2JhFsYa4pEVcbh7RnUJauegFyacbGIEAxAYC8Ck7f5DU0mc/JbIjFhQ==", - "dependencies": { - "@jscad/io-utils": "^0.1.2" - } - }, - "node_modules/@jscad/svg-deserializer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@jscad/svg-deserializer/-/svg-deserializer-0.2.3.tgz", - "integrity": "sha512-i/LVaOCKkn5CdncoQFUhq9HPZOd9diupknlDBRmllLiuP2zzZLowz7a3mxF1hkVkwOx45WD02JPPkKUSBzz6tQ==", - "dependencies": { - "@jscad/csg": "0.3.6", - "sax": "1.2.4" - } - }, - "node_modules/@jscad/svg-serializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/svg-serializer/-/svg-serializer-0.0.4.tgz", - "integrity": "sha512-vXyxOVpVmlO7oeshbtCVwU42Mqz350o4/r0ToP9XtG2gv7F/e9GcpCaM9XIgyeeu8cQQGTcbfjGb1t9MFlPrOg==", - "dependencies": { - "@jscad/csg": "0.3.6" - } - }, - "node_modules/@most/multicast": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz", - "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==", - "dependencies": { - "@most/prelude": "^1.4.0" - }, - "peerDependencies": { - "most": "^1.0.1" - } - }, - "node_modules/@most/prelude": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.8.0.tgz", - "integrity": "sha512-t1CcURpZzfmBA6fEWwqmCqeNzWAj1w2WqEmCk/2yXMe/p8Ut000wFmVKMy8A1Rl9VVxZEZ5nBHd/pU0dR4bv/w==" - }, "node_modules/@types/bezier-js": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz", @@ -234,35 +77,22 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/astring": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", - "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==", - "bin": { - "astring": "bin/astring" - } - }, "node_modules/bezier-js": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.6.1.tgz", "integrity": "sha512-jelZM33eNzcZ9snJ/5HqJLw3IzXvA8RFcBjkdOB8SDYyOvW8Y2tTosojAiBTnD1MhbHoWUYNbxUXxBl61TxbRg==" }, - "node_modules/brace": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/brace/-/brace-0.10.0.tgz", - "integrity": "sha512-C0nbmcNIY2nRtA3hY5NNmZuNZDs4X676WHf+xiFw0NXUQIdSCkIgZHkztqtSOmC0BGjvBR2DNO9USiZMY+Qx6w==", - "dependencies": { - "w3c-blob": "0.0.1" - } - }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -301,25 +131,15 @@ "url": "https://www.patreon.com/infusion" } }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==" + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -327,18 +147,17 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/ergogen": { - "version": "3.1.0", - "resolved": "git+ssh://git@github.com/soundmonster/ergogen.git#7946fbe9b8e7b82e0259da5cbfda1a0de7dc1b57", + "version": "4.0.2", + "resolved": "git+ssh://git@github.com/ergogen/ergogen.git#63684e33d76579548dd0ff88a9db88ca4cec26c2", "license": "MIT", "dependencies": { - "@jscad/openjscad": "github:ergogen/oldjscad", - "fs-extra": "^10.0.0", - "js-yaml": "^3.14.0", + "fs-extra": "^11.1.0", + "js-yaml": "^3.14.1", + "jszip": "^3.10.1", "kle-serial": "github:ergogen/kle-serial#ergogen", "makerjs": "github:ergogen/maker.js#ergogen", - "mathjs": "^10.0.0", - "semver": "^7.3.5", - "yargs": "^17.3.0" + "mathjs": "^11.5.0", + "yargs": "^17.6.2" }, "bin": { "ergogen": "src/cli.js" @@ -357,26 +176,6 @@ "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" }, - "node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -390,23 +189,18 @@ } }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -415,75 +209,25 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graham_scan": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz", "integrity": "sha512-jL+zq9xTYXxsDIf+qy9aaudRXx/X4sqrOlbFkg1ElqCznhYAQ/wXv8cifgzRvzFopStDeIvny5sIu6jgSjnRww==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", @@ -493,6 +237,11 @@ "node": ">=8" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -544,6 +293,17 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/kdbush": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz", @@ -558,20 +318,12 @@ "json5": "^2.1.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "immediate": "~3.0.5" } }, "node_modules/makerjs": { @@ -591,19 +343,19 @@ } }, "node_modules/mathjs": { - "version": "10.6.4", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-10.6.4.tgz", - "integrity": "sha512-omQyvRE1jIy+3k2qsqkWASOcd45aZguXZDckr3HtnTYyXk5+2xpVfC3kATgbO2Srjxlqww3TVdhD0oUdZ/hiFA==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.8.0.tgz", + "integrity": "sha512-I7r8HCoqUGyEiHQdeOCF2m2k9N+tcOHO3cZQ3tyJkMMBQMFqMR7dMQEboBMJAiFW2Um3PEItGPwcOc4P6KRqwg==", "dependencies": { - "@babel/runtime": "^7.18.6", + "@babel/runtime": "^7.21.0", "complex.js": "^2.1.1", - "decimal.js": "^10.3.1", + "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", "fraction.js": "^4.2.0", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", - "typed-function": "^2.1.0" + "typed-function": "^4.1.0" }, "bin": { "mathjs": "bin/cli.js" @@ -612,37 +364,34 @@ "node": ">= 14" } }, - "node_modules/most": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/most/-/most-1.9.0.tgz", - "integrity": "sha512-M7yHMcMGaclzEL6eg8Yh8PlAsaWfL/oSThF4+ZuWKM5CKXcbzmLh+qESwgZFzMKHJ+iVJwb28yFvDEOobI653w==", - "dependencies": { - "@most/multicast": "^1.2.5", - "@most/prelude": "^1.4.0", - "globalthis": "^1.0.1", - "symbol-observable": "^2.0.3" - } + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, - "node_modules/most-gestures": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/most-gestures/-/most-gestures-0.3.0.tgz", - "integrity": "sha512-v57B+eOZ5XVDRUyN8KHcVpeuert8qW6xdVCBfld0mglBJb6Jf3U5hualvTlBODGsai1v5O9jxengsQCq3Lxdkg==", - "dependencies": { - "most": "^1.7.2" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/require-directory": { "version": "2.1.1", @@ -652,35 +401,34 @@ "node": ">=0.10.0" } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -705,34 +453,17 @@ "node": ">=8" } }, - "node_modules/sylvester": { - "name": "@kaosat-dev/sylvester", - "version": "0.0.21", - "resolved": "git+ssh://git@github.com/kaosat-dev/node-sylvester.git#ce74d23a2092ae02a56b840ef70f5d61c54df409", - "license": "MIT", - "engines": { - "node": ">=0.2.6" - } - }, - "node_modules/symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "node_modules/typed-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.1.0.tgz", - "integrity": "sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==", "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/universalify": { @@ -743,15 +474,10 @@ "node": ">= 10.0.0" } }, - "node_modules/w3c-blob": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz", - "integrity": "sha512-fKfmCyRd0A/tSLt0zPR2716jAkoysa4+2nA2ip6ytr6fs1I9Tml2aXb28w8ljUjUutT23Zn7Vyc2GQM5w3rtWA==" - }, - "node_modules/webworkify": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz", - "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -777,23 +503,18 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -810,11 +531,11 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@danmarshall/jscad-typings": { @@ -822,151 +543,6 @@ "resolved": "https://registry.npmjs.org/@danmarshall/jscad-typings/-/jscad-typings-1.0.0.tgz", "integrity": "sha512-MGGIGDItK2UQSsz7yTrXErQXDAFXR3UPxyQ7WZ5RHOwnv60CBXjmkJlXYMYPkSvo+7fUuQL2/ODcvECtc/fi9g==" }, - "@jscad/csg": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.6.tgz", - "integrity": "sha512-GoUXhTwO0L+Cxba8VfFFLGm+ECd0xZKoIAPpeUYsDiCVsIZ6XK+3GLgBgn5waeumQNh+H6WsHjMMRKXBrDBreA==" - }, - "@jscad/dxf-serializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/dxf-serializer/-/dxf-serializer-0.0.4.tgz", - "integrity": "sha512-/d3192aL8WAWX7KU5MRc61y7n9ZIzPik/F+d+rCtb7uxMmhzt7j5mcno4CDwSrfeIrzK8U+8Pyrdq13QkHOaLA==" - }, - "@jscad/gcode-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/gcode-deserializer/-/gcode-deserializer-0.0.4.tgz", - "integrity": "sha512-RielAllRKm2oz+lG0On0aOeB2+qI7/lbzc/kQPzcBeObnqyuJKyHMVeFHDQ18o9Zjyrkv4g2QA6FDcVTbrmr0Q==" - }, - "@jscad/io": { - "version": "git+ssh://git@github.com/ergogen/oldjscadio.git#692cf142062208b0097b2d4852c30d6cc51eea8d", - "from": "@jscad/io@github:ergogen/oldjscadio", - "requires": { - "@jscad/dxf-serializer": "^0.0.4", - "@jscad/gcode-deserializer": "^0.0.4", - "@jscad/io-utils": "^0.1.2", - "@jscad/json-deserializer": "^0.0.4", - "@jscad/json-serializer": "^0.0.5", - "@jscad/obj-deserializer": "^0.0.4", - "@jscad/stl-deserializer": "^0.1.2", - "@jscad/stl-serializer": "^0.0.6", - "@jscad/svg-deserializer": "^0.2.3", - "@jscad/svg-serializer": "^0.0.4" - } - }, - "@jscad/io-utils": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@jscad/io-utils/-/io-utils-0.1.3.tgz", - "integrity": "sha512-aCVUZovewI4njtEJ1fvjhasqd8EHIzQaPb88MtFWf/ff1NdGOu/vRH3yGG8vu0NZektGEDCKp028g2nTBL7aFg==" - }, - "@jscad/json-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/json-deserializer/-/json-deserializer-0.0.4.tgz", - "integrity": "sha512-Z0lm1kTrJzA6Irv+TQmX4q2MWl97rLU2H9LDdC5y9utsO1J47Krllta2DJECWj7KfYcbf/je3kRZ2CQ7dHvaBA==", - "requires": { - "@jscad/csg": "0.3.6" - } - }, - "@jscad/json-serializer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@jscad/json-serializer/-/json-serializer-0.0.5.tgz", - "integrity": "sha512-xQCBwjyRuEXolIRiCIZEf7k/FDERFTzyt1amY12u4ZWULY4QWU4d4fY5KaSkaZkBdkXE/leh0AylR0Q6mUwBKA==", - "requires": { - "@jscad/csg": "0.3.6", - "@jscad/io-utils": "^0.1.2" - } - }, - "@jscad/obj-deserializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/obj-deserializer/-/obj-deserializer-0.0.4.tgz", - "integrity": "sha512-uD57ahy1DfW9siy/nbwA4hAO5nE/gt/ZJoTbUfso3DnfwwqUbM42lw/AYAcFYw8Ab2U2GybDulKTPT3lr+eJdA==" - }, - "@jscad/openjscad": { - "version": "git+ssh://git@github.com/ergogen/oldjscad.git#040637f3d8d4da0ad0a9ffdfe1a33a791c8008f4", - "from": "@jscad/openjscad@github:ergogen/oldjscad", - "requires": { - "@jscad/csg": "0.3.6", - "@jscad/io": "github:ergogen/oldjscadio", - "@jscad/openscad-openjscad-translator": "0.0.10", - "@jscad/scad-api": "^0.5.1", - "astring": "^1.0.2", - "brace": "0.10.0", - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "most-gestures": "^0.3.0", - "webworkify": "^1.4.0" - } - }, - "@jscad/openscad-openjscad-translator": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/@jscad/openscad-openjscad-translator/-/openscad-openjscad-translator-0.0.10.tgz", - "integrity": "sha512-gw4iD8qVDm7Qb0PFYuwP4yYMU90wOQ0992WBLwqQSaLdKET0c2UlVJUu1jM5GUzxVEyJwm2ZbS1/c+JwOdTc6Q==", - "requires": { - "lodash": "^4.17.4", - "sylvester": "github:kaosat-dev/node-sylvester" - } - }, - "@jscad/scad-api": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@jscad/scad-api/-/scad-api-0.5.1.tgz", - "integrity": "sha512-1BlfqcAf0xIicbaKU1bCOxHh0+aHJ7fBRY6r+7/e+0uMrfoqHoULGqkAZCwnftt0cPj5uAP8JSlyOinHKaFIJw==", - "requires": { - "@jscad/csg": "0.3.7" - }, - "dependencies": { - "@jscad/csg": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@jscad/csg/-/csg-0.3.7.tgz", - "integrity": "sha512-CuqKgXEZDH1FzbwQTdMWQ0FiEGi+LrP32tP6nW6rdWEEBjL6w19F3OrShD7SP8mK9IcqiuhgN9JcbWaiBswWlQ==" - } - } - }, - "@jscad/stl-deserializer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@jscad/stl-deserializer/-/stl-deserializer-0.1.2.tgz", - "integrity": "sha512-2HpFv0G0TfV1v2psHvnx/PAOZ7iYmqp0REnOT/pQ9T5LRkdHrI1uvgzT4VHp9lOdK6vD5jO9uwRyj8dFWQhLYw==", - "requires": { - "@jscad/csg": "0.3.6", - "@jscad/io-utils": "^0.1.2" - } - }, - "@jscad/stl-serializer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@jscad/stl-serializer/-/stl-serializer-0.0.6.tgz", - "integrity": "sha512-yf47E+rCtE3sdoMIIVeOGmB/gaQzrgN2JhFsYa4pEVcbh7RnUJauegFyacbGIEAxAYC8Ck7f5DU0mc/JbIjFhQ==", - "requires": { - "@jscad/io-utils": "^0.1.2" - } - }, - "@jscad/svg-deserializer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@jscad/svg-deserializer/-/svg-deserializer-0.2.3.tgz", - "integrity": "sha512-i/LVaOCKkn5CdncoQFUhq9HPZOd9diupknlDBRmllLiuP2zzZLowz7a3mxF1hkVkwOx45WD02JPPkKUSBzz6tQ==", - "requires": { - "@jscad/csg": "0.3.6", - "sax": "1.2.4" - } - }, - "@jscad/svg-serializer": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@jscad/svg-serializer/-/svg-serializer-0.0.4.tgz", - "integrity": "sha512-vXyxOVpVmlO7oeshbtCVwU42Mqz350o4/r0ToP9XtG2gv7F/e9GcpCaM9XIgyeeu8cQQGTcbfjGb1t9MFlPrOg==", - "requires": { - "@jscad/csg": "0.3.6" - } - }, - "@most/multicast": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@most/multicast/-/multicast-1.3.0.tgz", - "integrity": "sha512-DWH8AShgp5bXn+auGzf5tzPxvpmEvQJd0CNsApOci1LDF4eAEcnw4HQOr2Jaa+L92NbDYFKBSXxll+i7r1ikvw==", - "requires": { - "@most/prelude": "^1.4.0" - } - }, - "@most/prelude": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@most/prelude/-/prelude-1.8.0.tgz", - "integrity": "sha512-t1CcURpZzfmBA6fEWwqmCqeNzWAj1w2WqEmCk/2yXMe/p8Ut000wFmVKMy8A1Rl9VVxZEZ5nBHd/pU0dR4bv/w==" - }, "@types/bezier-js": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/bezier-js/-/bezier-js-0.0.6.tgz", @@ -1011,31 +587,18 @@ "sprintf-js": "~1.0.2" } }, - "astring": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", - "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==" - }, "bezier-js": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-2.6.1.tgz", "integrity": "sha512-jelZM33eNzcZ9snJ/5HqJLw3IzXvA8RFcBjkdOB8SDYyOvW8Y2tTosojAiBTnD1MhbHoWUYNbxUXxBl61TxbRg==" }, - "brace": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/brace/-/brace-0.10.0.tgz", - "integrity": "sha512-C0nbmcNIY2nRtA3hY5NNmZuNZDs4X676WHf+xiFw0NXUQIdSCkIgZHkztqtSOmC0BGjvBR2DNO9USiZMY+Qx6w==", - "requires": { - "w3c-blob": "0.0.1" - } - }, "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "requires": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, @@ -1062,19 +625,15 @@ "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==" }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==" + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, "emoji-regex": { "version": "8.0.0", @@ -1082,17 +641,16 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "ergogen": { - "version": "git+ssh://git@github.com/soundmonster/ergogen.git#7946fbe9b8e7b82e0259da5cbfda1a0de7dc1b57", - "from": "ergogen@github:soundmonster/ergogen#samoklava", + "version": "git+ssh://git@github.com/ergogen/ergogen.git#63684e33d76579548dd0ff88a9db88ca4cec26c2", + "from": "ergogen@github:ergogen/ergogen", "requires": { - "@jscad/openjscad": "github:ergogen/oldjscad", - "fs-extra": "^10.0.0", - "js-yaml": "^3.14.0", + "fs-extra": "^11.1.0", + "js-yaml": "^3.14.1", + "jszip": "^3.10.1", "kle-serial": "github:ergogen/kle-serial#ergogen", "makerjs": "github:ergogen/maker.js#ergogen", - "mathjs": "^10.0.0", - "semver": "^7.3.5", - "yargs": "^17.3.0" + "mathjs": "^11.5.0", + "yargs": "^17.6.2" } }, "escalade": { @@ -1105,95 +663,56 @@ "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==" - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, "fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graham_scan": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/graham_scan/-/graham_scan-1.0.4.tgz", "integrity": "sha512-jL+zq9xTYXxsDIf+qy9aaudRXx/X4sqrOlbFkg1ElqCznhYAQ/wXv8cifgzRvzFopStDeIvny5sIu6jgSjnRww==" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "javascript-natural-sort": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", @@ -1229,6 +748,17 @@ "universalify": "^2.0.0" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "kdbush": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-2.0.1.tgz", @@ -1241,17 +771,12 @@ "json5": "^2.1.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "requires": { - "yallist": "^4.0.0" + "immediate": "~3.0.5" } }, "makerjs": { @@ -1270,78 +795,83 @@ } }, "mathjs": { - "version": "10.6.4", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-10.6.4.tgz", - "integrity": "sha512-omQyvRE1jIy+3k2qsqkWASOcd45aZguXZDckr3HtnTYyXk5+2xpVfC3kATgbO2Srjxlqww3TVdhD0oUdZ/hiFA==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.8.0.tgz", + "integrity": "sha512-I7r8HCoqUGyEiHQdeOCF2m2k9N+tcOHO3cZQ3tyJkMMBQMFqMR7dMQEboBMJAiFW2Um3PEItGPwcOc4P6KRqwg==", "requires": { - "@babel/runtime": "^7.18.6", + "@babel/runtime": "^7.21.0", "complex.js": "^2.1.1", - "decimal.js": "^10.3.1", + "decimal.js": "^10.4.3", "escape-latex": "^1.2.0", "fraction.js": "^4.2.0", "javascript-natural-sort": "^0.7.1", "seedrandom": "^3.0.5", "tiny-emitter": "^2.1.0", - "typed-function": "^2.1.0" + "typed-function": "^4.1.0" } }, - "most": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/most/-/most-1.9.0.tgz", - "integrity": "sha512-M7yHMcMGaclzEL6eg8Yh8PlAsaWfL/oSThF4+ZuWKM5CKXcbzmLh+qESwgZFzMKHJ+iVJwb28yFvDEOobI653w==", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { - "@most/multicast": "^1.2.5", - "@most/prelude": "^1.4.0", - "globalthis": "^1.0.1", - "symbol-observable": "^2.0.3" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "most-gestures": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/most-gestures/-/most-gestures-0.3.0.tgz", - "integrity": "sha512-v57B+eOZ5XVDRUyN8KHcVpeuert8qW6xdVCBfld0mglBJb6Jf3U5hualvTlBODGsai1v5O9jxengsQCq3Lxdkg==", - "requires": { - "most": "^1.7.2" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1360,39 +890,25 @@ "ansi-regex": "^5.0.1" } }, - "sylvester": { - "version": "git+ssh://git@github.com/kaosat-dev/node-sylvester.git#ce74d23a2092ae02a56b840ef70f5d61c54df409", - "from": "sylvester@github:kaosat-dev/node-sylvester" - }, - "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==" - }, "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "typed-function": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.1.0.tgz", - "integrity": "sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==" }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, - "w3c-blob": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/w3c-blob/-/w3c-blob-0.0.1.tgz", - "integrity": "sha512-fKfmCyRd0A/tSLt0zPR2716jAkoysa4+2nA2ip6ytr6fs1I9Tml2aXb28w8ljUjUutT23Zn7Vyc2GQM5w3rtWA==" - }, - "webworkify": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/webworkify/-/webworkify-1.5.0.tgz", - "integrity": "sha512-AMcUeyXAhbACL8S2hqqdqOLqvJ8ylmIbNwUIqQujRSouf4+eUFaXbG6F1Rbu+srlJMmxQWsiU7mOJi0nMBfM1g==" + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "wrap-ansi": { "version": "7.0.0", @@ -1409,23 +925,18 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" } }, "yargs-parser": { diff --git a/package.json b/package.json index 95e3dc3..e4ddd98 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "scripts": { - "gen": "ergogen samoklava.yaml" + "gen": "ergogen input/" }, "dependencies": { - "ergogen": "github:soundmonster/ergogen#samoklava" + "ergogen": "github:ergogen/ergogen" } } diff --git a/samoklava.yaml b/samoklava.yaml deleted file mode 100644 index ec7ac0c..0000000 --- a/samoklava.yaml +++ /dev/null @@ -1,444 +0,0 @@ -units: - kx: cx - ky: cy - px: 2 - py: 2 -points: - key: - footprints: - choc_hotswap: - type: choc - params: - hotswap: true - reverse: true - keycaps: true - nets: - # from: P1 - # to: P2 - from: =colrow - to: =column_net - diode: - type: diode - nets: - # from: P3 - # to: P4 - from: =colrow - to: =row_net - anchor: - shift: [0, -5] - zones: - matrix: - # anchor: - # rotate: 5 - key.padding: ky - columns: - pinky: - stagger: 0 ky - spread: kx - key: - column_net: P20 - ring: - stagger: 0.7 ky - spread: kx - key: - column_net: P19 - middle: - stagger: 0.2 ky - spread: kx - key: - column_net: P18 - index: - stagger: -0.2 ky - spread: kx - key: - column_net: P15 - inner: - stagger: -0.1 ky - spread: kx - key: - column_net: P14 - rows: - bottom: - row_net: P6 - home: - row_net: P5 - top: - row_net: P4 - thumbfan: - anchor: - ref: matrix_inner_bottom - shift: [-1.5 kx, -1 ky] - columns: - near: - spread: kx - rotate: -15 - origin: [-0.5 kx, -0.5 ky] - key: - column_net: P18 - home: - spread: kx - rotate: -15 - origin: [-0.5 kx, -0.5 ky] - key: - column_net: P15 - far: - spread: kx - rotate: -15 - origin: [-0.5 kx, -0.5 ky] - key: - column_net: P14 - rows: - thumb: - row_net: P7 -outlines: - # board dimensions according to JLCPCB: 122.28 mm x 101.05 mm - exports: - raw: - - type: keys - side: left - size: [kx + px, ky + py] - corner: px - thumbfan_glue: - - type: polygon - points: - - ref: matrix_inner_bottom - shift: [0.5 kx + 0.5px, -0.5 ky + 0.5 py] - - ref: thumbfan_far_thumb - shift: [0.5 kx - 0.5px, 0.5 ky + 0.5 py] - - ref: thumbfan_far_thumb - shift: [0.5 kx - 0.5px, -0.5 ky - 0.5 py] - - ref: thumbfan_near_thumb - shift: [-0.5 kx + 0.5 px, -0.5 ky - 0.5 py] - - ref: matrix_pinky_bottom - shift: [0.5 kx - 0.5 py, -0.5 ky - 0.5 py] - - ref: matrix_pinky_home - - ref: matrix_inner_home - patch_outer: - - type: polygon - points: - - ref: matrix_ring_top - - ref: matrix_ring_bottom - - ref: matrix_pinky_bottom - shift: [-0.5 (kx + px), 0] - - ref: matrix_pinky_top - shift: [-0.5 (kx + px), 0] - patch_inner: - - type: polygon - points: - - ref: matrix_inner_top - shift: [0.5 (kx + px), 0] - - ref: matrix_inner_bottom - shift: [0.5 (kx + px), 0] - - ref: matrix_index_bottom - - ref: matrix_index_top - controller_area: - main: - type: rectangle - anchor: - ref: - - matrix_inner_top - shift: [0 kx, -4.05 ky] - size: [32, 76.5] - corner: px - switches: - main: - type: keys - side: left - size: 14 - bound: false - keycaps: - main: - type: keys - side: left - size: [kx, ky] - bound: false - corner: 1 - keywell: - main: - type: outline - name: raw - patch_inner: - type: outline - name: patch_inner - operation: add - patch_outer: - type: outline - name: patch_outer - operation: add - thumbfan_glue: - type: outline - name: thumbfan_glue - operation: add - base_outline: - main: - type: outline - name: keywell - controller: - type: outline - name: controller_area - operation: add - screw_holes: - top_left: - type: circle - anchor: - - ref: matrix_ring_home - shift: [-0.5 kx, 0 ky] - radius: 1.05 - bottom_left: - type: circle - anchor: - - ref: matrix_pinky_bottom - shift: [0.5 kx, 0] - radius: 1.05 - top_right: - type: circle - anchor: - - ref: matrix_inner_top - shift: [-0.5 kx, 0] - radius: 1.05 - palm: - type: circle - anchor: - - ref: matrix_index_bottom - shift: [0, -1.06 ky] - radius: 1.05 - thumb: - type: circle - anchor: - - ref: thumbfan_far_thumb - shift: [-0.55 kx, 0] - radius: 1.05 - mounting_holes: - $extends: outlines.exports.screw_holes - top_left: - radius: 2.05 - bottom_left: - radius: 2.05 - top_right: - radius: 2.05 - palm: - radius: 2.05 - thumb: - radius: 2.05 - bottom_outline: - main: - type: outline - name: base_outline - screw_holes: - type: outline - # TODO use footprints with pad + via reinforcement as mounting holes - name: screw_holes - operation: subtract - plate: - main: - type: outline - name: keywell - switches: - type: outline - name: switches - operation: subtract - mounting_holes: - type: outline - # TODO use footprints with pad + via reinforcement as mounting holes - name: screw_holes - operation: subtract - pcb: - main: - type: outline - name: base_outline - mounting_holes: - type: outline - # TODO use plated through hole footprints as mounting holes - name: mounting_holes - operation: subtract -pcbs: - top_plate: - include_keys: false - outlines: - edge: - outline: plate - layer: Edge.Cuts - footprints: - jlc_order_number: - type: text - anchor: - ref: - - matrix_ring_home - shift: [-0.25 kx, 0.5 ky] - params: - text: "JLCJLCJLCJLC" - justify: left - bottom_plate: - include_keys: false - outlines: - edge: - outline: bottom_outline - layer: Edge.Cuts - board: - outlines: - edge: - outline: pcb - layer: Edge.Cuts - footprints: - mcu_l: - type: promicro - params: - orientation: up - anchor: - ref: - - matrix_inner_top - shift: [20, -11] - rotate: 270 - mcu_r: - type: promicro - params: - orientation: down - anchor: - ref: - - matrix_inner_top - shift: [22.5, -12.25] - rotate: 270 - pad_plus: - type: pad - anchor: - ref: - - matrix_inner_top - shift: [23, -6] - rotate: 0 - params: - front: true - back: true - width: 1.5 - height: 1.5 - text: "B+" - nets: - net: Bplus - pad_minus: - type: pad - anchor: - ref: - - matrix_inner_top - shift: [23, -3] - rotate: 0 - params: - front: true - back: true - width: 1.5 - height: 1.5 - text: "B-" - nets: - net: GND - trrs_l: - type: trrs - anchor: - ref: - - matrix_inner_bottom - shift: [32, -15] - rotate: 270 - params: - reverse: false - symmetric: false - # The naming of the nets on this footprint is different from the Corne schematics. - nets: - A: "" - B: VCC - C: GND - D: P0 - trrs_r: - type: trrs - anchor: - ref: - - matrix_inner_bottom - shift: [32, -13] - rotate: 270 - params: - reverse: true - symmetric: false - # The naming of the nets on this footprint is different from the Corne schematics. - nets: - A: "" - B: VCC - C: GND - D: P0 - jumper_l: - type: jumper - anchor: - ref: - - matrix_inner_bottom - shift: [23.5, 0] - rotate: 270 - params: - side: B - nets: - from: Bplus - to: RAW - jumper_r: - type: jumper - anchor: - ref: - - matrix_inner_bottom - shift: [23.5, 0] - rotate: 270 - params: - side: F - nets: - from: Bplus - to: RAW - slider_l: - type: slider - anchor: - ref: - - matrix_inner_bottom - shift: [30, 0] - rotate: 270 - params: - side: F - nets: - from: RAW - left: Bplus - right: '' - slider_r: - type: slider - anchor: - ref: - - matrix_inner_bottom - shift: [30, 0] - rotate: 270 - params: - side: B - nets: - from: RAW - left: '' - right: Bplus - reset: - type: button - anchor: - ref: - - matrix_inner_bottom - shift: [17, 0] - rotate: 270 - params: - variant: 2_pin_th - nets: - from: GND - to: RST - info_l: - type: text - anchor: - ref: - - matrix_pinky_bottom - shift: [0.75 kx, 0] - params: - text: "samoklava v0.1\\nby soundmonster" - justify: left - info_r: - type: text - anchor: - ref: - - matrix_pinky_bottom - shift: [0.75 kx, 0] - params: - layer: B.SilkS - text: "samoklava v0.1\\nby soundmonster" - justify: right mirror -