lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.3.2 vs lib/openstudio/analysis/translator/excel.rb in openstudio-analysis-0.3.3

- old
+ new

@@ -103,15 +103,17 @@ # verify that all continuous variables have all the data needed and create a name maps variable_names = [] @variables['data'].each do |measure| if measure['enabled'] measure['variables'].each do |variable| + + # Determine if row is suppose to be an argument or a variable to be perturbed. if variable['variable_type'] == 'variable' variable_names << variable['display_name'] - # make sure that the variable has a static value + # make sure that variables have static values if variable['distribution']['static_value'].nil? || variable['distribution']['static_value'] == '' fail "Variable #{measure['name']}:#{variable['name']} needs a static value" end if variable['type'] == 'enum' || variable['type'] == 'Choice' @@ -189,11 +191,11 @@ analysis_template = ERB.new(File.open("#{template_root}/analysis.json.erb", 'r').read) workflow_template = ERB.new(File.open("#{template_root}/workflow_item.json.erb", 'r').read) uncertain_variable_template = ERB.new(File.open("#{template_root}/uncertain_variable.json.erb", 'r').read) discrete_uncertain_variable_template = ERB.new(File.open("#{template_root}/discrete_uncertain_variable.json.erb", 'r').read) pivot_variable_template = ERB.new(File.open("#{template_root}/pivot_variable.json.erb", 'r').read) - argument_template = ERB.new(File.open("#{template_root}/argument.json.erb", 'r').read) + argument_template = ERB.new(File.read("#{template_root}/argument.json.erb")) # Templated analysis json file (this is what is returned) puts "Analysis name is #{@name}" openstudio_analysis_json = JSON.parse(analysis_template.result(get_binding)) @@ -345,45 +347,40 @@ # puts " Adding #{filename}" zipfile.add("./weather/#{File.basename(filename)}", filename) end # Add only the measures that are defined in the spreadsheet - added_measures = [] - measure_files = Dir.glob("#{@measure_path}/**/measure.rb") + required_measures = @variables['data'].map { |v| v['measure_file_name_directory'] if v['enabled'] }.compact.uniq - # go through each of the Variables - @variables['data'].each do |v| - measure_to_save = nil - measure_files.each do |measure| - # pp v['measure_file_name_directory'] - if measure.include? "/#{v['measure_file_name_directory']}/" - measure_to_save = File.dirname(measure) - # pp "Measure to save is #{measure}" - break + # first validate that all the measures exist + errors = [] + required_measures.each do |measure| + measure_dir_to_add = "#{@measure_path}/#{measure}" + + if Dir.exist? measure_dir_to_add + unless File.exist? "#{measure_dir_to_add}/measure.rb" + errors << "Measure in directory '#{@measure_path}/#{measure}' did not contain a measure.rb file" end + else + errors << "Could not find measure '#{measure}' in directory '#{@measure_path}'" end + end + fail errors.join("\n") unless errors.empty? - if measure_to_save && !added_measures.include?(measure_to_save) - # pp "Attempting to add measure #{measure_to_save}" - if File.exist?(measure_to_save) - # pp "Adding measure directory to zip #{measure_to_save}" - Dir[File.join(measure_to_save, '**')].each do |file| - if File.directory?(file) - if File.basename(file) == 'resources' || File.basename(file) == 'lib' - add_directory_to_zip(zipfile, file, "./measures/#{v['measure_file_name_directory']}/#{File.basename(file)}") - else - # pp "Skipping Directory #{File.basename(file)}" - end - else - # pp "Adding File #{file}" - # added_measures << measure_dir unless added_measures.include? measure_dir - zipfile.add(file.sub(measure_to_save, "./measures/#{v['measure_file_name_directory']}/"), file) - end + required_measures.each do |measure| + # pp "Adding measure directory to zip #{measure_to_save}" + Dir[File.join(measure, '**')].each do |file| + if File.directory?(file) + if File.basename(file) == 'resources' || File.basename(file) == 'lib' + add_directory_to_zip(zipfile, file, "./measures/#{v['measure_file_name_directory']}/#{File.basename(file)}") + else + # pp "Skipping Directory #{File.basename(file)}" end - added_measures << measure_to_save unless added_measures.include? measure_to_save else - fail "Could not find measure to add to zip for #{@measure_path}/#{v['measure_file_name_directory']}" + # pp "Adding File #{file}" + # added_measures << measure_dir unless added_measures.include? measure_dir + zipfile.add(file.sub(measure, "./measures/#{v['measure_file_name_directory']}/"), file) end end end # puts "Adding #{model[:path]}" @@ -555,11 +552,11 @@ v.to_i if v % 1 == 0 @problem["#{row[0].snake_case}"] = v end elsif b_algorithm_setup - if row[0] + if row[0] && !row[0].empty? v = row[1] v = v.to_i if v % 1 == 0 @algorithm["#{row[0].snake_case}"] = v end elsif b_weather_files @@ -605,16 +602,17 @@ # If you add a new column and you want that variable in the hash, then you must add it here. # rows = @xls.sheet('Variables').parse(:enabled => "# variable") # puts rows.inspect rows = nil begin - if @version >= '0.3.0'.to_version + if @version >= '0.3.3'.to_version rows = @xls.sheet('Variables').parse(enabled: '# variable', measure_name_or_var_type: 'type', measure_file_name_or_var_display_name: 'parameter display name.*', measure_file_name_directory: 'measure directory', measure_type_or_parameter_name_in_measure: 'parameter name in measure', + display_name_short: 'parameter short display name', #sampling_method: 'sampling method', variable_type: 'Variable Type', units: 'units', default_value: 'static.default value', enums: 'enumerations', @@ -628,10 +626,33 @@ distribution: 'distribution', source: 'data source', notes: 'notes', relation_to_eui: 'typical var to eui relationship', clean: true) + elsif @version >= '0.3.0'.to_version + rows = @xls.sheet('Variables').parse(enabled: '# variable', + measure_name_or_var_type: 'type', + measure_file_name_or_var_display_name: 'parameter display name.*', + measure_file_name_directory: 'measure directory', + measure_type_or_parameter_name_in_measure: 'parameter name in measure', + #sampling_method: 'sampling method', + variable_type: 'Variable Type', + units: 'units', + default_value: 'static.default value', + enums: 'enumerations', + min: 'min', + max: 'max', + mode: 'mean|mode', + stddev: 'std dev', + delta_x: 'delta.x', + discrete_values: 'discrete values', + discrete_weights: 'discrete weights', + distribution: 'distribution', + source: 'data source', + notes: 'notes', + relation_to_eui: 'typical var to eui relationship', + clean: true) elsif @version >= '0.2.0'.to_version rows = @xls.sheet('Variables').parse(enabled: '# variable', measure_name_or_var_type: 'type', measure_file_name_or_var_display_name: 'parameter display name.*', measure_file_name_directory: 'measure directory', @@ -743,10 +764,13 @@ variable_index += 1 var = {} var['variable_type'] = row[:measure_name_or_var_type] var['display_name'] = row[:measure_file_name_or_var_display_name] + var['display_name_short'] = row[:display_name_short] ? row[:display_name_short] : var['display_name'] + + # TODO: convert this to measure class and parameter name var['machine_name'] = row[:measure_file_name_or_var_display_name].downcase.strip.gsub('-', '_').gsub(' ', '_').strip var['name'] = row[:measure_type_or_parameter_name_in_measure] var['index'] = variable_index # order of the variable (not sure of its need) var['type'] = row[:variable_type] ? row[:variable_type].downcase : row[:variable_type] @@ -807,22 +831,35 @@ data end def parse_outputs rows = nil - if @version >= '0.3.0'.to_version + if @version >= '0.3.3'.to_version rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name', + display_name_short: 'Short Display Name', metadata_id: 'Taxonomy Identifier', name: '^Name$', units: 'Units', visualize: 'Visualize', export: 'Export', variable_type: 'Variable Type', objective_function: 'Objective Function', objective_function_target: 'Objective Function Target', scaling_factor: 'Scale', objective_function_group: 'Objective Function Group') + elsif @version >= '0.3.0'.to_version + rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name', + metadata_id: 'Taxonomy Identifier', + name: '^Name$', + units: 'Units', + visualize: 'Visualize', + export: 'Export', + variable_type: 'Variable Type', + objective_function: 'Objective Function', + objective_function_target: 'Objective Function Target', + scaling_factor: 'Scale', + objective_function_group: 'Objective Function Group') else rows = @xls.sheet('Outputs').parse(display_name: 'Variable Display Name', name: '^Name$', units: 'units', objective_function: 'objective function', @@ -845,9 +882,10 @@ rows.each_with_index do |row, icnt| next if icnt < 2 # skip the first 3 lines of the file var = {} var['display_name'] = row[:display_name] + var['display_name_short'] = row[:display_name_short] ? row[:display_name_short] : row[:display_name] var['metadata_id'] = row[:metadata_id] var['name'] = row[:name] var['units'] = row[:units] var['visualize'] = row[:visualize].downcase == 'true' ? true : false if row[:visualize] var['export'] = row[:export].downcase == 'true' ? true : false if row[:export]