Class: URBANopt::Reporting::DefaultReports::Program

Inherits:
Object
  • Object
show all
Defined in:
lib/urbanopt/reporting/default_reports/program.rb

Overview

Program includes all building program related information.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hash = {}) ⇒ Program

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.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 69

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

Instance Attribute Details

#area_sqftObject

Returns the value of attribute area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def area_sqft
  @area_sqft
end

#aspect_ratioObject

Returns the value of attribute aspect_ratio.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def aspect_ratio
  @aspect_ratio
end

#available_roof_area_sqftObject

Returns the value of attribute available_roof_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def available_roof_area_sqft
  @available_roof_area_sqft
end

#building_typeObject

Returns the value of attribute building_type.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def building_type
  @building_type
end

#building_typesObject

Returns the value of attribute building_types.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def building_types
  @building_types
end

#conditioned_area_sqftObject

Returns the value of attribute conditioned_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def conditioned_area_sqft
  @conditioned_area_sqft
end

#east_window_area_sqftObject

Returns the value of attribute east_window_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def east_window_area_sqft
  @east_window_area_sqft
end

#equipment_roof_area_sqftObject

Returns the value of attribute equipment_roof_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def equipment_roof_area_sqft
  @equipment_roof_area_sqft
end

#floor_area_sqftObject

Returns the value of attribute floor_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def floor_area_sqft
  @floor_area_sqft
end

#footprint_area_sqftObject

Returns the value of attribute footprint_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def footprint_area_sqft
  @footprint_area_sqft
end

#maximum_number_of_parking_storiesObject

Returns the value of attribute maximum_number_of_parking_stories.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_number_of_parking_stories
  @maximum_number_of_parking_stories
end

#maximum_number_of_parking_stories_above_groundObject

Returns the value of attribute maximum_number_of_parking_stories_above_ground.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_number_of_parking_stories_above_ground
  @maximum_number_of_parking_stories_above_ground
end

#maximum_number_of_storiesObject

Returns the value of attribute maximum_number_of_stories.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_number_of_stories
  @maximum_number_of_stories
end

#maximum_number_of_stories_above_groundObject

Returns the value of attribute maximum_number_of_stories_above_ground.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_number_of_stories_above_ground
  @maximum_number_of_stories_above_ground
end

#maximum_occupancyObject

Returns the value of attribute maximum_occupancy.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_occupancy
  @maximum_occupancy
end

#maximum_parking_height_ftObject

Returns the value of attribute maximum_parking_height_ft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_parking_height_ft
  @maximum_parking_height_ft
end

#maximum_roof_height_ftObject

Returns the value of attribute maximum_roof_height_ft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def maximum_roof_height_ft
  @maximum_roof_height_ft
end

#north_window_area_sqftObject

Returns the value of attribute north_window_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def north_window_area_sqft
  @north_window_area_sqft
end

#number_of_parking_spacesObject

Returns the value of attribute number_of_parking_spaces.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def number_of_parking_spaces
  @number_of_parking_spaces
end

#number_of_parking_spaces_chargingObject

Returns the value of attribute number_of_parking_spaces_charging.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def number_of_parking_spaces_charging
  @number_of_parking_spaces_charging
end

#number_of_residential_unitsObject

Returns the value of attribute number_of_residential_units.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def number_of_residential_units
  @number_of_residential_units
end

#orientation_degObject

Returns the value of attribute orientation_deg.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def orientation_deg
  @orientation_deg
end

#parking_area_sqftObject

Returns the value of attribute parking_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def parking_area_sqft
  @parking_area_sqft
end

#parking_footprint_area_sqftObject

Returns the value of attribute parking_footprint_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def parking_footprint_area_sqft
  @parking_footprint_area_sqft
end

#photovoltaic_roof_area_sqftObject

Returns the value of attribute photovoltaic_roof_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def photovoltaic_roof_area_sqft
  @photovoltaic_roof_area_sqft
end

#roof_area_sqftObject

Returns the value of attribute roof_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def roof_area_sqft
  @roof_area_sqft
end

#site_area_sqftObject

Returns the value of attribute site_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def site_area_sqft
  @site_area_sqft
end

#south_window_area_sqftObject

Returns the value of attribute south_window_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def south_window_area_sqft
  @south_window_area_sqft
end

#total_construction_cost_dollarObject

Returns the value of attribute total_construction_cost_dollar.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def total_construction_cost_dollar
  @total_construction_cost_dollar
end

#total_roof_area_sqftObject

Returns the value of attribute total_roof_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def total_roof_area_sqft
  @total_roof_area_sqft
end

#unconditioned_area_sqftObject

Returns the value of attribute unconditioned_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def unconditioned_area_sqft
  @unconditioned_area_sqft
end

#wall_area_sqftObject

Returns the value of attribute wall_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def wall_area_sqft
  @wall_area_sqft
end

#west_window_area_sqftObject

Returns the value of attribute west_window_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def west_window_area_sqft
  @west_window_area_sqft
end

#window_area_sqftObject

Returns the value of attribute window_area_sqft.



53
54
55
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 53

def window_area_sqft
  @window_area_sqft
end

Instance Method Details

#add_program(other) ⇒ Object

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.



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 233

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) ⇒ Object

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.



218
219
220
221
222
223
224
225
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 218

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

#defaultsObject

Assigns default values if values do not exist.



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 105

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) ⇒ Object

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.



201
202
203
204
205
206
207
208
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 201

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_hashObject

Convert to a Hash equivalent for JSON serialization.

  • Exclude attributes with nil values.

  • Validate program hash properties against schema.



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 139

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