diff options
| author | Nathan Perry <np@nathanperry.dev> | 2024-08-13 04:23:03 -0400 |
|---|---|---|
| committer | Nathan Perry <np@nathanperry.dev> | 2024-08-13 08:47:26 -0400 |
| commit | c932857e02c78a0395aca618354f8f4d8c59e6d0 (patch) | |
| tree | b8e3a3cc733130d375f68ce1dd5879901be26bce /nix | |
| parent | a237f3f4d621178d3637e107eba849f1bf63b5d5 (diff) | |
nix: init
Diffstat (limited to 'nix')
| -rw-r--r-- | nix/default.nix | 22 | ||||
| -rw-r--r-- | nix/fabrication.nix | 65 | ||||
| -rw-r--r-- | nix/model.nix | 53 | ||||
| -rw-r--r-- | nix/panel.nix | 29 | ||||
| -rw-r--r-- | nix/schematics.nix | 0 | ||||
| -rw-r--r-- | nix/svg.nix | 64 |
6 files changed, 233 insertions, 0 deletions
diff --git a/nix/default.nix b/nix/default.nix new file mode 100644 index 0000000..2c5ac7a --- /dev/null +++ b/nix/default.nix @@ -0,0 +1,22 @@ +{ + pkgs, +}: let + panel = pkgs.callPackage ./panel.nix {}; + svgs = pkgs.callPackage ./svg.nix { inherit panel; }; + model = pkgs.callPackage ./model.nix { inherit panel; }; + fabrication = pkgs.callPackage ./fabrication.nix { inherit panel; }; + + full = pkgs.symlinkJoin { + name = "ocularium"; + paths = [ + panel + svgs + model + fabrication + ]; + }; + +in { + inherit panel svgs model fabrication full; + fab = fabrication; +} diff --git a/nix/fabrication.nix b/nix/fabrication.nix new file mode 100644 index 0000000..82a5d3f --- /dev/null +++ b/nix/fabrication.nix @@ -0,0 +1,65 @@ +{ + kicad, + kikit, + zip, + + runCommand, + nix-filter, + + panel, +}: let + schSrc = nix-filter { + root = ./..; + + include = [ + (nix-filter.matchExt "kicad_sch") + ]; + }; + + pcbSrc = nix-filter { + root = ./..; + + include = [ + (nix-filter.matchExt "kicad_pcb") + (nix-filter.matchExt "kicad_pro") + ]; + }; + +in runCommand "ocularium.fab" { + nativeBuildInputs = [ + kicad + kikit + zip + ]; + + src = panel; + + allowedRequisites = []; +} '' + set -e + + mkdir -p $out/share/npry/ocularium/fab + mkdir -p $out/share/npry/ocularium/panel/fab + + export HOME=$(mktemp -d) + + cd $out/share/npry/ocularium/fab + + kikit fab jlcpcb --assembly \ + --no-drc \ + --schematic ${schSrc}/okm.kicad_sch \ + --field 'LCSC Part #,LCSC Part No' \ + --missingError \ + ${pcbSrc}/okm.kicad_pcb . + rm -rf gerber + + cd ../panel + + kikit fab jlcpcb --assembly \ + --no-drc \ + --schematic ${schSrc}/okm.kicad_sch \ + --field 'LCSC Part #,LCSC Part No' \ + --missingError \ + $src/share/npry/ocularium/panel.kicad_pcb . + rm -rf gerber +'' diff --git a/nix/model.nix b/nix/model.nix new file mode 100644 index 0000000..daa86ca --- /dev/null +++ b/nix/model.nix @@ -0,0 +1,53 @@ +{ + kicad, + runCommand, + + nix-filter, + + panel, + + withTracks ? false, + withZones ? false, +}: let + zonesArg = if withZones then "--include-zones" else ""; + tracksArg = if withTracks then "--include-tracks" else ""; + +in runCommand "ocularium.model" { + nativeBuildInputs = [ + kicad + ]; + + src = nix-filter { + root = ./..; + + exclude = [ + "nix" + ".gitignore" + "flake.nix" + "flake.lock" + ".envrc" + "kikit" + ]; + }; + + allowedRequisites = []; + + KICAD8_3DMODEL_DIR = "${kicad.libraries.packages3d}/share/kicad/3dmodels"; +} '' + set -e + + mkdir -p $out/share/npry/ocularium/model + mkdir -p $out/share/npry/ocularium/panel/model + + export HOME=$(mktemp -d) + + cd $out/share/npry/ocularium/model + + kicad-cli pcb export step --subst-models --no-dnp ${tracksArg} ${zonesArg} $src/okm.kicad_pcb -o ocularium.step + kicad-cli pcb export glb --subst-models --no-dnp ${tracksArg} ${zonesArg} $src/okm.kicad_pcb -o ocularium.glb + + cd ../panel/model + + kicad-cli pcb export step --subst-models --no-dnp ${tracksArg} ${zonesArg} ${panel}/share/npry/ocularium/panel.kicad_pcb -o panel.step + kicad-cli pcb export glb --subst-models --no-dnp ${tracksArg} ${zonesArg} ${panel}/share/npry/ocularium/panel.kicad_pcb -o panel.glb +'' diff --git a/nix/panel.nix b/nix/panel.nix new file mode 100644 index 0000000..41f55dd --- /dev/null +++ b/nix/panel.nix @@ -0,0 +1,29 @@ +{ + kicad, + kikit, + nix-filter, + runCommand, +}: runCommand "ocularium.panel" { + nativeBuildInputs = [ + kicad + kikit + ]; + + src = nix-filter { + root = ./..; + + include = [ + "kikit" + (nix-filter.matchExt "kicad_pcb") + ]; + }; +} '' + set -e + export HOME=$(mktemp -d) + + mkdir -p $out/share/npry/ocularium + cd $HOME + + kikit panelize -p :jlcTooling -p $src/kikit/jlc_edge_rails.json $src/okm.kicad_pcb panel.kicad_pcb + cp panel.kicad_{pcb,pro} $out/share/npry/ocularium +'' diff --git a/nix/schematics.nix b/nix/schematics.nix new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/nix/schematics.nix diff --git a/nix/svg.nix b/nix/svg.nix new file mode 100644 index 0000000..3d93ecc --- /dev/null +++ b/nix/svg.nix @@ -0,0 +1,64 @@ +{ + runCommand, + kicad, + nix-filter, + + panel, +}: runCommand "ocularium.svg" { + nativeBuildInputs = [ + kicad + ]; + + src = nix-filter { + root = ./..; + + exclude = [ + "nix" + ".gitignore" + "flake.nix" + "flake.lock" + ".envrc" + "kikit" + "models" + ]; + }; + + allowedRequisites = []; +} '' + set -e + + export HOME=$(mktemp -d) + + mkdir -p $out/share/npry/ocularium/svg + mkdir -p $out/share/npry/ocularium/panel/svg + + mksvg() { + local infile=$1 + local layers=$2 + local outfile=$3 + + kicad-cli pcb export svg \ + "$infile.kicad_pcb" \ + -l "$layers" \ + -o $outfile.svg \ + --page-size-mode 2 \ + --exclude-drawing-sheet + } + + readonly okm="$src/okm" + readonly panel="${panel}/share/npry/ocularium/panel" + + cd $out/share/npry/ocularium/svg + + mksvg "$okm" "F.Cu,F.Silkscreen,Edge.Cuts" front + mksvg "$okm" "B.Cu,B.Silkscreen,Edge.Cuts" back + mksvg "$okm" "In1.Cu,Edge.Cuts" in1 + mksvg "$okm" "In2.Cu,Edge.Cuts" in2 + + cd ../panel/svg + + mksvg "$panel" "F.Cu,F.Silkscreen,Edge.Cuts" front + mksvg "$panel" "B.Cu,B.Silkscreen,Edge.Cuts" back + mksvg "$panel" "In1.Cu,Edge.Cuts" in1 + mksvg "$panel" "In2.Cu,Edge.Cuts" in2 +'' |
