class URBANopt::Reporting::DefaultReports::Program

Program includes all building program related information.

Public Class Methods

new(hash = {}) click to toggle source

Program class initialize building program attributes: :site_area_sqft , :floor_area_sqft , :conditioned_area_sqft , :unconditioned_area_sqft , :footprint_area_sqft , +:maximum_roof_height_ft, :maximum_number_of_stories , :maximum_number_of_stories_above_ground , :parking_area_sqft , :number_of_parking_spaces , :number_of_parking_spaces_charging , :parking_footprint_area_sqft , :maximum_parking_height_ft , :maximum_number_of_parking_stories , :maximum_number_of_parking_stories_above_ground , :number_of_residential_units , :building_types , :building_type , :maximum_occupancy , :area_sqft , :window_area_sqft , :north_window_area_sqft , :south_window_area_sqft , :east_window_area_sqft , :west_window_area_sqft , :wall_area_sqft , :roof_area_sqft , :equipment_roof_area_sqft , :photovoltaic_roof_area_sqft , :available_roof_area_sqft , :total_roof_area_sqft , :orientation_deg , :aspect_ratio

parameters:

hash - Hash - A hash which may contain a deserialized program.

# File lib/urbanopt/reporting/default_reports/program.rb, line 35
def initialize(hash = {})
  hash.delete_if { |k, v| v.nil? }
  hash = defaults.merge(hash)

  @site_area_sqft = hash[:site_area_sqft]
  @floor_area_sqft = hash[:floor_area_sqft]
  @conditioned_area_sqft = hash[:conditioned_area_sqft]
  @unconditioned_area_sqft = hash[:unconditioned_area_sqft]
  @footprint_area_sqft = hash[:footprint_area_sqft]
  @maximum_roof_height_ft = hash[:maximum_roof_height_ft]
  @maximum_number_of_stories = hash[:maximum_number_of_stories]
  @maximum_number_of_stories_above_ground = hash[:maximum_number_of_stories_above_ground]
  @parking_area_sqft = hash[:parking_area_sqft]
  @number_of_parking_spaces = hash[:number_of_parking_spaces]
  @number_of_parking_spaces_charging = hash[:number_of_parking_spaces_charging]
  @parking_footprint_area_sqft = hash[:parking_footprint_area_sqft]
  @maximum_parking_height_ft = hash[:maximum_parking_height_ft]
  @maximum_number_of_parking_stories = hash[:maximum_number_of_parking_stories]
  @maximum_number_of_parking_stories_above_ground = hash[:maximum_number_of_parking_stories_above_ground]
  @number_of_residential_units = hash[:number_of_residential_units]
  @building_types = hash[:building_types]
  @window_area_sqft = hash[:window_area_sqft]
  @wall_area_sqft = hash[:wall_area_sqft]
  @roof_area_sqft = hash[:roof_area_sqft]
  @orientation_deg = hash[:orientation_deg]
  @aspect_ratio = hash[:aspect_ratio]
  @total_construction_cost_dollar = hash[:total_construction_cost_dollar]

  # initialize class variables @@validator and @@schema
  @@validator ||= Validator.new
  @@schema ||= @@validator.schema
end

Public Instance Methods

add_program(other) click to toggle source

Merges program objects to each other by summing up values or taking the maximum value of the attributes.

parameters:

other - Program - An object of Program class.

