diff --git a/cameo/fped2stl.pl b/cameo/fped2stl.pl new file mode 100755 index 0000000..109b50c --- /dev/null +++ b/cameo/fped2stl.pl @@ -0,0 +1,82 @@ +#!/usr/bin/perl +# +# fped2stl.pl - Convert fped 2D stacks to STL meshes +# +# Written 2013 by Werner Almesberger +# Copyright 2013 Werner Almesberger +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# + + +use POSIX; + +sub usage +{ + print STDERR "usage: $0 prefix [file ...]\n\n"; + exit(1); +} + + +sub flush +{ + local ($z1) = sprintf("%e", $_[0]); + + $z = sprintf("%e", $z); + return unless defined $s; +print STDERR "$name $z ...\n"; + $^F = 20; + pipe SR, SW; + pipe RR, RW; + $pid = fork(); + if (!$pid) { + close SW; + close RR; + $sn = fileno SR; + $rn = fileno RW; + open(PIPE, "|cameo >/dev/fd/$rn") || die "cameo: $!"; + print PIPE "gnuplot 0mm /dev/fd/$sn\n"; + print PIPE "stl\n"; + close PIPE; + exit; + } + close SR; + close RW; + + print SW $s; + close SW; + + while () { + s/cameo/$name/; + s/(vertex.*)0\.0*e\+00$/$1$z/; + s/(vertex.*)1\.0*e\+00$/$1$z1/; + print; + } + close RR; +} + + +&usage if $ARGV[0] =~ /^-[^0-9]/; + +$pfx = shift @ARGV; +&usage unless defined $pfx; + +$skip = 1; +while (<>) { + if (/^# $pfx(.*?)-(\d+(\.\d*)?)\s*$/) { + &flush($2); + $name = $1; + $z = $2; + undef $s; + $skip = 0; + } elsif (/^# /) { + $skip = 1; + } + next if $skip; + next if /^#/; + $s .= $_; +} +&flush(0);