orig/objview.rb
author Axel Jacobs <axel@jaloxa.eu>
Mon, 14 Apr 2014 22:21:17 +0100
changeset 73 87fa3132a136
parent 39 0216da79ade0
permissions -rwxr-xr-x
New IES test file with spaces in file name
     1 #!/usr/bin/env ruby
     2 # RCSid: $Id$
     3 #
     4 # objview.rb, v1.1 2012.07.04 RPG
     5 # Ruby port of objview.csh
     6 #
     7 # Make a nice view of an object, or luminaire
     8 # Arguments are scene input files
     9 #
    10 
    11 require 'optparse'
    12 require 'ostruct'
    13 require 'tempfile'
    14 
    15 class Optparse
    16   #
    17   # Return a structure describing the options.
    18   #
    19   def self.parse(args)
    20     # The options specified on the command line will be collected in *options*.
    21     options = OpenStruct.new
    22  
    23     opts = OptionParser.new do |opts|
    24       opts.banner = "Usage: (ruby) objview.rb [options] [radiance scene input files]"
    25 
    26       opts.separator ""
    27       opts.separator "Options:"
    28       
    29       options.radopt = []
    30       options.glradopt = []
    31       
    32       options.up = "Z"
    33       opts.on("-u, --up", String, [:X, :Y, :Z], "View up vector (X, Y, or Z)") do |n|
    34         options.up = n
    35       end
    36       
    37       #Specify display device (qt is only option for Windows)
    38       if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM)
    39         options.dev = "qt"
    40       else
    41         options.dev = "x11"
    42       end
    43       opts.on("-o, --odev", String, [:x11, :qt], "Output device (x11 or qt)") do |n|
    44         options.dev = n
    45         options.radopt << "-o #{options.dev}"
    46       end
    47       
    48       options.procs = "1"
    49       opts.on("-N, --nprocs", String, "Number of processors (UNIX ony)") do |n|
    50         options.procs = n
    51         options.radopt << "-N #{options.procs}"
    52       end
    53       
    54       options.vw = "XYZ"
    55       opts.on("-v", "--view", String, "View specification") do |n|
    56         options.view = n
    57         options.radopt << "-v #{options.view}"
    58       end
    59      
    60       options.ltv = false
    61       opts.on("-l", "--ltview", "Luminaire viewer mode") do |n|
    62         options.ltv = true
    63         options.vw = "y"
    64       end
    65       
    66       #set "room" size for ltview, default is 4' square box (in meters)
    67       options.rsiz = "0.6096"
    68       opts.on("-r", "--roomsize", String, "Room scaling factor for ltview") do |n|
    69         options.rsiz = n
    70       end
    71       
    72       opts.on("-d", "--debug", "Run verbosely") do |n|
    73         options.verbose = true
    74       end
    75       
    76       opts.on("-g", "--ogl", "Use OpenGL (glrad)") do |n|
    77         options.ogl = true
    78       end
    79       
    80       opts.on("-e", "--rad", "Set rad options") do |n|
    81         options.radopt << n
    82       end
    83       
    84       opts.on("-S", "--glrad", "Set glrad options") do |n|
    85         options.glradopt = "-S #{n}"
    86       end     
    87       
    88       # No argument, shows at tail.  This will print an options summary.
    89       opts.on_tail("-h", "--help", "Show this message") do
    90         puts opts
    91         exit
    92       end
    93       
    94     end
    95     
    96     opts.parse!(args)
    97     options
    98     
    99   end  # parse()
   100   
   101 end  # class Optparse
   102 
   103 options = Optparse.parse(ARGV)
   104 
   105 # utility function: print statement and execute as system call
   106 def exec_statement(s)
   107   if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM)
   108     s = s.gsub("/", "\\")
   109   end
   110   puts "'#{s}'"
   111   result = system(s)
   112   puts
   113   return result
   114 end
   115 
   116 exec = "system"
   117 if options.verbose == true
   118   puts options
   119   puts "Input file(s): #{ARGV}"
   120   exec = "exec_statement"
   121 end
   122 
   123 #not needed(?)
   124 #octree = Tempfile.new(['objview_', '.oct'])
   125 #ambf = Tempfile.new(['objview_', '.amb'])
   126 
   127 if options.ltv == true
   128   rendopts = "-ab 1 -ds .15"
   129 end
   130 
   131 # not sure how these options are supposed to work... RPG
   132 #
   133 # 	case -s:
   134 # 	case -w:
   135 # 		set opts=($opts $argv[1])
   136 # 		breaksw
   137 # 	case -b*:
   138 # 		set rendopts=($rendopts -bv)
   139 # 		breaksw
   140 # 	case -V:
   141 #
   142 
   143 
   144 if not ARGV[0]
   145   puts "No input files specified"
   146   exit 1
   147 end
   148   
   149 if options.ogl == true
   150   if rendopts
   151     puts "bad option for glrad"
   152     exit 1
   153   else
   154     if options.glradopt == true 
   155       puts "bad option for rad"
   156       exit 1
   157     end
   158   end  
   159 end
   160 
   161 if options.ltv == false
   162   # create lights input file for objview
   163   lights = Tempfile.new(['lt_', '.rad'])
   164   lights.write("void glow dim 0 0 4 .1 .1 .15 0\n")
   165   lights.write("dim source background 0 0 4 0 0 1 360\n")
   166   lights.write("void light bright 0 0 3 1000 1000 1000\n")
   167   lights.write("bright source sun1 0 0 4 1 .2 1 5\n")
   168   lights.write("bright source sun2 0 0 4 .3 1 1 5\n")
   169   lights.write("bright source sun3 0 0 4 -1 -.7 1 5\n")
   170   if options.verbose == true
   171     lights.rewind
   172     lightsread = lights.read
   173     puts "\nlights file:"
   174     puts lightsread
   175   end
   176   lights.close
   177 end
   178 
   179 if options.ltv == true
   180   #create room input file for ltview
   181   room = Tempfile.new(['lt_', '.rad'])
   182   room.write("void plastic surf\n0\n0\n5\n.2 .2 .2 0 0\n\n")
   183   room.write("surf polygon floor\n0\n0\n12\n")
   184   room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
   185   room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
   186   room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
   187   room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n\n")
   188 
   189   room.write("surf polygon clg\n0\n0\n12\n")
   190   room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
   191   room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
   192   room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
   193   room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")
   194 
   195   room.write("surf polygon wall-north\n0\n0\n12\n")
   196   room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
   197   room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
   198   room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
   199   room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")
   200 
   201   room.write("surf polygon wall-east\n0\n0\n12\n")
   202   room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
   203   room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
   204   room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
   205   room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")  
   206   
   207   room.write("surf polygon wall-west\n0\n0\n12\n")
   208   room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
   209   room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
   210   room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
   211   room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n\n")
   212   if options.verbose == true
   213     room.rewind
   214     roomread = room.read
   215     puts "\nroom file:"
   216     puts roomread
   217   end
   218   room.close
   219 end
   220 
   221 # create .rif file
   222 rif = Tempfile.new(['ov_', '.rif'])
   223 if options.ltv == true
   224   rif.write("scene= #{ARGV.join(' ')} #{room.path}\n")
   225 else
   226   rif.write("scene= #{ARGV.join(' ')} #{lights.path}\n")
   227 end
   228 rif.write("EXPOSURE= .5\n")
   229 rif.write("UP= #{options.up}\n")
   230 rif.write("view= #{options.vw}\n")
   231 rif.write("oconv= -f\n")
   232 rif.write("render= #{rendopts}\n")
   233 #doesn't rad handle the construction and destruction of these files (below) on its own? RPG
   234 #rif.write("OCTREE= #{octree.path}\n")
   235 #rif.write("AMBF= #{ambf.path}\n")
   236 if options.verbose == true
   237   rif.rewind
   238   rifread = rif.read
   239   puts "\nrif file:"
   240   puts rifread
   241 end
   242 rif.close
   243 
   244 puts "radopt = #{options.radopt.join(" ")}"
   245 
   246 #run executive control program of choice
   247 if options.ogl == true
   248   exec("glrad #{options.radopt.join(" ")} #{rif.path}")
   249 else
   250   exec("rad -o #{options.dev} #{options.radopt.join(" ")} #{rif.path}")
   251 end
   252 
   253 # clean up temp files
   254 if coptions.ltv == true
   255   room.unlink
   256 else  
   257   lights.unlink
   258 end
   259 rif.unlink
   260 #ambf.unlink
   261 #octree.unlink
   262 
   263 exit 0
   264