# File lib/urbanopt/reporting/default_reports/program.rb, line 199
def add_program(other)
  @site_area_sqft = add_values(@site_area_sqft, other.site_area_sqft)

  @floor_area_sqft = add_values(@floor_area_sqft, other.floor_area_sqft)
  @conditioned_area_sqft = add_values(@conditioned_area_sqft, other.conditioned_area_sqft)
  @unconditioned_area_sqft = add_values(@unconditioned_area_sqft, other.unconditioned_area_sqft)
  @footprint_area_sqft = add_values(@footprint_area_sqft, other.footprint_area_sqft)
  @maximum_roof_height_ft = max_value(@maximum_roof_height_ft, other.maximum_roof_height_ft)
  @maximum_number_of_stories = max_value(@maximum_number_of_stories, other.maximum_number_of_stories)
  @maximum_number_of_stories_above_ground = max_value(@maximum_number_of_stories_above_ground, other.maximum_number_of_stories_above_ground)
  @parking_area_sqft = add_values(@parking_area_sqft, other.parking_area_sqft)
  @number_of_parking_spaces = add_values(@number_of_parking_spaces, other.number_of_parking_spaces)
  @number_of_parking_spaces_charging = add_values(@number_of_parking_spaces_charging, other.number_of_parking_spaces_charging)
  @parking_footprint_area_sqft = add_values(@parkig_footprint_area_sqft, other.parking_footprint_area_sqft)
  @maximum_parking_height_ft = max_value(@maximum_parking_height_ft, other.maximum_parking_height_ft)
  @maximum_number_of_parking_stories = max_value(@maximum_number_of_parking_stories, other.maximum_number_of_parking_stories)
  @maximum_number_of_parking_stories_above_ground = max_value(maximum_number_of_parking_stories_above_ground, other.maximum_number_of_parking_stories_above_ground)
  @number_of_residential_units = add_values(@number_of_residential_units, other.number_of_residential_units)
  @total_construction_cost_dollar = add_values(@total_construction_cost_dollar, other.total_construction_cost_dollar)

  @building_types = other.building_types

  @window_area_sqft[:north_window_area_sqft] = add_values(@window_area_sqft[:north_window_area_sqft], other.window_area_sqft[:north_window_area_sqft])
  @window_area_sqft[:south_window_area_sqft] = add_values(@window_area_sqft[:south_window_area_sqft], other.window_area_sqft[:south_window_area_sqft])
  @window_area_sqft[:east_window_area_sqft] = add_values(@window_area_sqft[:east_window_area_sqft], other.window_area_sqft[:east_window_area_sqft])
  @window_area_sqft[:west_window_area_sqft] = add_values(@window_area_sqft[:west_window_area_sqft], other.window_area_sqft[:west_window_area_sqft])
  @window_area_sqft[:total_window_area_sqft] =  add_values(@window_area_sqft[:total_window_area_sqft], other.window_area_sqft[:total_window_area_sqft])

  @wall_area_sqft[:north_wall_area_sqft] = add_values(@wall_area_sqft[:north_wall_area_sqft], other.wall_area_sqft[:north_wall_area_sqft])
  @wall_area_sqft[:south_wall_area_sqft] = add_values(@wall_area_sqft[:south_wall_area_sqft], other.wall_area_sqft[:south_wall_area_sqft])
  @wall_area_sqft[:east_wall_area_sqft] = add_values(@wall_area_sqft[:east_wall_area_sqft], other.wall_area_sqft[:east_wall_area_sqft])
  @wall_area_sqft[:west_wall_area_sqft] = add_values(@wall_area_sqft[:west_wall_area_sqft], other.wall_area_sqft[:west_wall_area_sqft])
  @wall_area_sqft[:total_wall_area_sqft] = add_values(@wall_area_sqft[:total_wall_area_sqft], other.wall_area_sqft[:total_wall_area_sqft])

  @roof_area_sqft[:equipment_roof_area_sqft] = add_values(@roof_area_sqft[:equipment_roof_area_sqft], other.roof_area_sqft[:equipment_roof_area_sqft])
  @roof_area_sqft[:photovoltaic_roof_area_sqft] = add_values(@roof_area_sqft[:photovoltaic_roof_area_sqft], other.roof_area_sqft[:photovoltaic_roof_area_sqft])
  @roof_area_sqft[:available_roof_area_sqft] = add_values(@roof_area_sqft[:available_roof_area_sqft], other.roof_area_sqft[:available_roof_area_sqft])
  @roof_area_sqft[:total_roof_area_sqft] = add_values(@roof_area_sqft[:total_roof_area_sqft], other.roof_area_sqft[:total_roof_area_sqft])
end
add_values(existing_value, new_value) click to toggle source

Adds up existing_value and new_values if not nill.

parameters:

existing_value - Float - A value corresponding to a Program attribute.

new_value - Float - A value corresponding to a Program attribute.

# File lib/urbanopt/reporting/default_reports/program.rb, line 184
def add_values(existing_value, new_value)
  if existing_value && new_value
    existing_value += new_value
  elsif new_value
    existing_value = new_value
  end
  return existing_value
end
defaults() click to toggle source

Assigns default values if values do not exist.

# File lib/urbanopt/reporting/default_reports/program.rb, line 71
def defaults
  hash = {}
  hash[:site_area_sqft] = nil
  hash[:floor_area_sqft] = nil
  hash[:conditioned_area_sqft] = nil
  hash[:unconditioned_area_sqft] = nil
  hash[:footprint_area_sqft] = nil
  hash[:maximum_roof_height_ft] = nil
  hash[:maximum_number_of_stories] = nil
  hash[:maximum_number_of_stories_above_ground] = nil
  hash[:parking_area_sqft] = nil
  hash[:number_of_parking_spaces] = nil
  hash[:number_of_parking_spaces_charging] = nil
  hash[:parking_footprint_area_sqft] = nil
  hash[:maximum_parking_height_ft] = nil
  hash[:maximum_number_of_parking_stories] = nil
  hash[:maximum_number_of_parking_stories_above_ground] = nil
  hash[:number_of_residential_units] = nil
  hash[:building_types] = [{ building_type: nil, maximum_occupancy: nil, floor_area_sqft: nil }]
  hash[:window_area_sqft] = { north_window_area_sqft: nil, south_window_area_sqft: nil, east_window_area_sqft: nil, west_window_area_sqft: nil, total_window_area_sqft: nil }
  hash[:wall_area_sqft] = { north_wall_area_sqft: nil, south_wall_area_sqft: nil, east_wall_area_sqft: nil, west_wall_area_sqft: nil, total_wall_area_sqft: nil }
  hash[:roof_area_sqft] = { equipment_roof_area_sqft: nil, photovoltaic_roof_area_sqft: nil, available_roof_area_sqft: nil, total_roof_area_sqft: nil }
  hash[:orientation_deg] = nil
  hash[:aspect_ratio] = nil
  hash[:total_construction_cost_dollar] = nil
  return hash
