Install this plugin:

http://www.delorie.com/pcb/boardflip.c

And use this script (boardflip):

#!/bin/sh
# -*- sh -*-

FILE=$1
OUTFILE=$2

if [ x"$OUTFILE" = x"" ]
then
  OUTFILE=$FILE
  mv $FILE $FILE.preflip
  FILE=$FILE.preflip
fi

pcb --action-string "BoardFlip(sides) SaveTo(LayoutAs,$OUTFILE) Quit()" $FILE

Like this:

PCB = \
        mypcb1.pcb \
        mypcb2.pcb 

PCF = $(PCB:.pcb=.pcf)

all : $(PCF) grouped.pnl grouped.pcb
        @true

grouped.pnl :
        pcb2panel $(PCB) $(PCF) > grouped.pnl
        exit 1

grouped.pcb : grouped.pnl $(PCB) $(PCF)
        panel2pcb grouped.pnl     # from gedasymbols
        drillhelper grouped.pcb   # optional

%.pcf : %.pcb
        boardflip $< $...@.tmp
        ./swaplayers < $...@.tmp > $@
        rm $...@.tmp


This is ./swaplayers (boardflip doesn't quite get this right):

#!/usr/bin/perl
# -*- perl -*-

while (<>) {
    print;
    if (/Groups\("(.*)"\)/) {
        print STDERR "Groups: <$1>\n";
        @groups = split(':', $1);
        for $g (@groups) {
            print STDERR "Group: <$g>\n";
            @layers = split(',', $g);
            for $l (@layers) {
                print STDERR "Layer: <$l>\n";
                if ($l eq "s") {
                    $solder = &max(@layers);
                }
                if ($l eq "c") {
                    $component = &min(@layers);
                }
            }
        }
        last;
    }
}

print STDERR "C: $component  S: $solder\n";

while (<>) {
    if (/^Layer\((\d+)(.*)/) {
        $l = $1;
        $j = $2;
        if ($l >= $component && $l <= $solder) {
            $n = ($solder+$component) - $l;
            print STDERR "L: $l -> $n\n";
            s/Layer\(\d+/Layer\($n/;
        }
    }
    if (/thermal\(([^\)]*)\)/) {
        @t = ();
        $old = $1;
        for $t (split (',', $old)) {
            $t =~ s/(\d+)/($component+$solder-2)-$1/ge;
            push (@t, $t);
        }
        $t = join(',', sort @t);
        s/thermal\([^\)]*\)/thermal($t)/;
    }
    print;
}

exit 0;


sub max {
    my (@m) = @_;
    my ($v, $vv) = $m[0];
    for $vv (@m) {
        $v = $vv if $vv =~ /\d/ && $v < $vv;
    }
    print STDERR "max ", join(', ', @m), " = ", $v;
    return $v;
}
sub min {
    my (@m) = @_;
    my ($v, $vv) = $m[0];
    for $vv (@m) {
        $v = $vv if $vv =~ /\d/ && $v > $vv;
    }
    print STDERR "min ", join(', ', @m), " = ", $v;
    return $v;
}


_______________________________________________
geda-user mailing list
geda-user@moria.seul.org
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user

Reply via email to