Add bash script for running pcb2gcode (handle poroject name + separate drill runs)

This commit is contained in:
jonny 2024-11-15 22:49:41 +01:00
parent 6b49325fb4
commit c58bbd1090

147
utils/run-pcb2gcode.sh Executable file
View File

@ -0,0 +1,147 @@
#!/bin/bash
# Usage instruction
echo "================================================="
echo " PCB2GCODE SCRIPT "
echo "================================================="
echo "Uscase:"
echo "Automates G-code generation for PCB milling from KiCad files by running pcb2gcode twice: first for standard files (front, back, outline, PTH drills) and then for NPTH drills."
echo "It handles file paths dynamically based on the project name, ensures required files exist, renames debug outputs and deletes unnecessary files"
echo ""
echo "Usage:"
echo " ./run.sh [PROJECT_NAME]"
echo "If no PROJECT_NAME is provided, it will be derived from the parent folder name."
echo ""
echo "Requirements:"
echo " - The script must be run from a folder within the KiCad project."
echo " - A millproject config file must exist in the current folder."
echo " - KiCad files must be exported to ../export relative to the script's location."
echo ""
echo "Example:"
echo " Directory structure:"
echo " /home/user/git/project-name/pcb2gcode/"
echo " - run.sh (this script)"
echo " - millproject (config file)"
echo " /home/user/git/project-name/export/"
echo " - project-name-F_Cu.gbr"
echo " - project-name-B_Cu.gbr"
echo " - project-name-Edge_Cuts.gbr"
echo " - project-name-PTH.drl"
echo " - project-name-NPTH.drl"
echo ""
echo " To run the script:"
echo " cd /home/user/git/project-name/pcb2gcode"
echo " ./run.sh project-name"
echo "================================================="
echo ""
echo ""
# Define project name
# Extract project name from argument or parent folder
if [[ -n "$1" ]]; then
PROJECT_NAME="$1"
else
PROJECT_NAME=$(basename "$(dirname "$(pwd)")")
echo "No project name provided. Using folder name as project name: $PROJECT_NAME"
fi
# Define folders
INPUT_DIR="../export"
OUTPUT_DIR="./out"
# Define file paths
BACK_FILE="$INPUT_DIR/${PROJECT_NAME}-B_Cu.gbr"
FRONT_FILE="$INPUT_DIR/${PROJECT_NAME}-F_Cu.gbr"
OUTLINE_FILE="$INPUT_DIR/${PROJECT_NAME}-Edge_Cuts.gbr"
PTH_DRILL_FILE="$INPUT_DIR/${PROJECT_NAME}-PTH.drl"
NPTH_DRILL_FILE="$INPUT_DIR/${PROJECT_NAME}-NPTH.drl"
NPTH_DRILL_OUT_FILE="npth.ngc"
CONFIG_FILE="./millproject"
TEMP_CONFIG=$(mktemp)
# Additional options for pcb2gcode runs
PCB2GCODE_OPTIONS="2>&1 | grep -v 'Unsupported'" #-> do not output erros like:
#** (process:507955): CRITICAL **: 10:23:56.224: Unsupported G00 (rout mode) code at line 197 in file "../export/power-supply-board_v1.0-PTH.drl"
# Create output directory if it doesn't exist
mkdir -p "$OUTPUT_DIR"
# Function to append file paths to config file
append_file_paths() {
echo "==> run.sh: Appending file paths to config..."
echo "back=$BACK_FILE" >> "$1"
echo "front=$FRONT_FILE" >> "$1"
echo "outline=$OUTLINE_FILE" >> "$1"
echo "drill=$PTH_DRILL_FILE" >> "$1"
echo "output-dir=$OUTPUT_DIR" >> "$1"
}
# Function to check file existence
check_file() {
if [[ ! -f "$1" ]]; then
echo "==> run.sh: Warning: File not found: $1"
return 1
fi
return 0
}
# Run first pass: Generate front, back, outline, and PTH drilling
echo "================================================="
echo "=== initiating first run (front, back, holes) ==="
echo "================================================="
if check_file "$BACK_FILE" && check_file "$FRONT_FILE" && check_file "$OUTLINE_FILE" && check_file "$PTH_DRILL_FILE"; then
cp "$CONFIG_FILE" "$TEMP_CONFIG"
append_file_paths "$TEMP_CONFIG"
pcb2gcode --config "$TEMP_CONFIG"
echo "==> run.sh: First pass complete."
else
echo "==> run.sh: Skipping first pass due to missing files."
fi
# Run second pass: Generate NPTH drilling only
echo "==========================================="
echo "=== initiating second run for NPTH only ==="
echo "==========================================="
if check_file "$NPTH_DRILL_FILE"; then
cp "$CONFIG_FILE" "$TEMP_CONFIG"
echo "==> run.sh: Appending NPTH drill file to config..."
# rename original drill debug output image
echo "drill=$NPTH_DRILL_FILE" >> "$TEMP_CONFIG"
echo "drill-output=$NPTH_DRILL_OUT_FILE" >> "$TEMP_CONFIG"
echo "==> run.sh: Renaming drill debug image from previous run..."
mv "$OUTPUT_DIR"/original_drill.svg "$OUTPUT_DIR"/original_drill_normal.svg
pcb2gcode --config "$TEMP_CONFIG"
mv "$OUTPUT_DIR"/original_drill.svg "$OUTPUT_DIR"/original_drill_NPTH.svg
echo "==> run.sh: Second pass complete."
else
echo "==> run.sh: Skipping second pass due to missing NPTH file: $NPTH_DRILL_FILE"
fi
# Clean up temporary config file
rm -f "$TEMP_CONFIG"
# Delete unwanted files
echo "==> run.sh: Deleting unwanted files..."
rm -f "$OUTPUT_DIR"/*contentions*.svg \
"$OUTPUT_DIR"/*original_outline.svg \
"$OUTPUT_DIR"/*original_front.svg \
"$OUTPUT_DIR"/*original_back.svg \
"$OUTPUT_DIR"/*processed_front.svg \
"$OUTPUT_DIR"/*processed_back.svg \
"$OUTPUT_DIR"/*processed_outline.svg \
"$OUTPUT_DIR"/*traced*.svg \
"$OUTPUT_DIR"/*masked*.svg \
"$OUTPUT_DIR"/*contentions*.svg
echo "==> run.sh: G-code generation complete. Output saved in $OUTPUT_DIR."