end
max_value(existing_value, new_value) click to toggle source

Return the maximum value from existing_value and new_value.

parameters:

existing_value - Float - A value corresponding to a Program attribute.

new_value - Float - A value corresponding to a Program attribute.

# File lib/urbanopt/reporting/default_reports/program.rb, line 167
def max_value(existing_value, new_value)
  if existing_value && new_value
    [existing_value, new_value].max
  elsif new_value
    existing_value = new_value
  end
  return existing_value
end
to_hash() click to toggle source

Convert to a Hash equivalent for JSON serialization.

  • Exclude attributes with nil values.

  • Validate program hash properties against schema.

# File lib/urbanopt/reporting/default_reports/program.rb, line 105
def to_hash
  result = {}
  result[:site_area_sqft] = @site_area_sqft if @site_area_sqft
  result[:floor_area_sqft] = @floor_area_sqft if @floor_area_sqft
  result[:conditioned_area_sqft] = @conditioned_area_sqft if @conditioned_area_sqft
  result[:unconditioned_area_sqft] = @unconditioned_area_sqft if @unconditioned_area_sqft
  result[:footprint_area_sqft] = @footprint_area_sqft if @footprint_area_sqft
  result[:maximum_roof_height_ft] = @maximum_roof_height_ft if @maximum_roof_height_ft
  result[:maximum_number_of_stories] = @maximum_number_of_stories if @maximum_number_of_stories
  result[:maximum_number_of_stories_above_ground] = @maximum_number_of_stories_above_ground if @maximum_number_of_stories_above_ground
  result[:parking_area_sqft] = @parking_area_sqft if @parking_area_sqft
  result[:number_of_parking_spaces] = @number_of_parking_spaces if @number_of_parking_spaces
  result[:number_of_parking_spaces_charging] = @number_of_parking_spaces_charging if @number_of_parking_spaces_charging
  result[:parking_footprint_area_sqft] = @parking_footprint_area_sqft if @parking_footprint_area_sqft
  result[:maximum_parking_height_ft] = @maximum_parking_height_ft if @maximum_parking_height_ft
  result[:maximum_number_of_parking_stories] = @maximum_number_of_parking_stories if @maximum_number_of_parking_stories
  result[:maximum_number_of_parking_stories_above_ground] = @maximum_number_of_parking_stories_above_ground if @maximum_number_of_parking_stories_above_ground
  result[:number_of_residential_units] = @number_of_residential_units if @number_of_residential_units

  if @building_types.any?
    result[:building_types] = @building_types
    @building_types.each do |bt|
      bt&.delete_if { |k, v| v.nil? }
    end
  end

  # result[:window_area_sqft] = @window_area_sqft if @window_area_sqft
  window_area_sqft_hash = @window_area_sqft if @window_area_sqft
  window_area_sqft_hash.delete_if { |k, v| v.nil? }
  result[:window_area_sqft] = window_area_sqft_hash if @window_area_sqft

  # result[:wall_area_sqft] = @wall_area_sqft if @wall_area_sqft
  wall_area_sqft_hash = @wall_area_sqft if @wall_area_sqft
  wall_area_sqft_hash.delete_if { |k, v| v.nil? }
  result[:wall_area_sqft] = wall_area_sqft_hash if @wall_area_sqft

  # result[:roof_area_sqft] = @roof_area_sqft if @roof_area_sqft
  roof_area_sqft_hash = @roof_area_sqft if @roof_area_sqft
  roof_area_sqft_hash.delete_if { |k, v| v.nil? }
  result[:roof_area_sqft] = roof_area_sqft_hash if @roof_area_sqft

  result[:orientation_deg] = @orientation_deg if @orientation_deg
  result[:aspect_ratio] = @aspect_ratio if @aspect_ratio

  result[:total_construction_cost_dollar] = @total_construction_cost_dollar if @total_construction_cost_dollar

  # validate program properties against schema
  if @@validator.validate(@@schema[:definitions][:Program][:properties], result).any?
    raise "program properties does not match schema: #{@@validator.validate(@@schema[:definitions][:Program][:properties], result)}"
  end

  return result
end