113 lines
3.7 KiB
Nix
113 lines
3.7 KiB
Nix
|
|
{
|
||
|
|
description = "Cuatro - 3D Printable Game Pieces";
|
||
|
|
|
||
|
|
inputs = {
|
||
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||
|
|
flake-utils.url = "github:numtide/flake-utils";
|
||
|
|
};
|
||
|
|
|
||
|
|
outputs = { self, nixpkgs, flake-utils }:
|
||
|
|
flake-utils.lib.eachDefaultSystem (system:
|
||
|
|
let
|
||
|
|
pkgs = nixpkgs.legacyPackages.${system};
|
||
|
|
in
|
||
|
|
{
|
||
|
|
devShells.default = pkgs.mkShell {
|
||
|
|
buildInputs = with pkgs; [
|
||
|
|
openscad
|
||
|
|
# For viewing and editing STL files
|
||
|
|
meshlab
|
||
|
|
# For version control
|
||
|
|
git
|
||
|
|
];
|
||
|
|
|
||
|
|
shellHook = ''
|
||
|
|
echo "Cuatro Development Environment"
|
||
|
|
echo "Available tools:"
|
||
|
|
echo " openscad - OpenSCAD for 3D modeling"
|
||
|
|
echo " meshlab - 3D mesh viewer/editor"
|
||
|
|
echo ""
|
||
|
|
echo "To generate STL files:"
|
||
|
|
echo " openscad -o output.stl parts.scad"
|
||
|
|
echo ""
|
||
|
|
echo "To open the design in OpenSCAD GUI:"
|
||
|
|
echo " openscad parts.scad"
|
||
|
|
'';
|
||
|
|
};
|
||
|
|
|
||
|
|
packages.default = pkgs.stdenv.mkDerivation {
|
||
|
|
pname = "cuatro";
|
||
|
|
version = "1.0.0";
|
||
|
|
|
||
|
|
src = ./.;
|
||
|
|
|
||
|
|
buildInputs = [ pkgs.openscad ];
|
||
|
|
|
||
|
|
buildPhase = ''
|
||
|
|
# Generate STL files for all piece types
|
||
|
|
mkdir -p $out/stl
|
||
|
|
|
||
|
|
# Create individual STL files for each piece type
|
||
|
|
openscad -D 'tube_holes(row=1, fn=360);' -o $out/stl/tube-holes.stl parts.scad
|
||
|
|
openscad -D 'tubes(row=1);' -o $out/stl/tubes.stl parts.scad
|
||
|
|
openscad -D 'boxes(row=1);' -o $out/stl/boxes.stl parts.scad
|
||
|
|
openscad -D 'box_holes(row=1);' -o $out/stl/box-holes.stl parts.scad
|
||
|
|
|
||
|
|
# Create combined file
|
||
|
|
openscad -o $out/stl/all-pieces.stl parts.scad
|
||
|
|
'';
|
||
|
|
|
||
|
|
installPhase = ''
|
||
|
|
mkdir -p $out/share/cuatro
|
||
|
|
cp -r . $out/share/cuatro/
|
||
|
|
|
||
|
|
# Create a script for easy STL generation
|
||
|
|
mkdir -p $out/bin
|
||
|
|
cat > $out/bin/cuatro-generate << 'EOF'
|
||
|
|
#!/bin/sh
|
||
|
|
OUTPUT_DIR="''${1:-./stl}"
|
||
|
|
mkdir -p "$OUTPUT_DIR"
|
||
|
|
|
||
|
|
echo "Generating Cuatro STL files to $OUTPUT_DIR"
|
||
|
|
|
||
|
|
openscad -D 'tube_holes(row=1, fn=360);' -o "$OUTPUT_DIR/tube-holes.stl" ${placeholder "out"}/share/cuatro/parts.scad
|
||
|
|
openscad -D 'tubes(row=1);' -o "$OUTPUT_DIR/tubes.stl" ${placeholder "out"}/share/cuatro/parts.scad
|
||
|
|
openscad -D 'boxes(row=1);' -o "$OUTPUT_DIR/boxes.stl" ${placeholder "out"}/share/cuatro/parts.scad
|
||
|
|
openscad -D 'box_holes(row=1);' -o "$OUTPUT_DIR/box-holes.stl" ${placeholder "out"}/share/cuatro/parts.scad
|
||
|
|
openscad -o "$OUTPUT_DIR/all-pieces.stl" ${placeholder "out"}/share/cuatro/parts.scad
|
||
|
|
|
||
|
|
echo "STL files generated successfully!"
|
||
|
|
EOF
|
||
|
|
chmod +x $out/bin/cuatro-generate
|
||
|
|
'';
|
||
|
|
};
|
||
|
|
|
||
|
|
checks = {
|
||
|
|
openscad-syntax = pkgs.runCommand "cuatro-syntax-check" {
|
||
|
|
buildInputs = [ pkgs.openscad ];
|
||
|
|
} ''
|
||
|
|
# Check OpenSCAD syntax
|
||
|
|
openscad --check ${self}/parts.scad
|
||
|
|
touch $out
|
||
|
|
'';
|
||
|
|
|
||
|
|
stl-generation = pkgs.runCommand "cuatro-stl-test" {
|
||
|
|
buildInputs = [ pkgs.openscad ];
|
||
|
|
} ''
|
||
|
|
mkdir -p test-output
|
||
|
|
|
||
|
|
# Test STL generation
|
||
|
|
openscad -o test-output/test.stl ${self}/parts.scad
|
||
|
|
|
||
|
|
# Verify STL file was created and is not empty
|
||
|
|
if [ ! -s test-output/test.stl ]; then
|
||
|
|
echo "Error: STL file was not generated or is empty"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "STL generation test passed"
|
||
|
|
touch $out
|
||
|
|
'';
|
||
|
|
};
|
||
|
|
});
|
||
|
|
}
|