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.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 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

Instance Attribute Details

#area_sqftObject

Returns the value of attribute area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def area_sqft
  @area_sqft
end

#aspect_ratioObject

Returns the value of attribute aspect_ratio.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def aspect_ratio
  @aspect_ratio
end

#available_roof_area_sqftObject

Returns the value of attribute available_roof_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def available_roof_area_sqft
  @available_roof_area_sqft
end

#building_typeObject

Returns the value of attribute building_type.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def building_type
  @building_type
end

#building_typesObject

Returns the value of attribute building_types.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def building_types
  @building_types
end

#conditioned_area_sqftObject

Returns the value of attribute conditioned_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def conditioned_area_sqft
  @conditioned_area_sqft
end

#east_window_area_sqftObject

Returns the value of attribute east_window_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def east_window_area_sqft
  @east_window_area_sqft
end

#equipment_roof_area_sqftObject

Returns the value of attribute equipment_roof_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def equipment_roof_area_sqft
  @equipment_roof_area_sqft
end

#floor_area_sqftObject

Returns the value of attribute floor_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def floor_area_sqft
  @floor_area_sqft
end

#footprint_area_sqftObject

Returns the value of attribute footprint_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def footprint_area_sqft
  @footprint_area_sqft
end

#maximum_number_of_parking_storiesObject

Returns the value of attribute maximum_number_of_parking_stories.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def maximum_number_of_stories_above_ground
  @maximum_number_of_stories_above_ground
end

#maximum_occupancyObject

Returns the value of attribute maximum_occupancy.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def maximum_occupancy
  @maximum_occupancy
end

#maximum_parking_height_ftObject

Returns the value of attribute maximum_parking_height_ft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def maximum_parking_height_ft
  @maximum_parking_height_ft
end

#maximum_roof_height_ftObject

Returns the value of attribute maximum_roof_height_ft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def maximum_roof_height_ft
  @maximum_roof_height_ft
end

#north_window_area_sqftObject

Returns the value of attribute north_window_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def north_window_area_sqft
  @north_window_area_sqft
end

#number_of_parking_spacesObject

Returns the value of attribute number_of_parking_spaces.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def number_of_residential_units
  @number_of_residential_units
end

#orientation_degObject

Returns the value of attribute orientation_deg.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def orientation_deg
  @orientation_deg
end

#parking_area_sqftObject

Returns the value of attribute parking_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def parking_area_sqft
  @parking_area_sqft
end

#parking_footprint_area_sqftObject

Returns the value of attribute parking_footprint_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def parking_footprint_area_sqft
  @parking_footprint_area_sqft
end

#photovoltaic_roof_area_sqftObject

Returns the value of attribute photovoltaic_roof_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def photovoltaic_roof_area_sqft
  @photovoltaic_roof_area_sqft
end

#roof_area_sqftObject

Returns the value of attribute roof_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def roof_area_sqft
  @roof_area_sqft
end

#site_area_sqftObject

Returns the value of attribute site_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def site_area_sqft
  @site_area_sqft
end

#south_window_area_sqftObject

Returns the value of attribute south_window_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def south_window_area_sqft
  @south_window_area_sqft
end

#total_construction_cost_dollarObject

Returns the value of attribute total_construction_cost_dollar.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def total_construction_cost_dollar
  @total_construction_cost_dollar
end

#total_roof_area_sqftObject

Returns the value of attribute total_roof_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def total_roof_area_sqft
  @total_roof_area_sqft
end

#unconditioned_area_sqftObject

Returns the value of attribute unconditioned_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def unconditioned_area_sqft
  @unconditioned_area_sqft
end

#wall_area_sqftObject

Returns the value of attribute wall_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def wall_area_sqft
  @wall_area_sqft
end

#west_window_area_sqftObject

Returns the value of attribute west_window_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

def west_window_area_sqft
  @west_window_area_sqft
end

#window_area_sqftObject

Returns the value of attribute window_area_sqft.



18
19
20
# File 'lib/urbanopt/reporting/default_reports/program.rb', line 18

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.



199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# 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) ⇒ 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.



184
185
186
187
188
189
190
191
# 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

#defaultsObject

Assigns default values if values do not exist.



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
# 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) ⇒ 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.



167
168
169
170
171
172
173
174
# 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_hashObject

Convert to a Hash equivalent for JSON serialization.

  • Exclude attributes with nil values.

  • Validate program hash properties against schema.



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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# 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