On Tue, Feb 17, 2009 at 04:42:12PM +0000, carzr...@optonline.net wrote: > > So here's the plan: > 1. Place and route all the parts of one hierarchical block, for example > S1/S101. > 2. Select all the parts from S2/S101 and delete them ( I don't think there's > a 'delete > selected' menu, but 'cut to buffer' should work out). > 3. Copy/paste S1/S101. For now, there's going to be 2 copies of > S1/S101/partNum. > 4. Select the copied section. > 5. Save the layout. I noticed that the .pcb file retains the the attribute > 'selected' which will > help me filter the file. > 6. Filter the file, renaming all the 'selected' parts that match 'S1/S101' > with 'S2/S101'.
I planned my subcircuit layout in Inkscape (free vector drawing program) because I wanted a graphical representation anyway. When it came time to place the subcircuits, I decided to try to re-use the drawing. It's saved as SVG (XML) and SVG::Parser makes it pretty easy to work with in perl. Inkscape has a 'label' attribute for objects (becomes 'inkscape:label' in the XML). My script looks for objects with labels and creates a copy of the subcircuit with the refdes's modified for each one. At the same time it makes a PCB script (for use with :ExecuteFile()) to place all of the copies. I never did work out exactly what the 'mark' was in a pasted file, but it didn't matter much for my application. I've attached the script. -- Ben Jackson AD7GD <b...@ben.com> http://www.ben.com/
#!/usr/bin/perl use warnings; use strict; use SVG::Parser; use Data::Dumper; # px to mil, 90 dpi sub S { $_[0] / 90 * 1000 } my $xml = do { local $/ = undef; <> }; my $parser = new SVG::Parser(); my $svg = $parser->parse($xml); open PCB_SRC, "onekey.pcb" || die "can't open src: $!"; my $pcb_src = do { local $/ = undef; <PCB_SRC> }; my @rects = $svg->getElements('rect'); foreach my $r (@rects) { my $refdes = $r->getAttribute('inkscape:label'); my $x = S($r->getAttribute('x')); my $y = S($r->getAttribute('y')); my $w = S($r->getAttribute('width')); my $h = S($r->getAttribute('height')); #print "$refdes ($x, $y) $w x $h\n"; $x = $x + $w / 2; $y = $y + $h / 2 + 2000 + 1000; my $wide = ($w > 1400); my $pcb_copy = $pcb_src; $pcb_copy =~ s/"X\?/"$refdes/g; open COPY, ">tmp/copy_$refdes.pcb"; print COPY $pcb_copy; close COPY; printf "LoadFrom(LayoutToBuffer, tmp/copy_$refdes.pcb)\n"; printf "PasteBuffer(ToLayout,%d,%d,mil)\n", int($x), int($y)+2; }
_______________________________________________ geda-user mailing list geda-user@moria.seul.org http://www.seul.org/cgi-bin/mailman/listinfo/geda-user