[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: PCB Element Creation with Perl



Wow!  

I just visited your footprint website.  There is a *ton* of stuff
there!   Amazing!

Thank you for providing this valuable resource!  Some questions:

*  Are you thinking about asking the PCB guys to bundle this with the
PCB distribution, or do you prefer to keep in on your web page alone? 

*  Do you mind if I put a reference to your site in my next spin of
the Newlib footprint doc?

Stuart


> 
> I have released a Perl module that can be 
> used to create PCB elements. An example 
> program is listed below. I have also 
> placed my footprint library on my website.
> 
> The Perl module and documentation is at
> http://www.luciani.org/geda/pcb-footprint.html
> 
> The footprint library is at
> http://www.luciani.org/geda/pcb-footprint-list.html
> 
> The documentation is sparse. I will add 
> to the documentation as I release more examples.
> The documentation is best viewed using acroread in 
> Full Screen mode. In xpdf the Full Screen 
> button doesn't seem to work. Also the external 
> hyperlinks in the Bibliography seem to be
> broken.
> 
> 
> 
> -------------------- cut here ---------------------
> #!/usr/bin/perl
> 
> # Creates the PCB elements for Molex 8624 header 
> # connectors from 4 to 20 circuits.
> 
> use strict;
> use warnings;
> 
> use Pcb_3;
> 
> my $Pcb = Pcb_3 -> new(debug => 1);
> 
> my @Fields = qw(circuits body_length pin_row_length);
> 
> my @Def; # definitions that are common to all
> components
> 
> while () {
>     s/\#.*//; # Remove comments
>     s/^\s*//; # Remove leading spaces
>     s/\s*$//; # Revove trailing spaces
>     next unless length; # Skip empty lines
> 
>     # Lines that contain an '=' are global
> definitions.
> 
>     push(@Def, $1, $2), next if /(\S+)\s*=\s*(\S.*)/;
> 
>     my @values = split /\s*\|\s*/;
> 
>     # hash for each footprint
> 
>     my %f = ( @Def,
> 	      map { $_ => shift(@values) } @Fields);
> 
>     $Pcb -> element_begin(description => 'TH',
> 			  output_file => "tmp/" . 
>                             
> &package_name($f{package_prefix}, 
>                                           
> $f{circuits}, 
>                                           
> $f{pin_rows}),
> 			  input_dim   => 'mils',
> 			  pin_one_square => 1);
> 
>     my $pin_num = 1;
>     my $pins_per_row = $f{circuits} / 2;
> 
>     # lower left corner is pin one
> 
>     my $x = -$f{pin_spacing} * ($pins_per_row - 1) /
> 2;
>     my $y =  $f{row_spacing} / 2;
> 
>     # These header connectors consist of two rows of
> pins. 
>     # With pin one in the lower left corner we will
> place
>     # pins from left to right until half the pins are 
>     # placed. At the halfway point we will shift to
> the 
>     # top row and place pins from right to left.
> 
>     while ($pin_num <= $f{circuits}) {
> 	$Pcb -> element_add_pin(x => $x, y => $y,
> 				thickness  => 66,
> 				drill_hole => 46,
> 				pin_number => $pin_num);
> 
> 	# If this is the last pin in the row then
> 	# update the y value otherwise update the x 
> 	# value. If we are past the halfway point move
> 	# left (-) instead of right (+).
> 
> 	if ($pin_num == $pins_per_row) {
> 	    $y -= $f{row_spacing};
> 	} else {
> 	    $x += $pin_num > $pins_per_row 
> 		     ? -$f{pin_spacing}
> 	             : $f{pin_spacing};
> 	}
> 	$pin_num++;
>     }
> 
>     $Pcb -> element_add_rectangle(width =>
> $f{body_width},
> 				  length=> $f{body_length},
> 				  x => 0,
> 				  y => 0);
> 
> 
>     $Pcb -> element_set_text_xy(x =>
> -$f{body_length}/2,
> 				y => -$f{body_width}/2 - 20);
> 
> 
>     $Pcb -> element_output();
> }
> 
> sub package_name ($$$) { 
>     my ($prefix, $circuits, $rows) = @_;
>     sprintf("%s-%ix%i", $prefix, $circuits/$rows,
> $rows);
> }
> 
> 
> __DATA__
> 
> package_prefix = header-Molex-8624
> body_width = 200
> pin_spacing = 100
> row_spacing = 100
> pin_diameter = 35
> pin_rows = 2
> 
> # circuits | body_length | pin_row_length
> 
>   4        |    190      |     100 
>   6        |    290      |     200 
>   8        |    390      |     300 
>   10       |    490      |     400 
>   12       |    590      |     500 
>   14       |    690      |     600 
>   16       |    790      |     700 
>   18       |    890      |     800 
>   20       |    990      |     900 
> 
> 
>