--- ray/src/util/ltview.pl 2014/04/15 22:36:25 2.1 +++ ray/src/util/ltview.pl 2014/04/16 20:32:00 2.2 @@ -10,98 +10,87 @@ use strict; use warnings; use Math::Trig; -use File::Copy qw(copy); use File::Temp qw/ tempdir /; -my $td = tempdir( CLEANUP => 1 ); -my $oct = "$td/ltview.oct"; -my $room = "$td/room.rad"; -my $box; # Overall box dimensions -my $default_box = 10; # Default box dimensions -my $rif = "$td/ltview.rif"; -my $lumi = "$td/lumi.rad"; # Fitting as given on cmd line, or generated by ies2rad -my $lumi2 = "$td/lumi2.rad"; # Fitting scaled to max unity -my $raddev = "x11"; # default output device. Overwrite with -o -my $is_ies = 0; # input file is IES photometry, not a Radiance luminaire +my $td = tempdir( CLEANUP => 1 ); +my $oct = "$td/ltview.oct"; +my $room = "$td/room.rad"; +my $box; # Overall box dimensions +my $rif = "$td/ltview.rif"; +my $lumi = "$td/lumi.rad"; # Fitting as given on cmd line, or generated by ies2rad +my $lumi2 = "$td/lumi2.rad"; # Fitting centred at origin +my $raddev = "x11"; # Default output device. Overwrite with -o +my $is_ies = 0; # Input file is IES photometry, not a Radiance luminaire -my $maxscale = 1; # Maximum luminiare dimension after scaling -my $opts = ""; # Options common to rad and glrad -my $render = "-ab 1 -ds .15 -av 0 0 0"; # render= line in rif file -my $radopt = 0; # An option specific to rad was passed (Boolean). - while (@ARGV) { - $_ = $ARGV[0]; - if (m/-i/) { - $is_ies = 1; - } elsif (m/-o/) { # output device (rvu -devices) - $raddev = $ARGV[1]; - $radopt = 1; - shift @ARGV; - } elsif (m/-b/) { - $box = $ARGV[1]; # Box dimensions - shift @ARGV; - } elsif (m/^-\w/) { - die("objview: Bad option: '$_'\n"); - } else { - last; - } - shift @ARGV; + $_ = $ARGV[0]; + if (m/-i/) { + $is_ies = 1; + } elsif (m/-o/) { # output device (rvu -devices) + $raddev = $ARGV[1]; + shift @ARGV; + } elsif (m/-b/) { + $box = $ARGV[1]; # Box dimensions + shift @ARGV; + } elsif (m/^-\w/) { + die("ltview: Bad option: '$_'\n"); + } else { + last; + } + shift @ARGV; } # We need exactly one Radiance luminaires or IES file -if (! $#ARGV == 0) { - die("ltview: Need one Radiance luminaire or IES file.\n"); -} +if ( !$#ARGV == 0 ) { + die("ltview: Need one Radiance luminaire or IES file.\n"); +} elsif ( $is_ies == 0 ) { -if ($is_ies == 0) { - # Input file is a Radiance luminaire - $lumi = $ARGV[0]; + # Input file is a Radiance luminaire + $lumi = $ARGV[0]; } else { - # Input file is IES photometry - system "ies2rad -p $td -o lumi $ARGV[0]"; + + # Input file is IES photometry + system qq[ ies2rad -p $td -o lumi "$ARGV[0]" ]; } +# Work out centre of luminaire +my $dimstr = `getbbox -h "$lumi"`; +chomp $dimstr; -open(FH, ">$room") or - die("ltview: Can't write to temporary file '$room'\n"); -print FH "void plastic wall_mat 0 0 5 .2 .2 .2 0 0\n"; +# Values returned by getbbox are indented and delimited with multiple spaces. +$dimstr =~ s/^\s+//; # remove leading spaces +my @dims = split( /\s+/, $dimstr ); # convert to array +# Find largest axes-aligned luminaire dimension +# The box will be ten times as large, unless overwritten with -b option. +my @diffs = reverse sort { $a <=> $b } + ( $dims[1] - $dims[0], $dims[3] - $dims[2], $dims[5] - $dims[4] ); +my $lsize = $diffs[0]; + +# Centre fitting at origin +my $xtrans = -1.0 * ( $dims[0] + $dims[1] ) / 2; +my $ytrans = -1.0 * ( $dims[2] + $dims[3] ) / 2; +my $ztrans = -1.0 * ( $dims[4] + $dims[5] ) / 2; +system qq[ xform -t $xtrans $ytrans $ztrans "$lumi" > $lumi2 ]; + +# Make the enclosing box my $b2; -if (defined $box) { - # Room dimensions are giving explicitly. Don't touch the fitting. - $b2 = $box / 2; +if ( defined $box ) { - $lumi2 = $ARGV[0]; + # Room dimensions are giving explicitly. + $b2 = $box / 2; } else { - # Scale fitting so it fits nicely into our default test room. - $b2 = $default_box; # Default room dimension - # Work out how large the luminaire is and scale so that the longest - # axis-align dimension is $maxscale - my $dimstr = `getbbox -h $lumi`; - chomp $dimstr; - # Values returned by getbbox are indented and delimited with multiple spaces. - $dimstr =~ s/^\s+//; # remove leading spaces - my @dims = split(/\s+/, $dimstr); # convert to array - - # Find largest axes-aligned dimension - my @diffs = ($dims[1]-$dims[0], $dims[3]-$dims[2], $dims[5]-$dims[4]); - @diffs = reverse sort { $a <=> $b } @diffs; - my $size = $diffs[0]; - - # Move objects so centre is at origin - my $xtrans = -1.0 * ($dims[0] + $dims[1]) / 2; - my $ytrans = -1.0 * ($dims[2] + $dims[3]) / 2; - my $ztrans = -1.0 * ($dims[4] + $dims[5]) / 2; - # Scale so that largest object dimension is $maxscale - my $scale = $maxscale / $size; - - #system "xform -t $xtrans $ytrans $ztrans -s $scale $ARGV[0] > $lumi"; - system "xform -t $xtrans $ytrans $ztrans -s $scale $lumi > $lumi2"; + # Box dimensions are ten times largest luminaire bbox dimensions. + $b2 = $lsize * 10.0 / 2.0; } +open( FH, ">$room" ) + or die("ltview: Can't write to temporary file '$room'\n"); print FH <$rif") or - die("ltview: Can't write to temporary file '$rif'\n"); +open( FH, ">$rif" ) + or die("ltview: Can't write to temporary file '$rif'\n"); print FH <