#!/usr/bin/perl use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use LDraw::Parser; use Getopt::Long; my $opts = {}; GetOptions( $opts, 'help', 'scale=s', 'ldrawdir=s', 'file=s', 'debug', 'json', 'nomodel', 'invert', ); if (!keys %{$opts}) { print_usage(); exit 0; } if ($opts->{help}) { print_usage(); exit 0; } if (!$opts->{file}) { print "ERROR: --file is required! (try --help)\n"; exit 1; } sub print_usage { print < [--scale= --ldrawdir=/usr/share/ldraw] Takes an ldraw part .dat file as input and converts it into an STL file. --file The full path to the input .dat part file. Regardless of where this file is, sub-parts of the file will be searched in --ldrawdir. --scale Also scale the STL by N. This is separate from the LDU scaling that is used to convert internally from LDU (LDraw Unit) to mm (STL). --ldrawdir The location of the ldraw parts library package. Note: it is expected that this contains the directories "p", "parts" and "models". The Debian non-free package "ldraw-parts" installs to /usr/share/ldraw and that is the default value for this tool. --debug Print debugging messages to STDERR --json Dump the model as a json object in the form: {"normals":[],"vertexes":[]} Note: the surface normal of the triangle is duplicated for each of the 3 vertexes in the triangle, so these can be loaded into GL buffers and rendered with glDrawArrays. --nomodel Do not print the stl output. I am using this to run the script over all parts to try to detect issues. --invert Invert the part. Used for debugging. END } my $parser = LDraw::Parser->new({ file => $opts->{file}, $opts->{scale} ? ( scale => $opts->{scale} ) : (), $opts->{ldrawdir} ? ( ldraw_path => $opts->{ldrawdir} ) : (), $opts->{debug} ? ( debug => 1 ) : (), $opts->{invert} ? ( invert => 1 ) : (), }); $parser->parse; if ($opts->{json}) { my $data = $parser->gl_buffer; print '{"normals":['; print join(',', @{$data->{normals}}); print '],"vertexes":['; print join(',', @{$data->{vertexes}}); print ']}'; print "\n"; exit 0; } if ($opts->{nomodel}) { exit 0; } print $parser->to_stl;