#!/bin/sh
#
# prettygerbv - Use gerbv to generate "pretty" views of a PCB
#
# Written 2011, 2013 by Werner Almesberger
# Copyright 2011, 2013 Werner Almesberger
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#


COPPER="(cons 'color #(65535 50401 10000))"
PASTE="(cons 'color #(39083 39083 50000))"
MASK="(cons 'inverted #t) (cons 'color #(8839 53994 8178))"
SILK="(cons 'color #(65535 65535 65535))"
EDGE="(cons 'color #(65535 65535 0))"
DRILL="(cons 'color #(0 0 40000))"

FRONT="(cons 'color #(65535 10000 10000))"
BACK="(cons 'color #(30000 65535 30000))"
EDGE2="(cons 'color #(30000 40000 65535))"


usage()
{
	cat <<EOF 1>&2
usage: $0 [-y] [-d file] project-name view png-file

  view  "front", "back", "conn", "all"

  -d file   also use drill file (converted to Gerber)
EOF
	exit 1
}


layers_begin()
{
	curr_layer=$1
	echo '(gerbv-file-version! "2.0A")' >_gvp
}


layer()
{
	file=$1
	shift
	[ -e "$file" ] || return
	cat <<EOF >>_gvp
(define-layer! $curr_layer (cons 'filename "$file") $*)
EOF
	curr_layer=`expr $curr_layer - 1`
}


choose()
{
	if [ -e "$1-$3" ]; then
		echo "$1-$3"
	else
		echo "$1-$2"
	fi
}


layers_end()
{
	echo '(set-render-type! 2)' >>_gvp
}


run_gerbv()
{
	gerbv -p _gvp --dpi=600 -x png -o "$1"
}


front()
{
	layers_begin 5
	layer `choose $NAME Front.gtl F_Cu.gtl` $COPPER
	[ "$drill" ] && layer $drill $DRILL
	layer `choose $NAME SoldP_Front.gtp F_Paste.gtp` $PASTE
	layer `choose $NAME Mask_Front.gts F_Mask.gts` $INV $MASK
	layer `choose $NAME SilkS_Front.gto F_SilkS.gto` $SILK
	layer `choose $NAME PCB_Edges.gbr Edge_Cuts.gbr` $EDGE
	layers_end

	run_gerbv "$1"
}


back()
{
	layers_begin 5
	layer `choose $NAME Back.gbl B_Cu.gbl` $COPPER
	[ "$drill" ] && layer $drill $DRILL
	layer `choose $NAME SoldP_Back.gbp B_Paste.gbp` $PASTE
	layer `choose $NAME Mask_Back.gbs B_Mask.gbs` $INV $MASK
	layer `choose $NAME SilkS_Back.gbo B_SilkS.gbo` $SILK
	layer `choose $NAME PCB_Edges.gbr Edge_Cuts.gbr` $EDGE
	layers_end

	run_gerbv _tmp.png
	convert -flop _tmp.png "$1"
	rm -f _tmp.png
}


conn()
{
	layers_begin 3
	layer `choose $NAME Back.gbl B_Cu.gbl` $BACK
	layer `choose $NAME Front.gtl F_Cu.gtl` $FRONT
	layer `choose $NAME PCB_Edges.gbr Edge_Cuts.gbr` $EDGE2
	layers_end

	run_gerbv "$1"
}


all()
{
	front _front.png
	back _back.png
	conn _conn.png
	montage -geometry +4+4 $tile _front.png _back.png _conn.png "$1"
	rm -f _front.png _back.png _conn.png
}

tile=
if [ "$1" = -y ]; then
	tile="-tile 1x3"
	shift
fi

drill=
if [ "$1" = -d ]; then
	drill=$2
	shift 2
fi

[ "$4" ] && usage
[ ! "$3" ] && usage

NAME=$1
OUT=$3

case "$2" in
	front|back|conn) ;;
	all) ;;
	*)	usage;;
esac

$2 "$OUT"

rm -f _gvp