#!/usr/bin/perl # Convert binary STL files to ASCII STL for inspection. foreach $arg (@ARGV) { open(INPUT, $arg) || die "$arg: $!"; binmode(INPUT); $name = $arg; $name = $1 if $name =~ /^(\w+)/; print "solid $name\n"; # The input file starts witn an 80 character header. read(INPUT, $buf, 80) || die "header $arg: $!"; # print "$arg: $buf\n" if $buf ne ""; # Next is the count of triangles. read(INPUT, $count, 4) || die "count $arg: $!"; $count = unpack("L", $count); # print "$count triangles\n"; for ($i = 0; $i < $count; $i++) { read(INPUT, $buf, 50) || die "$arg: triangle $i: $!"; ($nx, $ny, $nz, $x1, $y1, $z1, $x2, $y2, $z2, $x3, $y3, $z3, $attr) = unpack("ffffffffffffS", $buf); printf "facet normal %f %f %f\n", $nx, $ny, $nz; printf " outer loop\n"; printf " vertex %f %f %f\n", $x1, $y1, $z1; printf " vertex %f %f %f\n", $x2, $y2, $z2; printf " vertex %f %f %f\n", $x3, $y3, $z3; printf " endloop\n"; printf "endfacet\n"; warn "$arg: triangle $i: attr == ", $attr unless $attr == 0; } print "endsolid $name\n"; }