[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
gEDA-user: PCB Element Creation with Perl
- To: geda-user@xxxxxxxxxxxxx
- Subject: gEDA-user: PCB Element Creation with Perl
- From: John Luciani <jcljr58@xxxxxxxxx>
- Date: Mon, 7 Feb 2005 19:33:34 -0800 (PST)
- Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys
- Delivered-to: archiver@seul.org
- Delivered-to: geda-user-outgoing@seul.org
- Delivered-to: geda-user@moria.seul.org
- Delivery-date: Mon, 07 Feb 2005 22:34:19 -0500
- Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; b=Zz+QZ71GokJK58WNLrA0flYJNzQWGYsToUrX4jM8gmLfKxgY44UTQe5tbqlVM5d3wRrn4xa9C6+8SC1mzfvsFQ4azybvGg+LODQ06uJdXSGAUYwqFRRu8Gkqomt8aU7vgsr/Bip1EMs0qmd6CsRz9D2E8/wRzsY/bC4Z269sitA= ;
- Reply-to: geda-user@xxxxxxxx
- Sender: owner-geda-user@xxxxxxxx
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