lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.1.9 vs lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.1.10

- old
+ new

@@ -20,26 +20,121 @@ # To change this template, choose Tools | Templates # and open the template in the editor. require "#{File.dirname(__FILE__)}/btap" +class OSMArg + ARGUMENT_TYPES = [ + "BOOL", + "STRING", + "INTEGER", + "FLOAT", + "STRINGCHOICE", + "WSCHOICE" + ] + + + + attr_accessor :runner, + :variable_name, + :type, + :required, + :model_dependant, + :display_name, + :default_value, + :min_value, + :max_value, + :string_choice_array, + :os_object_type + + def self.bool( variable_name,display_name,required,default_value ) + raise "#{default_value} defaut value is not a bool." unless default_value.is_a?(Bool) + default_value.respond_to?(:to_s) + arg = OSMArg.new( "BOOL", variable_name, display_name, required) + arg.default_value = default_value + return arg + end + + def self.string( variable_name,display_name,required,default_value ) + raise "#{default_value} defaut value is not a string." unless default_value.respond_to?(:to_s) + arg = OSMArg.new( "STRING", variable_name, display_name, required) + arg.default_value = default_value + return arg + end + + def self.integer( variable_name,display_name,required,default_value,min_value,max_value ) + raise "#{default_value} defaut value is not a integer." unless default_value.respond_to?(:to_i) + arg = OSMArg.new( "INTEGER", variable_name, display_name, required) + arg.default_value = default_value + arg.min_value = min_value + arg.max_value = max_value + return arg + end + + def self.float( variable_name, display_name, required,default_value,min_value, max_value ) + raise "#{default_value} defaut value is not a float." unless default_value.respond_to?(:to_f) + arg = OSMArg.new( "INTEGER", variable_name, display_name, required) + arg.default_value = default_value + arg.min_value = min_value + arg.max_value = max_value + return arg + end + + def self.choice(variable_name,display_name,required,default_value,string_choice_array) + raise "#{default_value} defaut value is not an array." unless default_value.is_a?(Array) + arg = OSMArg.new( "STRINGCHOICE", variable_name, display_name, required) + arg.default_value = default_value + arg.string_choice_array = string_choice_array + return arg + end + + def self.wschoice( variable_name, display_name, required, default_value, os_object_type) + arg = OSMArg.new( "WSCHOICE", variable_name, display_name, required ) + arg.default_value = default_value + arg.os_object_type = os_object_type + return arg + end + + def initialize( type, variable_name, display_name, required ) + self.type = type + self.variable_name = variable_name + self.display_name = display_name + self.required = required + self.model_dependant = false + if self.type == "WSCHOICE" + self.model_dependant = true + else + self.model_dependant = false + end + return self + end +end + + + module BTAP module Measures module OSMeasures + + + + class BTAPModelUserScript < OpenStudio::Ruleset::ModelUserScript #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript #Array containing information of all inputs required by measure. attr_accessor :argument_array_of_arrays + attr_accessor :argument_array attr_accessor :file #Name of measure #attr_accessor :name #if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript def name "BTAPModelUserScript" + OSMArgument.new end #this method will output the ruby macro to perform the change. def generate_ruby_macro(model,runner) if @file == nil or @file == "" @@ -50,65 +145,10 @@ BTAP::runner_register("MACRO", "argument_values = #{@arg_table}", runner) BTAP::runner_register("MACRO", "#{self.class.name}.new.set_user_arguments_and_apply(model,argument_values,runner)",runner) BTAP::runner_register("MACRO", "\##{self.class.name} Measure End", runner) end - def arguments(model,argument_array_of_arrays) - #IF and E+ measure replace model with workspace as the argument - - #Create an argument vector - args = OpenStudio::Ruleset::OSArgumentVector.new - - @argument_array_of_arrays = argument_array_of_arrays - - #***boilerplate code starts. Do not edit... - # this converts the 2D array to a array hash for better readability and makes - # column data accessible by name. - @argument_array_of_hashes = [] - @argument_array_of_arrays[1..-1].each do |row| # [1..-1] skips the first row - hsh = {}; @argument_array_of_arrays[0].each_with_index{ |header, idx| hsh[header] = row[idx] } - @argument_array_of_hashes << hsh - end - - #iterate through array of hashes and make arguments based on type and set - # max and min values where applicable. - @argument_array_of_hashes.each do |row| - arg = nil - case row["type"] - when "BOOL" - arg = OpenStudio::Ruleset::OSArgument::makeBoolArgument(row["variable_name"],row["required"],row["model_dependant"]) - when "STRING" - arg = OpenStudio::Ruleset::OSArgument::makeStringArgument(row["variable_name"],row["required"],row["model_dependant"]) - when "INTEGER" - arg = OpenStudio::Ruleset::OSArgument::makeIntegerArgument(row["variable_name"],row["required"],row["model_dependant"]) - arg.setMaxValue( row["max_value"].to_i ) unless row["min_value"].nil? - arg.setMaxValue( row["max_value"].to_i ) unless row["max_value"].nil? - when "FLOAT" - arg = OpenStudio::Ruleset::OSArgument::makeDoubleArgument(row["variable_name"],row["required"],row["model_dependant"]) - arg.setMaxValue( row["max_value"].to_f ) unless row["min_value"].nil? - arg.setMaxValue( row["max_value"].to_f ) unless row["max_value"].nil? - when "STRINGCHOICE" - # #add string choices one by one. - chs = OpenStudio::StringVector.new - row["string_choice_array"].each {|choice| chs << choice} - arg = OpenStudio::Ruleset::OSArgument::makeChoiceArgument(row["variable_name"], chs,row["required"],row["model_dependant"]) - when "PATH" - arg = OpenStudio::Ruleset::OSArgument::makePathArgument("alternativeModelPath",true,"osm") - when "WSCHOICE" - arg = OpenStudio::Ruleset::makeChoiceArgumentOfWorkspaceObjects( row["variable_name"], row["os_object_type"].to_IddObjectType , model, row["required"]) - end - # #common argument aspects. - unless arg.nil? - arg.setDisplayName(row["display_name"]) - arg.setDefaultValue(row["default_value"]) unless row["default_value"].nil? - args << arg - end - end - return args - end - - def set_user_arguments_and_apply(model,argument_values,runner) message = "Settting Arguments" runner.nil? ? puts(message) : runner.registerInfo(message) #create argument map user_arguments = OpenStudio::Ruleset::OSArgumentMap.new @@ -156,65 +196,61 @@ #will run the childs method measure_code result = self.measure_code(model,runner) generate_ruby_macro(model,runner) return result end # end method run - - def argument_setter(args) + + def argument_setter(model,args) #***boilerplate code starts. Do not edit... - # this converts the 2D array to a array hash for better readability and makes - # column data accessible by name. - @argument_array_of_hashes = [] - @argument_array_of_arrays[1..-1].each do |row| # [1..-1] skips the first row - hsh = {}; @argument_array_of_arrays[0].each_with_index{ |header, idx| hsh[header] = row[idx] } - @argument_array_of_hashes << hsh - end + #iterate through array of hashes and make arguments based on type and set # max and min values where applicable. - @argument_array_of_hashes.each do |row| + @argument_array.each do |row| + #strip out first char that contains the @ symbol + row.variable_name[0] = '' arg = nil - case row["type"] + case row.type when "BOOL" - arg = OpenStudio::Ruleset::OSArgument::makeBoolArgument(row["variable_name"],row["required"],row["model_dependant"]) + arg = OpenStudio::Ruleset::OSArgument::makeBoolArgument(row.variable_name,row.required,row.model_dependant) when "STRING" - arg = OpenStudio::Ruleset::OSArgument::makeStringArgument(row["variable_name"],row["required"],row["model_dependant"]) + arg = OpenStudio::Ruleset::OSArgument::makeStringArgument(row.variable_name,row.required,row.model_dependant) when "INTEGER" - arg = OpenStudio::Ruleset::OSArgument::makeIntegerArgument(row["variable_name"],row["required"],row["model_dependant"]) - arg.setMaxValue( row["max_value"].to_i ) unless row["min_value"].nil? - arg.setMaxValue( row["max_value"].to_i ) unless row["max_value"].nil? + arg = OpenStudio::Ruleset::OSArgument::makeIntegerArgument(row.variable_name,row.required,row.model_dependant) + arg.setMaxValue( row.max_value.to_i ) unless row.min_value.nil? + arg.setMaxValue( row.max_value.to_i ) unless row.max_value.nil? when "FLOAT" - arg = OpenStudio::Ruleset::OSArgument::makeDoubleArgument(row["variable_name"],row["required"],row["model_dependant"]) - arg.setMaxValue( row["max_value"].to_f ) unless row["min_value"].nil? - arg.setMaxValue( row["max_value"].to_f ) unless row["max_value"].nil? + arg = OpenStudio::Ruleset::OSArgument::makeDoubleArgument(row.variable_name,row.required,row.model_dependant) + arg.setMaxValue( row.max_value.to_f ) unless row.min_value.nil? + arg.setMaxValue( row.max_value.to_f ) unless row.max_value.nil? when "STRINGCHOICE" # #add string choices one by one. chs = OpenStudio::StringVector.new - row["string_choice_array"].each {|choice| chs << choice} - arg = OpenStudio::Ruleset::OSArgument::makeChoiceArgument(row["variable_name"], chs,row["required"],row["model_dependant"]) + row.string_choice_array.each {|choice| chs << choice} + arg = OpenStudio::Ruleset::OSArgument::makeChoiceArgument(row.variable_name, chs,row.required,row.model_dependant) when "PATH" arg = OpenStudio::Ruleset::OSArgument::makePathArgument("alternativeModelPath",true,"osm") when "WSCHOICE" - arg = OpenStudio::Ruleset::makeChoiceArgumentOfWorkspaceObjects( row["variable_name"], row["os_object_type"].to_IddObjectType , model, row["required"]) + arg = OpenStudio::Ruleset::makeChoiceArgumentOfWorkspaceObjects( row.variable_name, row.os_object_type.to_IddObjectType , model, row.required) end # #common argument aspects. unless arg.nil? - arg.setDisplayName(row["display_name"]) - arg.setDefaultValue(row["default_value"]) unless row["default_value"].nil? + arg.setDisplayName(row.display_name) + arg.setDefaultValue(row.default_value) unless row.default_value.nil? args << arg end end return args end def argument_getter(model, runner,user_arguments) @arg_table = [] - unless @argument_array_of_hashes == nil - @argument_array_of_hashes.each do |row| - name = row["variable_name"] + unless @argument_array == nil + @argument_array.each do |row| + name = row.variable_name - case row["type"] + case row.type when "BOOL" value = runner.getBoolArgumentValue(name, user_arguments) instance_variable_set("@#{name}",value) @arg_table << [name,value] when "STRING" @@ -223,21 +259,21 @@ @arg_table << [name,value] when "INTEGER" value = runner.getIntegerArgumentValue(name, user_arguments) instance_variable_set("@#{name}",value) @arg_table << [name,value] - if ( not row["min_value"].nil? and instance_variable_get("@#{name}") < row["min_value"] ) or ( not row["max_value"].nil? and instance_variable_get("@#{name}") > row["max_value"] ) - runner.registerError("#{row["display_name"]} must be greater than or equal to #{row["min_value"]} and less than or equal to #{row["max_value"]}. You entered #{instance_variable_get("@#{name}")}.") + if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) + runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") return false end when "FLOAT" value = runner.getDoubleArgumentValue(name, user_arguments) instance_variable_set("@#{name}",value) @arg_table << [name,value] - if ( not row["min_value"].nil? and instance_variable_get("@#{name}") < row["min_value"] ) or ( not row["max_value"].nil? and instance_variable_get("@#{name}") > row["max_value"] ) - runner.registerError("#{row["display_name"]} must be greater than or equal to #{row["min_value"]} and less than or equal to #{row["max_value"]}. You entered #{instance_variable_get("@#{name}")}.") + if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value ) + runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.") return false end when "STRINGCHOICE" @arg_table << [name,runner.getBoolArgumentValue(name, user_arguments)] instance_variable_set("@#{name}", runner.getStringArgumentValue(name, user_arguments) ) @@ -252,32 +288,33 @@ end #end do end return @arg_table end - end #Measure Template simplified. class TemplateModelMeasure < BTAPModelUserScript def name "BTAPTempModelMeasure" end def arguments(model) - #list of arguments as they will appear in the interface. They are available in the run command as @variable_name. - @argument_array_of_arrays = [ - [ "variable_name", "type", "required", "model_dependant","display_name", "default_value", "min_value", "max_value", "string_choice_array", "os_object_type" ], - [ "boolean_argument_name", "BOOL", true, false, "boolean interface name", false, nil, nil, nil, nil ], - [ "string_argument_name", "STRING", true, false, "string interface name", "default", nil, nil, nil, nil ], - [ "integer_argument_name", "INTEGER", true, false, "integer interface name(units)", 0, 0, 100, nil, nil ], - [ "float_argument_name", "FLOAT", true, false, "float interface name(units)", 0.0, 0.0, 100.0, nil, nil ], - [ "choice_argument_name", "STRINGCHOICE", true, false, "choice interface name", "choice1", nil, nil, ["choice1","choice2"], nil ], - [ "ws_choice_argument_name","WSCHOICE", true, true, "wschoice interface name", nil, nil, nil, nil, "OS_ThermalZone" ] - ] - args = super(model,@argument_array_of_arrays) + #bool + @argument_array << OSMArgument.bool(variable_name,display_name,required,default_value) + #string + @argument_array << OSMArgument.string(variable_name,display_name,required,default_value) + #integer + @argument_array << OSMArgument.integer(variable_name,display_name,required,default_value,min_value,max_value) + #float + @argument_array << OSMArgument.float(variable_name,display_name,required,default_value,min_value,max_value) + #Choice + @argument_array << OSMArgument.choice(variable_name,display_name,required,default_value,string_choice_array) + #Workspace choice (using zones as an example) + @argument_array << OSMArgument.wschoice(variable_name,display_name,required,default_value,string_choice_array) + args = super(model,@argument_array) return args end def run(model, runner, user_arguments) #IF and E+ measure replace model with workspace as the argument @@ -402,12 +439,10 @@ def set_user_arguments_and_apply(model,argument_values,runner) self.run(model, runner, super(model,argument_values,runner) ) end end end - module EPMeasures - - end + class CSV_Measures def initialize( csv_file, script_root_folder_path )