> Getting a working solder stencil with minimal intervention gets me
> closer to robots.

I'll attach the script I used to "fix" the paste for my furnace board.

> 1) tweak flex and bison to recognize "Paste"
> 2) clone Pad data structure allocation and manipulation code
> 3) during parse, tuck away paste information as encountered
> 4) during parse, if an element is closed without encountering a paste 
> directive, synthesize paste directives that are copies of the pad 
> directives. (Preserves upward compatibility with existing footprint.)
> 5) tweak the printout code to look at the paste data instead of the pad 
> data.

That would be the way.  Don't forget about rotating elements, and undo.


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

while (<>) {

    if (/^\s*\)\s*$/) {
        $flag = 0;
    }

    if (/Element\[\"[^\"]*\" \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\"/) {
        $element = $1;
        $refdes = $2;
        $value = $3;
        $element = "$element $refdes $value";
#       printf STDERR "Element: $element\n";
    }

    if (/Element\[.* "" "" "" /) {
        while (! /^\s*\)\s*$/) {
            $_ = <>;
        }
        next;
    }

    if (($x1, $y1, $x2, $y2, $thick, $rest) =
        /Pad\[([\d-]+) ([\d-]+) ([\d-]+) ([\d-]+) ([\d-]+) (.*)\]/) {

        $cx = ($x1 + $x2) / 2;
        $cy = ($y1 + $y2) / 2;
        $w = &abs($x1 - $x2);
        $h = &abs($y1 - $y2);

        if ($element =~ /tqfp32/i) {
            if ($x1 == $x2) {
                $cy += ($y1 < 0) ? 2000 : -2000;
            } else {
                $cx += ($x1 < 0) ? 2000 : -2000;
            }
        }


        if ($element =~ /gumstix/i) {
            #$thick = 330;
            $thick = 1180 - 300*2;
            if ($x1 < 0) {
                $x1 = -6500 - $thick/2;
                $x2 = -9500 + $thick/2;
            } else {
                $x1 = 6500 + $thick/2;
                $x2 = 9500 - $thick/2;
            }
        } else {
            #$thick *= 0.5;
            $thick *= 0.75;
            $x1 = $cx - $w/4;
            $x2 = $cx + $w/4;
            $y1 = $cy - $h/4;
            $y2 = $cy + $h/4;
        }

        printf "\tPad[%d %d %d %d %d %s]\n", $x1, $y1, $x2, $y2, $thick, $rest;

    } else {
        print;
    }
}

sub abs {
    my ($v) = @_;
    return $v < 0 ? -$v : $v;
}


_______________________________________________
geda-user mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user

Reply via email to