lib/openstudio-standards/btap/geometry.rb in openstudio-standards-0.5.0 vs lib/openstudio-standards/btap/geometry.rb in openstudio-standards-0.6.0.rc1
- old
+ new
@@ -18,11 +18,10 @@
# **********************************************************************/
module BTAP
module Geometry
-
def self.enumerate_spaces_model(model, prepend_name = false)
#enumerate stories.
BTAP::Geometry::BuildingStoreys::auto_assign_spaces_to_stories(model)
#Enumerate spaces
model.getBuildingStorys.sort.each do |story|
@@ -44,11 +43,11 @@
p #uts "new space name : #{space.name}"
end
end
end
- #this was a copy of the sketchup plugin method.
+ #this was a copy of the sketchup plugin method.
def self.rename_zones_based_on_spaces(model)
# loop through thermal zones
model.getThermalZones.sort.each do |thermal_zone| # this is going through all, not just selection
#puts "old zone name : #{thermal_zone.name}"
@@ -88,12 +87,12 @@
end
#puts "new zone name : #{thermal_zone.name}"
end
end
- #This method will rename the zone equipment to have the zone name as a prefix for a model.
- #It will also rename the hot water coils for:
+ #This method will rename the zone equipment to have the zone name as a prefix for a model.
+ #It will also rename the hot water coils for:
# AirTerminalSingleDuctVAVReheat
# ZoneHVACBaseboardConvectiveWater
# ZoneHVACUnitHeater
def self.prefix_equipment_with_zone_name(model)
@@ -104,11 +103,11 @@
# loop through thermal zones
thermal_zones.each do |thermal_zone| # this is going through all, not just selection
thermal_zone.equipment.each do |equip|
- #For the hydronic conditions below only, it will rename the zonal coils as well.
+ #For the hydronic conditions below only, it will rename the zonal coils as well.
if not equip.to_AirTerminalSingleDuctVAVReheat.empty?
equip.setName("#{thermal_zone.name}:AirTerminalSingleDuctVAVReheat")
reheat_coil = equip.to_AirTerminalSingleDuctVAVReheat.get.reheatCoil
reheat_coil.setName("#{thermal_zone.name}:ReheatCoil")
@@ -123,1987 +122,19 @@
heatingCoil = equip.to_ZoneHVACUnitHeater.get.heatingCoil
heatingCoil.setName("#{thermal_zone.name}:Unit Heater Htg Coil")
#puts heatingCoil.name
#Add more cases if you wish!!!!!
else #if the equipment does not follow the above cases, rename
- # it generically and not touch the underlying coils, etc.
+ # it generically and not touch the underlying coils, etc.
equip.setName("#{thermal_zone.name}:#{equip.name}")
end
end
end
#puts "Done zone renaming equipment"
end
-
- module Wizards
- def self.create_shape_courtyard(model,
- length = 50.0,
- width = 30.0,
- courtyard_length = 15.0,
- courtyard_width = 5.0,
- num_floors = 3,
- floor_to_floor_height = 3.8,
- plenum_height = 1.0,
- perimeter_zone_depth = 4.57)
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if width <= 1e-4
- raise("Width must be greater than 0.")
- return false
- end
-
- if courtyard_length <= 1e-4
- raise("Courtyard length must be greater than 0.")
- return false
- end
-
- if courtyard_width <= 1e-4
- raise("Courtyard width must be greater than 0.")
- return false
- end
-
- if num_floors <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [length, width].min
- if perimeter_zone_depth < 0 or 4 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 4.0}m.")
- return false
- end
-
- if courtyard_length >= (length - 4 * perimeter_zone_depth - 1e-4)
- raise("Courtyard length must be less than #{length - 4.0 * perimeter_zone_depth}m.")
- return false
- end
-
- if courtyard_width >= (width - 4 * perimeter_zone_depth - 1e-4)
- raise("Courtyard width must be less than #{width - 4.0 * perimeter_zone_depth}m.")
- return false
- end
-
-
- # Loop through the number of floors
- for floor in (0..num_floors - 1)
-
- z = floor_to_floor_height * floor
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
-
-
- nw_point = OpenStudio::Point3d.new(0.0, width, z)
- ne_point = OpenStudio::Point3d.new(length, width, z)
- se_point = OpenStudio::Point3d.new(length, 0.0, z)
- sw_point = OpenStudio::Point3d.new(0.0, 0.0, z)
-
- courtyard_nw_point = OpenStudio::Point3d.new((length - courtyard_length) / 2.0, (width - courtyard_width) / 2.0 + courtyard_width, z)
- courtyard_ne_point = OpenStudio::Point3d.new((length - courtyard_length) / 2.0 + courtyard_length, (width - courtyard_width) / 2.0 + courtyard_width, z)
- courtyard_se_point = OpenStudio::Point3d.new((length - courtyard_length) / 2.0 + courtyard_length, (width - courtyard_width) / 2.0, z)
- courtyard_sw_point = OpenStudio::Point3d.new((length - courtyard_length) / 2.0, (width - courtyard_width) / 2.0, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0.0)
- m[0, 0] = 1.0
- m[1, 1] = 1.0
- m[2, 2] = 1.0
- m[3, 3] = 1.0
-
- # Define polygons for a building with a courtyard
- if perimeter_zone_depth > 0
- outer_perimeter_nw_point = nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0.0)
- outer_perimeter_ne_point = ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0.0)
- outer_perimeter_se_point = se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0.0)
- outer_perimeter_sw_point = sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0.0)
- inner_perimeter_nw_point = courtyard_nw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0.0)
- inner_perimeter_ne_point = courtyard_ne_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0.0)
- inner_perimeter_se_point = courtyard_se_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0.0)
- inner_perimeter_sw_point = courtyard_sw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0.0)
-
- west_outer_perimeter_polygon = OpenStudio::Point3dVector.new
- west_outer_perimeter_polygon << sw_point
- west_outer_perimeter_polygon << nw_point
- west_outer_perimeter_polygon << outer_perimeter_nw_point
- west_outer_perimeter_polygon << outer_perimeter_sw_point
- west_outer_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_outer_perimeter_polygon, floor_to_floor_height, model)
- west_outer_perimeter_space = west_outer_perimeter_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- west_outer_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_outer_perimeter_space.setBuildingStory(story)
- west_outer_perimeter_space.setName("Story #{floor + 1} West Outer Perimeter Space")
-
-
- north_outer_perimeter_polygon = OpenStudio::Point3dVector.new
- north_outer_perimeter_polygon << nw_point
- north_outer_perimeter_polygon << ne_point
- north_outer_perimeter_polygon << outer_perimeter_ne_point
- north_outer_perimeter_polygon << outer_perimeter_nw_point
- north_outer_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_outer_perimeter_polygon, floor_to_floor_height, model)
- north_outer_perimeter_space = north_outer_perimeter_space.get
- m[0, 3] = outer_perimeter_nw_point.x
- m[1, 3] = outer_perimeter_nw_point.y
- m[2, 3] = outer_perimeter_nw_point.z
- north_outer_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_outer_perimeter_space.setBuildingStory(story)
- north_outer_perimeter_space.setName("Story #{floor + 1} North Outer Perimeter Space")
-
-
- east_outer_perimeter_polygon = OpenStudio::Point3dVector.new
- east_outer_perimeter_polygon << ne_point
- east_outer_perimeter_polygon << se_point
- east_outer_perimeter_polygon << outer_perimeter_se_point
- east_outer_perimeter_polygon << outer_perimeter_ne_point
- east_outer_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_outer_perimeter_polygon, floor_to_floor_height, model)
- east_outer_perimeter_space = east_outer_perimeter_space.get
- m[0, 3] = outer_perimeter_se_point.x
- m[1, 3] = outer_perimeter_se_point.y
- m[2, 3] = outer_perimeter_se_point.z
- east_outer_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_outer_perimeter_space.setBuildingStory(story)
- east_outer_perimeter_space.setName("Story #{floor + 1} East Outer Perimeter Space")
-
-
- south_outer_perimeter_polygon = OpenStudio::Point3dVector.new
- south_outer_perimeter_polygon << se_point
- south_outer_perimeter_polygon << sw_point
- south_outer_perimeter_polygon << outer_perimeter_sw_point
- south_outer_perimeter_polygon << outer_perimeter_se_point
- south_outer_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_outer_perimeter_polygon, floor_to_floor_height, model)
- south_outer_perimeter_space = south_outer_perimeter_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- south_outer_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_outer_perimeter_space.setBuildingStory(story)
- south_outer_perimeter_space.setName("Story #{floor + 1} South Outer Perimeter Space")
-
-
- west_core_polygon = OpenStudio::Point3dVector.new
- west_core_polygon << outer_perimeter_sw_point
- west_core_polygon << outer_perimeter_nw_point
- west_core_polygon << inner_perimeter_nw_point
- west_core_polygon << inner_perimeter_sw_point
- west_core_space = OpenStudio::Model::Space::fromFloorPrint(west_core_polygon, floor_to_floor_height, model)
- west_core_space = west_core_space.get
- m[0, 3] = outer_perimeter_sw_point.x
- m[1, 3] = outer_perimeter_sw_point.y
- m[2, 3] = outer_perimeter_sw_point.z
- west_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_core_space.setBuildingStory(story)
- west_core_space.setName("Story #{floor + 1} West Core Space")
-
-
- north_core_polygon = OpenStudio::Point3dVector.new
- north_core_polygon << outer_perimeter_nw_point
- north_core_polygon << outer_perimeter_ne_point
- north_core_polygon << inner_perimeter_ne_point
- north_core_polygon << inner_perimeter_nw_point
- north_core_space = OpenStudio::Model::Space::fromFloorPrint(north_core_polygon, floor_to_floor_height, model)
- north_core_space = north_core_space.get
- m[0, 3] = inner_perimeter_nw_point.x
- m[1, 3] = inner_perimeter_nw_point.y
- m[2, 3] = inner_perimeter_nw_point.z
- north_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_core_space.setBuildingStory(story)
- north_core_space.setName("Story #{floor + 1} North Core Space")
-
-
- east_core_polygon = OpenStudio::Point3dVector.new
- east_core_polygon << outer_perimeter_ne_point
- east_core_polygon << outer_perimeter_se_point
- east_core_polygon << inner_perimeter_se_point
- east_core_polygon << inner_perimeter_ne_point
- east_core_space = OpenStudio::Model::Space::fromFloorPrint(east_core_polygon, floor_to_floor_height, model)
- east_core_space = east_core_space.get
- m[0, 3] = inner_perimeter_se_point.x
- m[1, 3] = inner_perimeter_se_point.y
- m[2, 3] = inner_perimeter_se_point.z
- east_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_core_space.setBuildingStory(story)
- east_core_space.setName("Story #{floor + 1} East Core Space")
-
-
- south_core_polygon = OpenStudio::Point3dVector.new
- south_core_polygon << outer_perimeter_se_point
- south_core_polygon << outer_perimeter_sw_point
- south_core_polygon << inner_perimeter_sw_point
- south_core_polygon << inner_perimeter_se_point
- south_core_space = OpenStudio::Model::Space::fromFloorPrint(south_core_polygon, floor_to_floor_height, model)
- south_core_space = south_core_space.get
- m[0, 3] = outer_perimeter_sw_point.x
- m[1, 3] = outer_perimeter_sw_point.y
- m[2, 3] = outer_perimeter_sw_point.z
- south_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_core_space.setBuildingStory(story)
- south_core_space.setName("Story #{floor + 1} South Core Space")
-
-
- west_inner_perimeter_polygon = OpenStudio::Point3dVector.new
- west_inner_perimeter_polygon << inner_perimeter_sw_point
- west_inner_perimeter_polygon << inner_perimeter_nw_point
- west_inner_perimeter_polygon << courtyard_nw_point
- west_inner_perimeter_polygon << courtyard_sw_point
- west_inner_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_inner_perimeter_polygon, floor_to_floor_height, model)
- west_inner_perimeter_space = west_inner_perimeter_space.get
- m[0, 3] = inner_perimeter_sw_point.x
- m[1, 3] = inner_perimeter_sw_point.y
- m[2, 3] = inner_perimeter_sw_point.z
- west_inner_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_inner_perimeter_space.setBuildingStory(story)
- west_inner_perimeter_space.setName("Story #{floor + 1} West Inner Perimeter Space")
-
-
- north_inner_perimeter_polygon = OpenStudio::Point3dVector.new
- north_inner_perimeter_polygon << inner_perimeter_nw_point
- north_inner_perimeter_polygon << inner_perimeter_ne_point
- north_inner_perimeter_polygon << courtyard_ne_point
- north_inner_perimeter_polygon << courtyard_nw_point
- north_inner_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_inner_perimeter_polygon, floor_to_floor_height, model)
- north_inner_perimeter_space = north_inner_perimeter_space.get
- m[0, 3] = courtyard_nw_point.x
- m[1, 3] = courtyard_nw_point.y
- m[2, 3] = courtyard_nw_point.z
- north_inner_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_inner_perimeter_space.setBuildingStory(story)
- north_inner_perimeter_space.setName("Story #{floor + 1} North Inner Perimeter Space")
-
-
- east_inner_perimeter_polygon = OpenStudio::Point3dVector.new
- east_inner_perimeter_polygon << inner_perimeter_ne_point
- east_inner_perimeter_polygon << inner_perimeter_se_point
- east_inner_perimeter_polygon << courtyard_se_point
- east_inner_perimeter_polygon << courtyard_ne_point
- east_inner_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_inner_perimeter_polygon, floor_to_floor_height, model)
- east_inner_perimeter_space = east_inner_perimeter_space.get
- m[0, 3] = courtyard_se_point.x
- m[1, 3] = courtyard_se_point.y
- m[2, 3] = courtyard_se_point.z
- east_inner_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_inner_perimeter_space.setBuildingStory(story)
- east_inner_perimeter_space.setName("Story #{floor + 1} East Inner Perimeter Space")
-
-
- south_inner_perimeter_polygon = OpenStudio::Point3dVector.new
- south_inner_perimeter_polygon << inner_perimeter_se_point
- south_inner_perimeter_polygon << inner_perimeter_sw_point
- south_inner_perimeter_polygon << courtyard_sw_point
- south_inner_perimeter_polygon << courtyard_se_point
- south_inner_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_inner_perimeter_polygon, floor_to_floor_height, model)
- south_inner_perimeter_space = south_inner_perimeter_space.get
- m[0, 3] = inner_perimeter_sw_point.x
- m[1, 3] = inner_perimeter_sw_point.y
- m[2, 3] = inner_perimeter_sw_point.z
- south_inner_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_inner_perimeter_space.setBuildingStory(story)
- south_inner_perimeter_space.setName("Story #{floor + 1} South Inner Perimeter Space")
-
-
- # Minimal zones
- else
- west_polygon = OpenStudio::Point3dVector.new
- west_polygon << sw_point
- west_polygon << nw_point
- west_polygon << courtyard_nw_point
- west_polygon << courtyard_sw_point
- west_space = OpenStudio::Model::Space::fromFloorPrint(west_polygon, floor_to_floor_height, model)
- west_space = west_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- west_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_space.setBuildingStory(story)
- west_space.setName("Story #{floor + 1} West Space")
-
-
- north_polygon = OpenStudio::Point3dVector.new
- north_polygon << nw_point
- north_polygon << ne_point
- north_polygon << courtyard_ne_point
- north_polygon << courtyard_nw_point
- north_space = OpenStudio::Model::Space::fromFloorPrint(north_polygon, floor_to_floor_height, model)
- north_space = north_space.get
- m[0, 3] = courtyard_nw_point.x
- m[1, 3] = courtyard_nw_point.y
- m[2, 3] = courtyard_nw_point.z
- north_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_space.setBuildingStory(story)
- north_space.setName("Story #{floor + 1} North Space")
-
-
- east_polygon = OpenStudio::Point3dVector.new
- east_polygon << ne_point
- east_polygon << se_point
- east_polygon << courtyard_se_point
- east_polygon << courtyard_ne_point
- east_space = OpenStudio::Model::Space::fromFloorPrint(east_polygon, floor_to_floor_height, model)
- east_space = east_space.get
- m[0, 3] = courtyard_se_point.x
- m[1, 3] = courtyard_se_point.y
- m[2, 3] = courtyard_se_point.z
- east_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_space.setBuildingStory(story)
- east_space.setName("Story #{floor + 1} East Space")
-
-
- south_polygon = OpenStudio::Point3dVector.new
- south_polygon << se_point
- south_polygon << sw_point
- south_polygon << courtyard_sw_point
- south_polygon << courtyard_se_point
- south_space = OpenStudio::Model::Space::fromFloorPrint(south_polygon, floor_to_floor_height, model)
- south_space = south_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- south_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_space.setBuildingStory(story)
- south_space.setName("Story #{floor + 1} South Space")
- end
- #Set vertical story position
- story.setNominalZCoordinate(z)
- end #End of floor loop
- BTAP::Geometry::match_surfaces(model)
- return model
- end
-
- def self.create_shape_h(model,
- length = 40.0,
- left_width = 40.0,
- center_width = 10.0,
- right_width = 40.0,
- left_end_length = 15.0,
- right_end_length = 15.0,
- left_upper_end_offset = 15.0,
- right_upper_end_offset = 15.0,
- num_floors = 3,
- floor_to_floor_height = 3.8,
- plenum_height = 1,
- perimeter_zone_depth = 4.57)
-
-
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if left_width <= 1e-4
- raise("Left width must be greater than 0.")
- return false
- end
-
- if right_width <= 1e-4
- raise("Right width must be greater than 0.")
- return false
- end
-
- if center_width <= 1e-4 or center_width >= ([left_width, right_width].min - 1e-4)
- raise("Center width must be greater than 0 and less than #{[left_width, right_width].min}m.")
- return false
- end
-
- if left_end_length <= 1e-4 or left_end_length >= (length - 1e-4)
- raise("Left end length must be greater than 0 and less than #{length}m.")
- return false
- end
-
- if right_end_length <= 1e-4 or right_end_length >= (length - left_end_length - 1e-4)
- raise("Right end length must be greater than 0 and less than #{length - left_end_length}m.")
- return false
- end
-
- if left_upper_end_offset <= 1e-4 or left_upper_end_offset >= (left_width - center_width - 1e-4)
- raise("Left upper end offset must be greater than 0 and less than #{left_width - center_width}m.")
- return false
- end
-
- if right_upper_end_offset <= 1e-4 or right_upper_end_offset >= (right_width - center_width - 1e-4)
- raise("Right upper end offset must be greater than 0 and less than #{right_width - center_width}m.")
- return false
- end
-
- if num_floors <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [length / 2, left_width, center_width, right_width, left_end_length, right_end_length].min
- if perimeter_zone_depth < 0 or 2 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 2}m.")
- return false
- end
-
-
- # Loop through the number of floors
- for floor in (0..num_floors - 1)
-
- z = floor_to_floor_height * floor
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
-
-
- left_origin = (right_width - right_upper_end_offset) > (left_width - left_upper_end_offset) ? (right_width - right_upper_end_offset) - (left_width - left_upper_end_offset) : 0
-
- left_nw_point = OpenStudio::Point3d.new(0, left_width + left_origin, z)
- left_ne_point = OpenStudio::Point3d.new(left_end_length, left_width + left_origin, z)
- left_se_point = OpenStudio::Point3d.new(left_end_length, left_origin, z)
- left_sw_point = OpenStudio::Point3d.new(0, left_origin, z)
- center_nw_point = OpenStudio::Point3d.new(left_end_length, left_ne_point.y - left_upper_end_offset, z)
- center_ne_point = OpenStudio::Point3d.new(length - right_end_length, center_nw_point.y, z)
- center_se_point = OpenStudio::Point3d.new(length - right_end_length, center_nw_point.y - center_width, z)
- center_sw_point = OpenStudio::Point3d.new(left_end_length, center_se_point.y, z)
- right_nw_point = OpenStudio::Point3d.new(length - right_end_length, center_ne_point.y + right_upper_end_offset, z)
- right_ne_point = OpenStudio::Point3d.new(length, right_nw_point.y, z)
- right_se_point = OpenStudio::Point3d.new(length, right_ne_point.y - right_width, z)
- right_sw_point = OpenStudio::Point3d.new(length - right_end_length, right_se_point.y, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
-
- # Define polygons for a L-shape building with perimeter core zoning
- if perimeter_zone_depth > 0
- perimeter_left_nw_point = left_nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_left_ne_point = left_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_left_se_point = left_se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_left_sw_point = left_sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_center_nw_point = center_nw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_center_ne_point = center_ne_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_center_se_point = center_se_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_center_sw_point = center_sw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_right_nw_point = right_nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_right_ne_point = right_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_right_se_point = right_se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_right_sw_point = right_sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
-
- west_left_perimeter_polygon = OpenStudio::Point3dVector.new
- west_left_perimeter_polygon << left_sw_point
- west_left_perimeter_polygon << left_nw_point
- west_left_perimeter_polygon << perimeter_left_nw_point
- west_left_perimeter_polygon << perimeter_left_sw_point
- west_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_left_perimeter_polygon, floor_to_floor_height, model)
- west_left_perimeter_space = west_left_perimeter_space.get
- m[0, 3] = left_sw_point.x
- m[1, 3] = left_sw_point.y
- m[2, 3] = left_sw_point.z
- west_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_left_perimeter_space.setBuildingStory(story)
- west_left_perimeter_space.setName("Story #{floor + 1} West Left Perimeter Space")
-
-
- north_left_perimeter_polygon = OpenStudio::Point3dVector.new
- north_left_perimeter_polygon << left_nw_point
- north_left_perimeter_polygon << left_ne_point
- north_left_perimeter_polygon << perimeter_left_ne_point
- north_left_perimeter_polygon << perimeter_left_nw_point
- north_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_left_perimeter_polygon, floor_to_floor_height, model)
- north_left_perimeter_space = north_left_perimeter_space.get
- m[0, 3] = perimeter_left_nw_point.x
- m[1, 3] = perimeter_left_nw_point.y
- m[2, 3] = perimeter_left_nw_point.z
- north_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_left_perimeter_space.setBuildingStory(story)
- north_left_perimeter_space.setName("Story #{floor + 1} North Left Perimeter Space")
-
-
- east_upper_left_perimeter_polygon = OpenStudio::Point3dVector.new
- east_upper_left_perimeter_polygon << left_ne_point
- east_upper_left_perimeter_polygon << center_nw_point
- east_upper_left_perimeter_polygon << perimeter_center_nw_point
- east_upper_left_perimeter_polygon << perimeter_left_ne_point
- east_upper_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_upper_left_perimeter_polygon, floor_to_floor_height, model)
- east_upper_left_perimeter_space = east_upper_left_perimeter_space.get
- m[0, 3] = perimeter_center_nw_point.x
- m[1, 3] = perimeter_center_nw_point.y
- m[2, 3] = perimeter_center_nw_point.z
- east_upper_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_upper_left_perimeter_space.setBuildingStory(story)
- east_upper_left_perimeter_space.setName("Story #{floor + 1} East Upper Left Perimeter Space")
-
-
- north_center_perimeter_polygon = OpenStudio::Point3dVector.new
- north_center_perimeter_polygon << center_nw_point
- north_center_perimeter_polygon << center_ne_point
- north_center_perimeter_polygon << perimeter_center_ne_point
- north_center_perimeter_polygon << perimeter_center_nw_point
- north_center_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_center_perimeter_polygon, floor_to_floor_height, model)
- north_center_perimeter_space = north_center_perimeter_space.get
- m[0, 3] = perimeter_center_nw_point.x
- m[1, 3] = perimeter_center_nw_point.y
- m[2, 3] = perimeter_center_nw_point.z
- north_center_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_center_perimeter_space.setBuildingStory(story)
- north_center_perimeter_space.setName("Story #{floor + 1} North Center Perimeter Space")
-
-
- west_upper_right_perimeter_polygon = OpenStudio::Point3dVector.new
- west_upper_right_perimeter_polygon << center_ne_point
- west_upper_right_perimeter_polygon << right_nw_point
- west_upper_right_perimeter_polygon << perimeter_right_nw_point
- west_upper_right_perimeter_polygon << perimeter_center_ne_point
- west_upper_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_upper_right_perimeter_polygon, floor_to_floor_height, model)
- west_upper_right_perimeter_space = west_upper_right_perimeter_space.get
- m[0, 3] = center_ne_point.x
- m[1, 3] = center_ne_point.y
- m[2, 3] = center_ne_point.z
- west_upper_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_upper_right_perimeter_space.setBuildingStory(story)
- west_upper_right_perimeter_space.setName("Story #{floor + 1} West Upper Right Perimeter Space")
-
-
- north_right_perimeter_polygon = OpenStudio::Point3dVector.new
- north_right_perimeter_polygon << right_nw_point
- north_right_perimeter_polygon << right_ne_point
- north_right_perimeter_polygon << perimeter_right_ne_point
- north_right_perimeter_polygon << perimeter_right_nw_point
- north_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_right_perimeter_polygon, floor_to_floor_height, model)
- north_right_perimeter_space = north_right_perimeter_space.get
- m[0, 3] = perimeter_right_nw_point.x
- m[1, 3] = perimeter_right_nw_point.y
- m[2, 3] = perimeter_right_nw_point.z
- north_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_right_perimeter_space.setBuildingStory(story)
- north_right_perimeter_space.setName("Story #{floor + 1} North Right Perimeter Space")
-
-
- east_right_perimeter_polygon = OpenStudio::Point3dVector.new
- east_right_perimeter_polygon << right_ne_point
- east_right_perimeter_polygon << right_se_point
- east_right_perimeter_polygon << perimeter_right_se_point
- east_right_perimeter_polygon << perimeter_right_ne_point
- east_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_right_perimeter_polygon, floor_to_floor_height, model)
- east_right_perimeter_space = east_right_perimeter_space.get
- m[0, 3] = perimeter_right_se_point.x
- m[1, 3] = perimeter_right_se_point.y
- m[2, 3] = perimeter_right_se_point.z
- east_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_right_perimeter_space.setBuildingStory(story)
- east_right_perimeter_space.setName("Story #{floor + 1} East Right Perimeter Space")
-
-
- south_right_perimeter_polygon = OpenStudio::Point3dVector.new
- south_right_perimeter_polygon << right_se_point
- south_right_perimeter_polygon << right_sw_point
- south_right_perimeter_polygon << perimeter_right_sw_point
- south_right_perimeter_polygon << perimeter_right_se_point
- south_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_right_perimeter_polygon, floor_to_floor_height, model)
- south_right_perimeter_space = south_right_perimeter_space.get
- m[0, 3] = right_sw_point.x
- m[1, 3] = right_sw_point.y
- m[2, 3] = right_sw_point.z
- south_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_right_perimeter_space.setBuildingStory(story)
- south_right_perimeter_space.setName("Story #{floor + 1} South Right Perimeter Space")
-
-
- west_lower_right_perimeter_polygon = OpenStudio::Point3dVector.new
- west_lower_right_perimeter_polygon << right_sw_point
- west_lower_right_perimeter_polygon << center_se_point
- west_lower_right_perimeter_polygon << perimeter_center_se_point
- west_lower_right_perimeter_polygon << perimeter_right_sw_point
- west_lower_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_lower_right_perimeter_polygon, floor_to_floor_height, model)
- west_lower_right_perimeter_space = west_lower_right_perimeter_space.get
- m[0, 3] = right_sw_point.x
- m[1, 3] = right_sw_point.y
- m[2, 3] = right_sw_point.z
- west_lower_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_lower_right_perimeter_space.setBuildingStory(story)
- west_lower_right_perimeter_space.setName("Story #{floor + 1} West Lower Right Perimeter Space")
-
-
- south_center_perimeter_polygon = OpenStudio::Point3dVector.new
- south_center_perimeter_polygon << center_se_point
- south_center_perimeter_polygon << center_sw_point
- south_center_perimeter_polygon << perimeter_center_sw_point
- south_center_perimeter_polygon << perimeter_center_se_point
- south_center_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_center_perimeter_polygon, floor_to_floor_height, model)
- south_center_perimeter_space = south_center_perimeter_space.get
- m[0, 3] = center_sw_point.x
- m[1, 3] = center_sw_point.y
- m[2, 3] = center_sw_point.z
- south_center_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_center_perimeter_space.setBuildingStory(story)
- south_center_perimeter_space.setName("Story #{floor + 1} South Center Perimeter Space")
-
-
- east_lower_left_perimeter_polygon = OpenStudio::Point3dVector.new
- east_lower_left_perimeter_polygon << center_sw_point
- east_lower_left_perimeter_polygon << left_se_point
- east_lower_left_perimeter_polygon << perimeter_left_se_point
- east_lower_left_perimeter_polygon << perimeter_center_sw_point
- east_lower_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_lower_left_perimeter_polygon, floor_to_floor_height, model)
- east_lower_left_perimeter_space = east_lower_left_perimeter_space.get
- m[0, 3] = perimeter_left_se_point.x
- m[1, 3] = perimeter_left_se_point.y
- m[2, 3] = perimeter_left_se_point.z
- east_lower_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_lower_left_perimeter_space.setBuildingStory(story)
- east_lower_left_perimeter_space.setName("Story #{floor + 1} East Lower Left Perimeter Space")
-
-
- south_left_perimeter_polygon = OpenStudio::Point3dVector.new
- south_left_perimeter_polygon << left_se_point
- south_left_perimeter_polygon << left_sw_point
- south_left_perimeter_polygon << perimeter_left_sw_point
- south_left_perimeter_polygon << perimeter_left_se_point
- south_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_left_perimeter_polygon, floor_to_floor_height, model)
- south_left_perimeter_space = south_left_perimeter_space.get
- m[0, 3] = left_sw_point.x
- m[1, 3] = left_sw_point.y
- m[2, 3] = left_sw_point.z
- south_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_left_perimeter_space.setBuildingStory(story)
- south_left_perimeter_space.setName("Story #{floor + 1} South Left Perimeter Space")
-
-
- west_core_polygon = OpenStudio::Point3dVector.new
- west_core_polygon << perimeter_left_sw_point
- west_core_polygon << perimeter_left_nw_point
- west_core_polygon << perimeter_left_ne_point
- west_core_polygon << perimeter_center_nw_point
- west_core_polygon << perimeter_center_sw_point
- west_core_polygon << perimeter_left_se_point
- west_core_space = OpenStudio::Model::Space::fromFloorPrint(west_core_polygon, floor_to_floor_height, model)
- west_core_space = west_core_space.get
- m[0, 3] = perimeter_left_sw_point.x
- m[1, 3] = perimeter_left_sw_point.y
- m[2, 3] = perimeter_left_sw_point.z
- west_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_core_space.setBuildingStory(story)
- west_core_space.setName("Story #{floor + 1} West Core Space")
-
-
- center_core_polygon = OpenStudio::Point3dVector.new
- center_core_polygon << perimeter_center_sw_point
- center_core_polygon << perimeter_center_nw_point
- center_core_polygon << perimeter_center_ne_point
- center_core_polygon << perimeter_center_se_point
- center_core_space = OpenStudio::Model::Space::fromFloorPrint(center_core_polygon, floor_to_floor_height, model)
- center_core_space = center_core_space.get
- m[0, 3] = perimeter_center_sw_point.x
- m[1, 3] = perimeter_center_sw_point.y
- m[2, 3] = perimeter_center_sw_point.z
- center_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- center_core_space.setBuildingStory(story)
- center_core_space.setName("Story #{floor + 1} Center Core Space")
-
-
- east_core_polygon = OpenStudio::Point3dVector.new
- east_core_polygon << perimeter_right_sw_point
- east_core_polygon << perimeter_center_se_point
- east_core_polygon << perimeter_center_ne_point
- east_core_polygon << perimeter_right_nw_point
- east_core_polygon << perimeter_right_ne_point
- east_core_polygon << perimeter_right_se_point
- east_core_space = OpenStudio::Model::Space::fromFloorPrint(east_core_polygon, floor_to_floor_height, model)
- east_core_space = east_core_space.get
- m[0, 3] = perimeter_right_sw_point.x
- m[1, 3] = perimeter_right_sw_point.y
- m[2, 3] = perimeter_right_sw_point.z
- east_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_core_space.setBuildingStory(story)
- east_core_space.setName("Story #{floor + 1} East Core Space")
-
-
- # Minimal zones
- else
- west_polygon = OpenStudio::Point3dVector.new
- west_polygon << left_sw_point
- west_polygon << left_nw_point
- west_polygon << left_ne_point
- west_polygon << center_nw_point
- west_polygon << center_sw_point
- west_polygon << left_se_point
- west_space = OpenStudio::Model::Space::fromFloorPrint(west_polygon, floor_to_floor_height, model)
- west_space = west_space.get
- m[0, 3] = left_sw_point.x
- m[1, 3] = left_sw_point.y
- m[2, 3] = left_sw_point.z
- west_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_space.setBuildingStory(story)
- west_space.setName("Story #{floor + 1} West Space")
-
-
- center_polygon = OpenStudio::Point3dVector.new
- center_polygon << center_sw_point
- center_polygon << center_nw_point
- center_polygon << center_ne_point
- center_polygon << center_se_point
- center_space = OpenStudio::Model::Space::fromFloorPrint(center_polygon, floor_to_floor_height, model)
- center_space = center_space.get
- m[0, 3] = center_sw_point.x
- m[1, 3] = center_sw_point.y
- m[2, 3] = center_sw_point.z
- center_space.changeTransformation(OpenStudio::Transformation.new(m))
- center_space.setBuildingStory(story)
- center_space.setName("Story #{floor + 1} Center Space")
-
-
- east_polygon = OpenStudio::Point3dVector.new
- east_polygon << right_sw_point
- east_polygon << center_se_point
- east_polygon << center_ne_point
- east_polygon << right_nw_point
- east_polygon << right_ne_point
- east_polygon << right_se_point
- east_space = OpenStudio::Model::Space::fromFloorPrint(east_polygon, floor_to_floor_height, model)
- east_space = east_space.get
- m[0, 3] = right_sw_point.x
- m[1, 3] = right_sw_point.y
- m[2, 3] = right_sw_point.z
- east_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_space.setBuildingStory(story)
- east_space.setName("Story #{floor + 1} East Space")
-
-
- end
-
- #Set vertical story position
- story.setNominalZCoordinate(z)
-
- end #End of floor loop
- BTAP::Geometry::match_surfaces(model)
- return model
- end
-
- def self.create_shape_l(
- model,
- length = 40.0,
- width = 40.0,
- lower_end_width = 20.0,
- upper_end_length = 20.0,
- num_floors = 3,
- floor_to_floor_height = 3.8,
- plenum_height = 1.0,
- perimeter_zone_depth = 4.57
- )
-
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if width <= 1e-4
- raise("Width must be greater than 0.")
- return false
- end
-
- if lower_end_width <= 1e-4 or lower_end_width >= (width - 1e-4)
- raise("Lower end width must be greater than 0 and less than #{width}m.")
- return false
- end
-
- if upper_end_length <= 1e-4 or upper_end_length >= (length - 1e-4)
- raise("Upper end length must be greater than 0 and less than #{length}m.")
- return false
- end
-
- if num_floors <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [lower_end_width, upper_end_length].min
- if perimeter_zone_depth < 0 or 2 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 2}m.")
- return false
- end
-
- # Create progress bar
- # runner.createProgressBar("Creating Spaces")
- # num_total = perimeter_zone_depth>0 ? num_floors*8 : num_floors*2
- # num_complete = 0
-
- # Loop through the number of floors
- for floor in (0..num_floors - 1)
-
- z = floor_to_floor_height * floor
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
-
-
- nw_point = OpenStudio::Point3d.new(0, width, z)
- upper_ne_point = OpenStudio::Point3d.new(upper_end_length, width, z)
- upper_sw_point = OpenStudio::Point3d.new(upper_end_length, lower_end_width, z)
- lower_ne_point = OpenStudio::Point3d.new(length, lower_end_width, z)
- se_point = OpenStudio::Point3d.new(length, 0, z)
- sw_point = OpenStudio::Point3d.new(0, 0, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
-
- # Define polygons for a L-shape building with perimeter core zoning
- if perimeter_zone_depth > 0
- perimeter_nw_point = nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_ne_point = upper_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_sw_point = upper_sw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_lower_ne_point = lower_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_se_point = se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_lower_sw_point = sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
-
- west_perimeter_polygon = OpenStudio::Point3dVector.new
- west_perimeter_polygon << sw_point
- west_perimeter_polygon << nw_point
- west_perimeter_polygon << perimeter_nw_point
- west_perimeter_polygon << perimeter_lower_sw_point
- west_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_perimeter_polygon, floor_to_floor_height, model)
- west_perimeter_space = west_perimeter_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- west_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_perimeter_space.setBuildingStory(story)
- west_perimeter_space.setName("Story #{floor + 1} West Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_upper_perimeter_polygon = OpenStudio::Point3dVector.new
- north_upper_perimeter_polygon << nw_point
- north_upper_perimeter_polygon << upper_ne_point
- north_upper_perimeter_polygon << perimeter_upper_ne_point
- north_upper_perimeter_polygon << perimeter_nw_point
- north_upper_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_upper_perimeter_polygon, floor_to_floor_height, model)
- north_upper_perimeter_space = north_upper_perimeter_space.get
- m[0, 3] = perimeter_nw_point.x
- m[1, 3] = perimeter_nw_point.y
- m[2, 3] = perimeter_nw_point.z
- north_upper_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_upper_perimeter_space.setBuildingStory(story)
- north_upper_perimeter_space.setName("Story #{floor + 1} North Upper Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_upper_perimeter_polygon = OpenStudio::Point3dVector.new
- east_upper_perimeter_polygon << upper_ne_point
- east_upper_perimeter_polygon << upper_sw_point
- east_upper_perimeter_polygon << perimeter_upper_sw_point
- east_upper_perimeter_polygon << perimeter_upper_ne_point
- east_upper_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_upper_perimeter_polygon, floor_to_floor_height, model)
- east_upper_perimeter_space = east_upper_perimeter_space.get
- m[0, 3] = perimeter_upper_sw_point.x
- m[1, 3] = perimeter_upper_sw_point.y
- m[2, 3] = perimeter_upper_sw_point.z
- east_upper_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_upper_perimeter_space.setBuildingStory(story)
- east_upper_perimeter_space.setName("Story #{floor + 1} East Upper Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- north_lower_perimeter_polygon << upper_sw_point
- north_lower_perimeter_polygon << lower_ne_point
- north_lower_perimeter_polygon << perimeter_lower_ne_point
- north_lower_perimeter_polygon << perimeter_upper_sw_point
- north_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_lower_perimeter_polygon, floor_to_floor_height, model)
- north_lower_perimeter_space = north_lower_perimeter_space.get
- m[0, 3] = perimeter_upper_sw_point.x
- m[1, 3] = perimeter_upper_sw_point.y
- m[2, 3] = perimeter_upper_sw_point.z
- north_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_lower_perimeter_space.setBuildingStory(story)
- north_lower_perimeter_space.setName("Story #{floor + 1} North Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- east_lower_perimeter_polygon << lower_ne_point
- east_lower_perimeter_polygon << se_point
- east_lower_perimeter_polygon << perimeter_se_point
- east_lower_perimeter_polygon << perimeter_lower_ne_point
- east_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_lower_perimeter_polygon, floor_to_floor_height, model)
- east_lower_perimeter_space = east_lower_perimeter_space.get
- m[0, 3] = perimeter_se_point.x
- m[1, 3] = perimeter_se_point.y
- m[2, 3] = perimeter_se_point.z
- east_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_lower_perimeter_space.setBuildingStory(story)
- east_lower_perimeter_space.setName("Story #{floor + 1} East Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_perimeter_polygon = OpenStudio::Point3dVector.new
- south_perimeter_polygon << se_point
- south_perimeter_polygon << sw_point
- south_perimeter_polygon << perimeter_lower_sw_point
- south_perimeter_polygon << perimeter_se_point
- south_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_perimeter_polygon, floor_to_floor_height, model)
- south_perimeter_space = south_perimeter_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- south_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_perimeter_space.setBuildingStory(story)
- south_perimeter_space.setName("Story #{floor + 1} South Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- west_core_polygon = OpenStudio::Point3dVector.new
- west_core_polygon << perimeter_lower_sw_point
- west_core_polygon << perimeter_nw_point
- west_core_polygon << perimeter_upper_ne_point
- west_core_polygon << perimeter_upper_sw_point
- west_core_space = OpenStudio::Model::Space::fromFloorPrint(west_core_polygon, floor_to_floor_height, model)
- west_core_space = west_core_space.get
- m[0, 3] = perimeter_lower_sw_point.x
- m[1, 3] = perimeter_lower_sw_point.y
- m[2, 3] = perimeter_lower_sw_point.z
- west_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_core_space.setBuildingStory(story)
- west_core_space.setName("Story #{floor + 1} West Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_core_polygon = OpenStudio::Point3dVector.new
- east_core_polygon << perimeter_upper_sw_point
- east_core_polygon << perimeter_lower_ne_point
- east_core_polygon << perimeter_se_point
- east_core_polygon << perimeter_lower_sw_point
- east_core_space = OpenStudio::Model::Space::fromFloorPrint(east_core_polygon, floor_to_floor_height, model)
- east_core_space = east_core_space.get
- m[0, 3] = perimeter_lower_sw_point.x
- m[1, 3] = perimeter_lower_sw_point.y
- m[2, 3] = perimeter_lower_sw_point.z
- east_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_core_space.setBuildingStory(story)
- east_core_space.setName("Story #{floor + 1} East Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- # Minimal zones
- else
- west_polygon = OpenStudio::Point3dVector.new
- west_polygon << sw_point
- west_polygon << nw_point
- west_polygon << upper_ne_point
- west_polygon << upper_sw_point
- west_space = OpenStudio::Model::Space::fromFloorPrint(west_polygon, floor_to_floor_height, model)
- west_space = west_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- west_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_space.setBuildingStory(story)
- west_space.setName("Story #{floor + 1} West Space")
-
- num_complete += 1
- runner.updateProgress(100 * num_complete / num_total)
-
- east_polygon = OpenStudio::Point3dVector.new
- east_polygon << sw_point
- east_polygon << upper_sw_point
- east_polygon << lower_ne_point
- east_polygon << se_point
- east_space = OpenStudio::Model::Space::fromFloorPrint(east_polygon, floor_to_floor_height, model)
- east_space = east_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- east_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_space.setBuildingStory(story)
- east_space.setName("Story #{floor + 1} East Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- end
-
- #Set vertical story position
- story.setNominalZCoordinate(z)
-
- end #End of floor loop
- BTAP::Geometry::match_surfaces(model)
- return model
- end
-
- def self.create_shape_aspect_ratio(model,
- aspect_ratio = 0.5,
- floor_area = 100.0,
- rotation = 0.0,
- num_floors = 3,
- floor_to_floor_height = 3.8,
- plenum_height = 1,
- perimeter_zone_depth = 4.57
- )
- #determine l and w.
- length = MATH::sqrt(floor_area / aspect_ratio)
- width = MATH::sqrt(floor_area * aspect_ratio)
- BTAP::Geometry::Wizards::create_shape_rectangle(model,
- length,
- width,
- num_floors,
- floor_to_floor_height,
- plenum_height,
- perimeter_zone_depth
- )
- BTAP::Geometry::rotate_model(model, rotation)
- end
-
-
- def self.create_shape_rectangle(model,
- length = 100.0,
- width = 100.0,
- above_ground_storys = 3,
- under_ground_storys = 1,
- floor_to_floor_height = 3.8,
- plenum_height = 1,
- perimeter_zone_depth = 4.57,
- initial_height = 0.0
- )
-
-
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if width <= 1e-4
- raise("Width must be greater than 0.")
- return false
- end
-
- if (above_ground_storys + under_ground_storys) <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [length, width].min
- if perimeter_zone_depth < 0 or 2 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 2}m")
- return false
- end
-
- building_stories = Array.new
- #Loop through the number of floors
- for floor in ((under_ground_storys * -1)..above_ground_storys - 1)
-
- z = floor_to_floor_height * floor + initial_height
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
- building_stories << story
-
-
- nw_point = OpenStudio::Point3d.new(0, width, z)
- ne_point = OpenStudio::Point3d.new(length, width, z)
- se_point = OpenStudio::Point3d.new(length, 0, z)
- sw_point = OpenStudio::Point3d.new(0, 0, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
-
- #Define polygons for a rectangular building
- if perimeter_zone_depth > 0
- perimeter_nw_point = nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_ne_point = ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_se_point = se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_sw_point = sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
-
- west_polygon = OpenStudio::Point3dVector.new
- west_polygon << sw_point
- west_polygon << nw_point
- west_polygon << perimeter_nw_point
- west_polygon << perimeter_sw_point
- west_space = OpenStudio::Model::Space::fromFloorPrint(west_polygon, floor_to_floor_height, model)
- west_space = west_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- west_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_space.setBuildingStory(story)
- west_space.setName("Story #{floor + 1} West Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_polygon = OpenStudio::Point3dVector.new
- north_polygon << nw_point
- north_polygon << ne_point
- north_polygon << perimeter_ne_point
- north_polygon << perimeter_nw_point
- north_space = OpenStudio::Model::Space::fromFloorPrint(north_polygon, floor_to_floor_height, model)
- north_space = north_space.get
- m[0, 3] = perimeter_nw_point.x
- m[1, 3] = perimeter_nw_point.y
- m[2, 3] = perimeter_nw_point.z
- north_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_space.setBuildingStory(story)
- north_space.setName("Story #{floor + 1} North Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_polygon = OpenStudio::Point3dVector.new
- east_polygon << ne_point
- east_polygon << se_point
- east_polygon << perimeter_se_point
- east_polygon << perimeter_ne_point
- east_space = OpenStudio::Model::Space::fromFloorPrint(east_polygon, floor_to_floor_height, model)
- east_space = east_space.get
- m[0, 3] = perimeter_se_point.x
- m[1, 3] = perimeter_se_point.y
- m[2, 3] = perimeter_se_point.z
- east_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_space.setBuildingStory(story)
- east_space.setName("Story #{floor + 1} East Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_polygon = OpenStudio::Point3dVector.new
- south_polygon << se_point
- south_polygon << sw_point
- south_polygon << perimeter_sw_point
- south_polygon << perimeter_se_point
- south_space = OpenStudio::Model::Space::fromFloorPrint(south_polygon, floor_to_floor_height, model)
- south_space = south_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- south_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_space.setBuildingStory(story)
- south_space.setName("Story #{floor + 1} South Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- core_polygon = OpenStudio::Point3dVector.new
- core_polygon << perimeter_sw_point
- core_polygon << perimeter_nw_point
- core_polygon << perimeter_ne_point
- core_polygon << perimeter_se_point
- core_space = OpenStudio::Model::Space::fromFloorPrint(core_polygon, floor_to_floor_height, model)
- core_space = core_space.get
- m[0, 3] = perimeter_sw_point.x
- m[1, 3] = perimeter_sw_point.y
- m[2, 3] = perimeter_sw_point.z
- core_space.changeTransformation(OpenStudio::Transformation.new(m))
- core_space.setBuildingStory(story)
- core_space.setName("Story #{floor + 1} Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- # Minimal zones
- else
- core_polygon = OpenStudio::Point3dVector.new
- core_polygon << sw_point
- core_polygon << nw_point
- core_polygon << ne_point
- core_polygon << se_point
- core_space = OpenStudio::Model::Space::fromFloorPrint(core_polygon, floor_to_floor_height, model)
- core_space = core_space.get
- m[0, 3] = sw_point.x
- m[1, 3] = sw_point.y
- m[2, 3] = sw_point.z
- core_space.changeTransformation(OpenStudio::Transformation.new(m))
- core_space.setBuildingStory(story)
- core_space.setName("Story #{floor + 1} Core Space")
- #
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- end
-
- #Set vertical story position
- story.setNominalZCoordinate(z)
-
- #Ensure that underground stories (when z<0 have Ground set as Boundary conditions). Apply the Ground BC to all surfaces, the top ceiling will be
- # corrected below when the surface matching algorithm is called.
- BTAP::Geometry::Surfaces::set_surfaces_boundary_condition(model, BTAP::Geometry::Surfaces::get_surfaces_from_building_stories(model, story), "Ground") if z < 0
- end #End of floor loop
-
- # runner.destroyProgressBar
- BTAP::Geometry::match_surfaces(model)
- return building_stories
- end
-
- def self.create_shape_t(model,
- length = 40.0,
- width = 40.0,
- upper_end_width = 20.0,
- lower_end_length = 20.0,
- left_end_offset = 10.0,
- num_floors = 3,
- floor_to_floor_height = 3.8,
- plenum_height = 1.0,
- perimeter_zone_depth = 4.57
- )
-
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if width <= 1e-4
- raise("Width must be greater than 0.")
- return false
- end
-
- if upper_end_width <= 1e-4 or upper_end_width >= (width - 1e-4)
- raise("Upper end width must be greater than 0 and less than #{width}m.")
- return false
- end
-
- if lower_end_length <= 1e-4 or lower_end_length >= (length - 1e-4)
- raise("Lower end length must be greater than 0 and less than #{length}m.")
- return false
- end
-
- if left_end_offset <= 1e-4 or left_end_offset >= (length - lower_end_length - 1e-4)
- raise("Left end offset must be greater than 0 and less than #{length - lower_end_length}m.")
- return false
- end
-
- if num_floors <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [length, width, upper_end_width, lower_end_length].min
- if perimeter_zone_depth < 0 or 2 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 2}m.")
- return false
- end
-
- # Create progress bar
- # runner.createProgressBar("Creating Spaces")
- # num_total = perimeter_zone_depth>0 ? num_floors*10 : num_floors*2
- # num_complete = 0
-
- # Loop through the number of floors
- for floor in (0..num_floors - 1)
-
- z = floor_to_floor_height * floor
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
-
-
- lower_ne_point = OpenStudio::Point3d.new(left_end_offset, width - upper_end_width, z)
- upper_sw_point = OpenStudio::Point3d.new(0, width - upper_end_width, z)
- upper_nw_point = OpenStudio::Point3d.new(0, width, z)
- upper_ne_point = OpenStudio::Point3d.new(length, width, z)
- upper_se_point = OpenStudio::Point3d.new(length, width - upper_end_width, z)
- lower_nw_point = OpenStudio::Point3d.new(left_end_offset + lower_end_length, width - upper_end_width, z)
- lower_se_point = OpenStudio::Point3d.new(left_end_offset + lower_end_length, 0, z)
- lower_sw_point = OpenStudio::Point3d.new(left_end_offset, 0, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
-
- # Define polygons for a L-shape building with perimeter core zoning
- if perimeter_zone_depth > 0
- perimeter_lower_ne_point = lower_ne_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_upper_sw_point = upper_sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_upper_nw_point = upper_nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_ne_point = upper_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_se_point = upper_se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_lower_nw_point = lower_nw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_lower_se_point = lower_se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_lower_sw_point = lower_sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
-
- west_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- west_lower_perimeter_polygon << lower_sw_point
- west_lower_perimeter_polygon << lower_ne_point
- west_lower_perimeter_polygon << perimeter_lower_ne_point
- west_lower_perimeter_polygon << perimeter_lower_sw_point
- west_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_lower_perimeter_polygon, floor_to_floor_height, model)
- west_lower_perimeter_space = west_lower_perimeter_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- west_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_lower_perimeter_space.setBuildingStory(story)
- west_lower_perimeter_space.setName("Story #{floor + 1} West Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_upper_left_perimeter_polygon = OpenStudio::Point3dVector.new
- south_upper_left_perimeter_polygon << lower_ne_point
- south_upper_left_perimeter_polygon << upper_sw_point
- south_upper_left_perimeter_polygon << perimeter_upper_sw_point
- south_upper_left_perimeter_polygon << perimeter_lower_ne_point
- south_upper_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_upper_left_perimeter_polygon, floor_to_floor_height, model)
- south_upper_left_perimeter_space = south_upper_left_perimeter_space.get
- m[0, 3] = upper_sw_point.x
- m[1, 3] = upper_sw_point.y
- m[2, 3] = upper_sw_point.z
- south_upper_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_upper_left_perimeter_space.setBuildingStory(story)
- south_upper_left_perimeter_space.setName("Story #{floor + 1} South Upper Left Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- west_upper_perimeter_polygon = OpenStudio::Point3dVector.new
- west_upper_perimeter_polygon << upper_sw_point
- west_upper_perimeter_polygon << upper_nw_point
- west_upper_perimeter_polygon << perimeter_upper_nw_point
- west_upper_perimeter_polygon << perimeter_upper_sw_point
- west_upper_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_upper_perimeter_polygon, floor_to_floor_height, model)
- west_upper_perimeter_space = west_upper_perimeter_space.get
- m[0, 3] = upper_sw_point.x
- m[1, 3] = upper_sw_point.y
- m[2, 3] = upper_sw_point.z
- west_upper_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_upper_perimeter_space.setBuildingStory(story)
- west_upper_perimeter_space.setName("Story #{floor + 1} West Upper Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_perimeter_polygon = OpenStudio::Point3dVector.new
- north_perimeter_polygon << upper_nw_point
- north_perimeter_polygon << upper_ne_point
- north_perimeter_polygon << perimeter_upper_ne_point
- north_perimeter_polygon << perimeter_upper_nw_point
- north_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_perimeter_polygon, floor_to_floor_height, model)
- north_perimeter_space = north_perimeter_space.get
- m[0, 3] = perimeter_upper_nw_point.x
- m[1, 3] = perimeter_upper_nw_point.y
- m[2, 3] = perimeter_upper_nw_point.z
- north_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_perimeter_space.setBuildingStory(story)
- north_perimeter_space.setName("Story #{floor + 1} North Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_upper_perimeter_polygon = OpenStudio::Point3dVector.new
- east_upper_perimeter_polygon << upper_ne_point
- east_upper_perimeter_polygon << upper_se_point
- east_upper_perimeter_polygon << perimeter_upper_se_point
- east_upper_perimeter_polygon << perimeter_upper_ne_point
- east_upper_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_upper_perimeter_polygon, floor_to_floor_height, model)
- east_upper_perimeter_space = east_upper_perimeter_space.get
- m[0, 3] = perimeter_upper_se_point.x
- m[1, 3] = perimeter_upper_se_point.y
- m[2, 3] = perimeter_upper_se_point.z
- east_upper_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_upper_perimeter_space.setBuildingStory(story)
- east_upper_perimeter_space.setName("Story #{floor + 1} East Upper Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_upper_right_perimeter_polygon = OpenStudio::Point3dVector.new
- south_upper_right_perimeter_polygon << upper_se_point
- south_upper_right_perimeter_polygon << lower_nw_point
- south_upper_right_perimeter_polygon << perimeter_lower_nw_point
- south_upper_right_perimeter_polygon << perimeter_upper_se_point
- south_upper_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_upper_right_perimeter_polygon, floor_to_floor_height, model)
- south_upper_right_perimeter_space = south_upper_right_perimeter_space.get
- m[0, 3] = lower_nw_point.x
- m[1, 3] = lower_nw_point.y
- m[2, 3] = lower_nw_point.z
- south_upper_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_upper_right_perimeter_space.setBuildingStory(story)
- south_upper_right_perimeter_space.setName("Story #{floor + 1} South Upper Left Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- east_lower_perimeter_polygon << lower_nw_point
- east_lower_perimeter_polygon << lower_se_point
- east_lower_perimeter_polygon << perimeter_lower_se_point
- east_lower_perimeter_polygon << perimeter_lower_nw_point
- east_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_lower_perimeter_polygon, floor_to_floor_height, model)
- east_lower_perimeter_space = east_lower_perimeter_space.get
- m[0, 3] = perimeter_lower_se_point.x
- m[1, 3] = perimeter_lower_se_point.y
- m[2, 3] = perimeter_lower_se_point.z
- east_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_lower_perimeter_space.setBuildingStory(story)
- east_lower_perimeter_space.setName("Story #{floor + 1} East Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- south_lower_perimeter_polygon << lower_se_point
- south_lower_perimeter_polygon << lower_sw_point
- south_lower_perimeter_polygon << perimeter_lower_sw_point
- south_lower_perimeter_polygon << perimeter_lower_se_point
- south_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_lower_perimeter_polygon, floor_to_floor_height, model)
- south_lower_perimeter_space = south_lower_perimeter_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- south_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_lower_perimeter_space.setBuildingStory(story)
- south_lower_perimeter_space.setName("Story #{floor + 1} South Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_core_polygon = OpenStudio::Point3dVector.new
- north_core_polygon << perimeter_upper_sw_point
- north_core_polygon << perimeter_upper_nw_point
- north_core_polygon << perimeter_upper_ne_point
- north_core_polygon << perimeter_upper_se_point
- north_core_polygon << perimeter_lower_nw_point
- north_core_polygon << perimeter_lower_ne_point
- north_core_space = OpenStudio::Model::Space::fromFloorPrint(north_core_polygon, floor_to_floor_height, model)
- north_core_space = north_core_space.get
- m[0, 3] = perimeter_upper_sw_point.x
- m[1, 3] = perimeter_upper_sw_point.y
- m[2, 3] = perimeter_upper_sw_point.z
- north_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_core_space.setBuildingStory(story)
- north_core_space.setName("Story #{floor + 1} North Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_core_polygon = OpenStudio::Point3dVector.new
- south_core_polygon << perimeter_lower_sw_point
- south_core_polygon << perimeter_lower_ne_point
- south_core_polygon << perimeter_lower_nw_point
- south_core_polygon << perimeter_lower_se_point
- south_core_space = OpenStudio::Model::Space::fromFloorPrint(south_core_polygon, floor_to_floor_height, model)
- south_core_space = south_core_space.get
- m[0, 3] = perimeter_lower_sw_point.x
- m[1, 3] = perimeter_lower_sw_point.y
- m[2, 3] = perimeter_lower_sw_point.z
- south_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_core_space.setBuildingStory(story)
- south_core_space.setName("Story #{floor + 1} South Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- # Minimal zones
- else
- north_polygon = OpenStudio::Point3dVector.new
- north_polygon << upper_sw_point
- north_polygon << upper_nw_point
- north_polygon << upper_ne_point
- north_polygon << upper_se_point
- north_polygon << lower_nw_point
- north_polygon << lower_ne_point
- north_space = OpenStudio::Model::Space::fromFloorPrint(north_polygon, floor_to_floor_height, model)
- north_space = north_space.get
- m[0, 3] = upper_sw_point.x
- m[1, 3] = upper_sw_point.y
- m[2, 3] = upper_sw_point.z
- north_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_space.setBuildingStory(story)
- north_space.setName("Story #{floor + 1} North Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_polygon = OpenStudio::Point3dVector.new
- south_polygon << lower_sw_point
- south_polygon << lower_ne_point
- south_polygon << lower_nw_point
- south_polygon << lower_se_point
- south_space = OpenStudio::Model::Space::fromFloorPrint(south_polygon, floor_to_floor_height, model)
- south_space = south_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- south_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_space.setBuildingStory(story)
- south_space.setName("Story #{floor + 1} South Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- end
-
- #Set vertical story position
- story.setNominalZCoordinate(z)
-
- end #End of floor loop
-
- BTAP::Geometry::match_surfaces(model)
- return model
- end
-
- def self.create_shape_u(model,
- length = 40.0,
- left_width = 40.0,
- right_width = 40.0,
- left_end_length = 15.0,
- right_end_length = 15.0,
- left_end_offset = 25.0,
- num_floors = 3.0,
- floor_to_floor_height = 3.8,
- plenum_height = 1.0,
- perimeter_zone_depth = 4.57
- )
-
- if length <= 1e-4
- raise("Length must be greater than 0.")
- return false
- end
-
- if left_width <= 1e-4
- raise("Left width must be greater than 0.")
- return false
- end
-
- if left_end_length <= 1e-4 or left_end_length >= (length - 1e-4)
- raise("Left end length must be greater than 0 and less than #{length}m.")
- return false
- end
-
- if right_end_length <= 1e-4 or right_end_length >= (length - left_end_length - 1e-4)
- raise("Right end length must be greater than 0 and less than #{length - left_end_length}m.")
- return false
- end
-
- if left_end_offset <= 1e-4 or left_end_offset >= (left_width - 1e-4)
- raise("Left end offset must be greater than 0 and less than #{left_width}m.")
- return false
- end
-
- if right_width <= (left_width - left_end_offset - 1e-4)
- raise("Right width must be greater than #{left_width - left_end_offset}m.")
- return false
- end
-
- if num_floors <= 1e-4
- raise("Number of floors must be greater than 0.")
- return false
- end
-
- if floor_to_floor_height <= 1e-4
- raise("Floor to floor height must be greater than 0.")
- return false
- end
-
- if plenum_height < 0
- raise("Plenum height must be greater than or equal to 0.")
- return false
- end
-
- shortest_side = [length / 2, left_width, right_width, left_end_length, right_end_length, left_width - left_end_offset].min
- if perimeter_zone_depth < 0 or 2 * perimeter_zone_depth >= (shortest_side - 1e-4)
- raise("Perimeter zone depth must be greater than or equal to 0 and less than #{shortest_side / 2}m.")
- return false
- end
-
- # Create progress bar
- # runner.createProgressBar("Creating Spaces")
- # num_total = perimeter_zone_depth>0 ? num_floors*11 : num_floors*3
- # num_complete = 0
-
- # Loop through the number of floors
- for floor in (0..num_floors - 1)
-
- z = floor_to_floor_height * floor
-
- #Create a new story within the building
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalFloortoFloorHeight(floor_to_floor_height)
- story.setName("Story #{floor + 1}")
-
-
- left_nw_point = OpenStudio::Point3d.new(0, left_width, z)
- left_ne_point = OpenStudio::Point3d.new(left_end_length, left_width, z)
- upper_sw_point = OpenStudio::Point3d.new(left_end_length, left_width - left_end_offset, z)
- upper_se_point = OpenStudio::Point3d.new(length - right_end_length, left_width - left_end_offset, z)
- right_nw_point = OpenStudio::Point3d.new(length - right_end_length, right_width, z)
- right_ne_point = OpenStudio::Point3d.new(length, right_width, z)
- lower_se_point = OpenStudio::Point3d.new(length, 0, z)
- lower_sw_point = OpenStudio::Point3d.new(0, 0, z)
-
- # Identity matrix for setting space origins
- m = OpenStudio::Matrix.new(4, 4, 0)
- m[0, 0] = 1
- m[1, 1] = 1
- m[2, 2] = 1
- m[3, 3] = 1
-
- # Define polygons for a L-shape building with perimeter core zoning
- if perimeter_zone_depth > 0
- perimeter_left_nw_point = left_nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_left_ne_point = left_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_sw_point = upper_sw_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_upper_se_point = upper_se_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_right_nw_point = right_nw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_right_ne_point = right_ne_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, -perimeter_zone_depth, 0)
- perimeter_lower_se_point = lower_se_point + OpenStudio::Vector3d.new(-perimeter_zone_depth, perimeter_zone_depth, 0)
- perimeter_lower_sw_point = lower_sw_point + OpenStudio::Vector3d.new(perimeter_zone_depth, perimeter_zone_depth, 0)
-
- west_left_perimeter_polygon = OpenStudio::Point3dVector.new
- west_left_perimeter_polygon << lower_sw_point
- west_left_perimeter_polygon << left_nw_point
- west_left_perimeter_polygon << perimeter_left_nw_point
- west_left_perimeter_polygon << perimeter_lower_sw_point
- west_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_left_perimeter_polygon, floor_to_floor_height, model)
- west_left_perimeter_space = west_left_perimeter_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- west_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_left_perimeter_space.setBuildingStory(story)
- west_left_perimeter_space.setName("Story #{floor + 1} West Left Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_left_perimeter_polygon = OpenStudio::Point3dVector.new
- north_left_perimeter_polygon << left_nw_point
- north_left_perimeter_polygon << left_ne_point
- north_left_perimeter_polygon << perimeter_left_ne_point
- north_left_perimeter_polygon << perimeter_left_nw_point
- north_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_left_perimeter_polygon, floor_to_floor_height, model)
- north_left_perimeter_space = north_left_perimeter_space.get
- m[0, 3] = perimeter_left_nw_point.x
- m[1, 3] = perimeter_left_nw_point.y
- m[2, 3] = perimeter_left_nw_point.z
- north_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_left_perimeter_space.setBuildingStory(story)
- north_left_perimeter_space.setName("Story #{floor + 1} North Left Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_left_perimeter_polygon = OpenStudio::Point3dVector.new
- east_left_perimeter_polygon << left_ne_point
- east_left_perimeter_polygon << upper_sw_point
- east_left_perimeter_polygon << perimeter_upper_sw_point
- east_left_perimeter_polygon << perimeter_left_ne_point
- east_left_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_left_perimeter_polygon, floor_to_floor_height, model)
- east_left_perimeter_space = east_left_perimeter_space.get
- m[0, 3] = perimeter_upper_sw_point.x
- m[1, 3] = perimeter_upper_sw_point.y
- m[2, 3] = perimeter_upper_sw_point.z
- east_left_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_left_perimeter_space.setBuildingStory(story)
- east_left_perimeter_space.setName("Story #{floor + 1} East Left Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- north_lower_perimeter_polygon << upper_sw_point
- north_lower_perimeter_polygon << upper_se_point
- north_lower_perimeter_polygon << perimeter_upper_se_point
- north_lower_perimeter_polygon << perimeter_upper_sw_point
- north_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_lower_perimeter_polygon, floor_to_floor_height, model)
- north_lower_perimeter_space = north_lower_perimeter_space.get
- m[0, 3] = perimeter_upper_sw_point.x
- m[1, 3] = perimeter_upper_sw_point.y
- m[2, 3] = perimeter_upper_sw_point.z
- north_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_lower_perimeter_space.setBuildingStory(story)
- north_lower_perimeter_space.setName("Story #{floor + 1} North Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- west_right_perimeter_polygon = OpenStudio::Point3dVector.new
- west_right_perimeter_polygon << upper_se_point
- west_right_perimeter_polygon << right_nw_point
- west_right_perimeter_polygon << perimeter_right_nw_point
- west_right_perimeter_polygon << perimeter_upper_se_point
- west_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(west_right_perimeter_polygon, floor_to_floor_height, model)
- west_right_perimeter_space = west_right_perimeter_space.get
- m[0, 3] = upper_se_point.x
- m[1, 3] = upper_se_point.y
- m[2, 3] = upper_se_point.z
- west_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_right_perimeter_space.setBuildingStory(story)
- west_right_perimeter_space.setName("Story #{floor + 1} West Right Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- north_right_perimeter_polygon = OpenStudio::Point3dVector.new
- north_right_perimeter_polygon << right_nw_point
- north_right_perimeter_polygon << right_ne_point
- north_right_perimeter_polygon << perimeter_right_ne_point
- north_right_perimeter_polygon << perimeter_right_nw_point
- north_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(north_right_perimeter_polygon, floor_to_floor_height, model)
- north_right_perimeter_space = north_right_perimeter_space.get
- m[0, 3] = perimeter_right_nw_point.x
- m[1, 3] = perimeter_right_nw_point.y
- m[2, 3] = perimeter_right_nw_point.z
- north_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- north_right_perimeter_space.setBuildingStory(story)
- north_right_perimeter_space.setName("Story #{floor + 1} North Right Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_right_perimeter_polygon = OpenStudio::Point3dVector.new
- east_right_perimeter_polygon << right_ne_point
- east_right_perimeter_polygon << lower_se_point
- east_right_perimeter_polygon << perimeter_lower_se_point
- east_right_perimeter_polygon << perimeter_right_ne_point
- east_right_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(east_right_perimeter_polygon, floor_to_floor_height, model)
- east_right_perimeter_space = east_right_perimeter_space.get
- m[0, 3] = perimeter_lower_se_point.x
- m[1, 3] = perimeter_lower_se_point.y
- m[2, 3] = perimeter_lower_se_point.z
- east_right_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_right_perimeter_space.setBuildingStory(story)
- east_right_perimeter_space.setName("Story #{floor + 1} East Right Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_lower_perimeter_polygon = OpenStudio::Point3dVector.new
- south_lower_perimeter_polygon << lower_se_point
- south_lower_perimeter_polygon << lower_sw_point
- south_lower_perimeter_polygon << perimeter_lower_sw_point
- south_lower_perimeter_polygon << perimeter_lower_se_point
- south_lower_perimeter_space = OpenStudio::Model::Space::fromFloorPrint(south_lower_perimeter_polygon, floor_to_floor_height, model)
- south_lower_perimeter_space = south_lower_perimeter_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- south_lower_perimeter_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_lower_perimeter_space.setBuildingStory(story)
- south_lower_perimeter_space.setName("Story #{floor + 1} South Lower Perimeter Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- west_core_polygon = OpenStudio::Point3dVector.new
- west_core_polygon << perimeter_lower_sw_point
- west_core_polygon << perimeter_left_nw_point
- west_core_polygon << perimeter_left_ne_point
- west_core_polygon << perimeter_upper_sw_point
- west_core_space = OpenStudio::Model::Space::fromFloorPrint(west_core_polygon, floor_to_floor_height, model)
- west_core_space = west_core_space.get
- m[0, 3] = perimeter_lower_sw_point.x
- m[1, 3] = perimeter_lower_sw_point.y
- m[2, 3] = perimeter_lower_sw_point.z
- west_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_core_space.setBuildingStory(story)
- west_core_space.setName("Story #{floor + 1} West Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_core_polygon = OpenStudio::Point3dVector.new
- south_core_polygon << perimeter_upper_sw_point
- south_core_polygon << perimeter_upper_se_point
- south_core_polygon << perimeter_lower_se_point
- south_core_polygon << perimeter_lower_sw_point
- south_core_space = OpenStudio::Model::Space::fromFloorPrint(south_core_polygon, floor_to_floor_height, model)
- south_core_space = south_core_space.get
- m[0, 3] = perimeter_lower_sw_point.x
- m[1, 3] = perimeter_lower_sw_point.y
- m[2, 3] = perimeter_lower_sw_point.z
- south_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_core_space.setBuildingStory(story)
- south_core_space.setName("Story #{floor + 1} South Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_core_polygon = OpenStudio::Point3dVector.new
- east_core_polygon << perimeter_upper_se_point
- east_core_polygon << perimeter_right_nw_point
- east_core_polygon << perimeter_right_ne_point
- east_core_polygon << perimeter_lower_se_point
- east_core_space = OpenStudio::Model::Space::fromFloorPrint(east_core_polygon, floor_to_floor_height, model)
- east_core_space = east_core_space.get
- m[0, 3] = perimeter_upper_se_point.x
- m[1, 3] = perimeter_upper_se_point.y
- m[2, 3] = perimeter_upper_se_point.z
- east_core_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_core_space.setBuildingStory(story)
- east_core_space.setName("Story #{floor + 1} East Core Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- # Minimal zones
- else
- west_polygon = OpenStudio::Point3dVector.new
- west_polygon << lower_sw_point
- west_polygon << left_nw_point
- west_polygon << left_ne_point
- west_polygon << upper_sw_point
- west_space = OpenStudio::Model::Space::fromFloorPrint(west_polygon, floor_to_floor_height, model)
- west_space = west_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- west_space.changeTransformation(OpenStudio::Transformation.new(m))
- west_space.setBuildingStory(story)
- west_space.setName("Story #{floor + 1} West Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- south_polygon = OpenStudio::Point3dVector.new
- south_polygon << lower_sw_point
- south_polygon << upper_sw_point
- south_polygon << upper_se_point
- south_polygon << lower_se_point
- south_space = OpenStudio::Model::Space::fromFloorPrint(south_polygon, floor_to_floor_height, model)
- south_space = south_space.get
- m[0, 3] = lower_sw_point.x
- m[1, 3] = lower_sw_point.y
- m[2, 3] = lower_sw_point.z
- south_space.changeTransformation(OpenStudio::Transformation.new(m))
- south_space.setBuildingStory(story)
- south_space.setName("Story #{floor + 1} South Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- east_polygon = OpenStudio::Point3dVector.new
- east_polygon << upper_se_point
- east_polygon << right_nw_point
- east_polygon << right_ne_point
- east_polygon << lower_se_point
- east_space = OpenStudio::Model::Space::fromFloorPrint(east_polygon, floor_to_floor_height, model)
- east_space = east_space.get
- m[0, 3] = upper_se_point.x
- m[1, 3] = upper_se_point.y
- m[2, 3] = upper_se_point.z
- east_space.changeTransformation(OpenStudio::Transformation.new(m))
- east_space.setBuildingStory(story)
- east_space.setName("Story #{floor + 1} East Space")
-
- # num_complete += 1
- # runner.updateProgress(100*num_complete/num_total)
-
- end
-
- #Set vertical story position
- story.setNominalZCoordinate(z)
-
- end #End of floor loop
-
- # runner.destroyProgressBar
- BTAP::Geometry::match_surfaces(model)
- return model
- end
-
- def self.test_geometry()
- courtyard = OpenStudio::Model::Model.new()
- Geometry.create_shape_courtyard(courtyard)
- courtyard.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/courtyard.osm"))
-
- rectangle = OpenStudio::Model::Model.new()
- Geometry.create_shape_rectangle(rectangle)
- Geometry.scale_model(rectangle, 2, 0.5, 1.0)
- Geometry.rotate_model(rectangle, 45.0)
- File.delete(BTAP::TESTING_FOLDER + "/rectangle.osm")
- rectangle.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/rectangle.osm"))
-
- l_shape = OpenStudio::Model::Model.new()
- Geometry.create_shape_l(l_shape)
- l_shape.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/l_shape.osm"))
-
- h_shape = OpenStudio::Model::Model.new()
- Geometry.create_shape_h(h_shape)
- h_shape.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/h_shape.osm"))
-
- t_shape = OpenStudio::Model::Model.new()
- Geometry.create_shape_t(t_shape)
- t_shape.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/t_shape.osm"))
-
- u_shape = OpenStudio::Model::Model.new()
- Geometry.create_shape_u(u_shape)
- u_shape.save(OpenStudio::Path.new(BTAP::TESTING_FOLDER + "/u_shape.osm"))
- end
- end
-
def self.match_surfaces(model)
model.getSpaces.sort.each do |space1|
model.getSpaces.sort.each do |space2|
space1.matchSurfaces(space2)
end
@@ -2161,11 +192,10 @@
total_net_surface_area = total_net_surface_area + surface.netArea
end
return 1.0 - (total_net_surface_area / total_gross_surface_area)
end
-
# This method will rotate the model
# @param model [OpenStudio::Model::Model] OpenStudio model object
# @param degrees [Float] rotation value
# @return [OpenStudio::Model::Model] the model object.
def self.rotate_model(model, degrees)
@@ -2173,11 +203,10 @@
t = OpenStudio::Transformation::rotation(OpenStudio::Vector3d.new(0, 0, 1), degrees * Math::PI / 180)
model.getPlanarSurfaceGroups().each {|planar_surface| planar_surface.changeTransformation(t)}
return model
end
-
def self.rotate_building(model: , degrees: nil)
# report as not applicable if effective relative rotation is 0
if degrees == 0 || degrees.nil?
puts ('The requested rotation was 0 or nil degrees. The model was not rotated.')
@@ -2191,16 +220,12 @@
building = model.getBuilding
# rotate the building
final_building_angle = building.setNorthAxis(building.northAxis + degrees)
end
-
-
-
module BuildingStoreys
-
- #This method will delete any exisiting stories and then try to assign stories based on
+ #This method will delete any exisiting stories and then try to assign stories based on
# the z-axis origin of the space.
def self.auto_assign_spaces_to_stories(model)
#delete existing stories.
model.getBuildingStorys.sort.each {|buildingstory| buildingstory.remove}
#create hash of building storeys, index is the Z-axis origin of the space.
@@ -2214,23 +239,10 @@
space.setBuildingStory(building_story_hash[space.zOrigin])
end
end
- #Get the zones in a storey
- def self.get_zones_from_storey(storey)
- #check to see if the storey has a zone that is part of the zone list.
- zones = Array.new
- storey.spaces.sort.each do |space|
- if not space.thermalZone.empty? and not zones.include?(space.thermalZone.get)
- zones.push(space.thermalZone.get)
- end
- end
- return zones
- end
-
-
# override run to implement the functionality of your script
# model is an OpenStudio::Model::Model, runner is a OpenStudio::Ruleset::UserScriptRunner
def self.auto_assign_stories(model)
# get all spaces
@@ -2259,80 +271,34 @@
# this should take the sorted list and make and assign stories
sorted_spaces.sort.each do |space|
space_obj = space[0]
space_minz = space[1]
if space_obj.buildingStory.empty?
-
- story = getStoryForNominalZCoordinate(model, space_minz)
- #puts("Setting story of Space " + space_obj.name.get + " to " + story.name.get + ".")
+ story = OpenstudioStandards::Geometry.model_get_building_story_for_nominal_height(model, space_minz)
+ if story.nil?
+ story = OpenStudio::Model::BuildingStory.new(model)
+ story.setNominalZCoordinate(space_minz)
+ story.setName("Building Story #{space_minz.round(1)}m")
+ end
space_obj.setBuildingStory(story)
end
end
end
-
- # find the first story with z coordinate, create one if needed
- def self.getStoryForNominalZCoordinate(model, minz)
-
- model.getBuildingStorys.sort.each do |story|
- z = story.nominalZCoordinate
- if not z.empty?
- if minz == z.get
- return story
- end
- end
- end
-
- story = OpenStudio::Model::BuildingStory.new(model)
- story.setNominalZCoordinate(minz)
- return story
- end
-
- def self.getStoryAboveGround(model)
- count = 0
- model.getBuildingStorys.sort.each do |story|
- z = story.nominalZCoordinate
- unless z.empty?
- if z.to_f >= 0
- #puts story.name.get
- count += 1
- end
- end
- end
- return count
- end
-
-
- def self.getStoryBelowGround(model)
- count = 0
- model.getBuildingStorys.sort.each do |story|
- z = story.nominalZCoordinate
- unless z.empty?
- if z.to_f < 0
- #puts story.name.get
- count += 1
- end
- end
- end
- return count
- end
-
end
-
#This module contains helper functions that deal with Space objects.
module Spaces
+ #This method will return the horizontal placement type. (N,S,W,E,C) In the
+ # case of a corner, it will take whatever surface area it faces is the
+ # largest. It will also return the top, bottom or middle conditions.
- #This method will return the horizontal placement type. (N,S,W,E,C) In the
- # case of a corner, it will take whatever surface area it faces is the
- # largest. It will also return the top, bottom or middle conditions.
-
def self.get_space_placement(space)
horizontal_placement = nil
vertical_placement = nil
json_data = nil
- #get all exterior surfaces.
+ #get all exterior surfaces.
surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces,
["Outdoors",
"Ground",
"GroundFCfactorMethod",
"GroundSlabPreprocessorAverage",
@@ -2354,11 +320,11 @@
int_bottom_surface = BTAP::Geometry::Surfaces::filter_by_surface_types(internal_surfaces, ["Floor"])
int_top_surface = BTAP::Geometry::Surfaces::filter_by_surface_types(internal_surfaces, ["RoofCeiling"])
vertical_placement = "NA"
- #determine if space is a top or bottom, both or middle space.
+ #determine if space is a top or bottom, both or middle space.
if ext_bottom_surface.size > 0 and ext_top_surface.size > 0 and int_bottom_surface.size == 0 and int_top_surface.size == 0
vertical_placement = "single_story_space"
elsif int_bottom_surface.size > 0 and ext_top_surface.size > 0 and int_bottom_surface.size > 0
vertical_placement = "top"
elsif ext_bottom_surface.size > 0 and ext_top_surface.size == 0
@@ -2454,11 +420,10 @@
puts JSON.pretty_generate(json_data)
return json_data
end
-
def self.is_perimeter_space?(model, space)
exterior_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces,
["Outdoors",
"Ground",
"GroundFCfactorMethod",
@@ -2488,35 +453,10 @@
entity.visible = false
end
end
end
-
- # This method will return a Array of surfaces that are contained within the
- # passed spaces. Note: if you wish to avoid to create an array of spaces,
- # simply put the space variable in [] brackets
- # Ex: get_all_surfaces_from_spaces( [space1,space2] )
- # @param spaces_array an array of type [OpenStudio::Model::Space]
- # @return an array of surfaces contained in the passed spaces.
- def self.get_surfaces_from_spaces(model, spaces_array)
- BTAP::Geometry::Surfaces::get_surfaces_from_spaces(spaces_array)
- end
-
- # This method will return a SpaceArray of surfaces that are contained within the
- # passed floors. Note: if you wish to avoid to create an array of spaces,
- # simply put the space variable in [] brackets
- # Ex: get_all_surfaces_from_spaces( [space1,space2] )
- # @param model
- # @param floors
- # @return [Array<OpenStudio::Model::Space>] an array of spaces
- def self.get_spaces_from_storeys(model, floors)
- floors = BTAP::Common::validate_array(model, floors, "BuildingStory")
- spaces = Array.new()
- floors.each {|floor| spaces.concat(floor.spaces)}
- return spaces
- end
-
# This method will filter an array of spaces that have an external wall
# passed floors. Note: if you wish to avoid to create an array of spaces,
# simply put the space variable in [] brackets
# Ex: get_all_surfaces_from_spaces( [space1,space2] )
# @param spaces_array an array of type [OpenStudio::Model::Space]
@@ -2558,35 +498,20 @@
spaces_array.each do |space|
returnarray << spacetype_array.include?(space.spaceType())
end
return returnarray
end
-
- #to do write test.
- def self.assign_spaces_to_thermal_zone(model, spaces_array, thermal_zone)
- spaces_array = BTAP::Common::validate_array(model, spaces_array, "Space")
- thermal_zone = BTAP::Common::validate_array(model, thermal_zone, "ThermalZone")[0]
- spaces_array.each do |space|
- space.setThermalZone(thermal_zone)
- end
- end
-
end
#This Module contains methods that create, modify and query Thermal zone objects.
module Zones
- def self.enumerate_model(model)
-
- end
-
-
# This method will filter an array of zones that have an external wall
# passed floors. Note: if you wish to avoid to create an array of spaces,
# simply put the space variable in [] brackets
# Ex: get_all_surfaces_from_spaces( [space1,space2] )
- # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] an array of zones
+ # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] an array of zones
# @return [Array<OpenStudio::Model::ThermalZone] an array of thermal zones.
def self.filter_perimeter_zones(thermal_zones)
array = Array.new()
thermal_zones.each do |zone|
zone.space.each do |space|
@@ -2616,33 +541,22 @@
end
end
end
return array
end
-
- def self.get_surfaces_from_thermal_zones(thermal_zone_array)
- BTAP::Geometry::Surfaces::get_all_surfaces_from_thermal_zones(thermal_zone_array)
- end
-
- def self.create_thermal_zone(model, spaces_array = "")
- thermal_zone = OpenStudio::Model::ThermalZone.new(model)
- BTAP::Geometry::Spaces::assign_spaces_to_thermal_zone(model, spaces_array, thermal_zone)
- return thermal_zone
- end
-
end
- module Surfaces
+ module Surfaces
def self.create_surface(model, name, os_point3d_array, boundary_condition = "", construction = "")
os_surface = OpenStudio::Model::Surface.new(os_point3d_array, model)
os_surface.setName(name)
if OpenStudio::Model::Surface::validOutsideBoundaryConditionValues.include?(boundary_condition)
self.set_surfaces_boundary_condition([os_surface], boundary_condition)
else
puts "boundary condition not set for #{name}"
end
- self.set_surfaces_construction([os_surface], construction)
+ os_surface.setConstruction(construction)
return os_surface
end
# This method will rotate a surface
# @param planar_surfaces [Array<OpenStudio::Model::Surface>] an array of surfaces
@@ -2675,119 +589,10 @@
existing windows and adds new window to meet requested ratio.") unless result
end
return surfaces
end
-
- # This Method removes all the subsurfaces in a model (Windows, Doors )
- # @author Phylroy A. Lopez
- # @return [OpenStudio::Model::Model] the OpenStudio model object (self reference).
- def self.remove_all_subsurfaces(surfaces)
- surfaces.each do |subsurface|
- subsurface.remove
- end
- return surfaces
- end
-
- def self.get_surfaces_from_spaces(spaces_array)
- surfaces = Array.new()
- spaces_array.each do |space|
- surfaces.concat(space.surfaces())
- end
- return surfaces
- end
-
- def self.get_surfaces_from_building_stories(model, story_array)
- surfaces = Array.new()
- BTAP::Geometry::Spaces::get_spaces_from_storeys(model, story_array).each do |space|
- surfaces.concat(space.surfaces())
- end
- return surfaces
- end
-
- def self.get_surfaces_from_thermal_zones(thermal_zone_array)
- surfaces = Array.new()
- thermal_zone_array.each do |thermal_zone|
- thermal_zone.spaces.sort.each do |space|
- surfaces.concat(space.surfaces())
- end
- return surfaces
- end
- end
-
- def self.get_subsurfaces_from_surfaces(surface_array)
- subsurfaces = Array.new()
- surface_array.each do |surface|
- subsurfaces.concat(surface.subSurfaces)
- end
- return subsurfaces
- end
-
-
- #determine average conductance on set of surfaces or subsurfaces.
- def self.get_weighted_average_surface_conductance(surfaces)
- total_area = 0.0
- temp = 0.0
- surfaces.each do |surface|
- temp = temp + BTAP::Geometry::Surfaces::get_surface_net_area(surface) * BTAP::Geometry::Surfaces::get_surface_construction_conductance(surface)
- total_area = total_area + BTAP::Geometry::Surfaces::get_surface_net_area(surface)
- end
- average_conductance = "NA"
- average_conductance = temp / total_area unless total_area == 0.0
- return average_conductance
- end
-
- #determine average conductance on set of surfaces or subsurfaces.
- def self.get_weighted_average_surface_shgc(surfaces)
- total_area = 0.0
- temp = 0.0
- surfaces.each do |surface|
- temp = temp + BTAP::Geometry::Surfaces::get_surface_net_area(surface) * BTAP::Geometry::Surfaces::get_surface_construction_shgc(surface)
- total_area = total_area + BTAP::Geometry::Surfaces::get_surface_net_area(surface)
- end
- ave_shgc = "NA"
- ave_shgc = temp / total_area unless total_area == 0.0
- return ave_shgc
- end
-
- #determine average conductance on set of surfaces or subsurfaces.
- def self.get_weighted_average_surface_tvis(surfaces)
- total_area = 0.0
- temp = 0.0
- surfaces.each do |surface|
- temp = temp + BTAP::Geometry::Surfaces::get_surface_net_area(surface) * BTAP::Geometry::Surfaces::get_surface_construction_tvis(surface)
- total_area = total_area + BTAP::Geometry::Surfaces::get_surface_net_area(surface)
- end
- ave_tvis = "NA"
- ave_tvis = temp / total_area unless total_area == 0.0
- return ave_tvis
- end
-
-
- #get total exterior surface area of building.
- def self.get_total_ext_wall_area(model)
- outdoor_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(model.getSurfaces(), "Outdoors")
- outdoor_walls = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "Wall")
-
-
- end
-
- def self.get_total_ext_floor_area(model)
-
- outdoor_floors = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "Floor")
- end
-
- def self.get_total_ext_fenestration_area(model)
-
- end
-
- def self.get_total_ext_roof_area(model)
- outdoor_roofs = BTAP::Geometry::Surfaces::filter_by_surface_types(outdoor_surfaces, "RoofCeiling")
-
- end
-
-
#["FixedWindow" , "OperableWindow" , "Door" , "GlassDoor", "OverheadDoor" , "Skylight", "TubularDaylightDiffuser","TubularDaylightDome"]
def self.filter_subsurfaces_by_types(subsurfaces, subSurfaceTypes)
#check to see if a string or an array was passed.
if subSurfaceTypes.kind_of?(String)
@@ -2828,52 +633,10 @@
surface.setConstruction(new_construction)
end
return surfaces
end
- #This method creates a new construction based on the current, changes the rsi and assign the construction to the current surface.
- #Most of the meat of this method is in the construction class. Testing is done there.
- def self.get_surface_construction_conductance(surface)
- #a bit of acrobatics to get the construction object from the ConstrustionBase object's name.
- construction = OpenStudio::Model::getConstructionByName(surface.model, surface.construction.get.name.to_s).get
- #create a new construction with the requested RSI value based on the current construction.
- return BTAP::Resources::Envelope::Constructions::get_conductance(construction)
- end
-
- #This method gets the shgc for a surface
- def self.get_surface_construction_shgc(surface)
- #a bit of acrobatics to get the construction object from the ConstrustionBase object's name.
- construction = OpenStudio::Model::getConstructionByName(surface.model, surface.construction.get.name.to_s).get
- #create a new construction with the requested RSI value based on the current construction.
- return BTAP::Resources::Envelope::Constructions::get_shgc(surface.model,construction)
- end
-
- #This method gets the tvis for the surface
- def self.get_surface_construction_tvis(surface)
- #a bit of acrobatics to get the construction object from the ConstrustionBase object's name.
- construction = OpenStudio::Model::getConstructionByName(surface.model, surface.construction.get.name.to_s).get
- #create a new construction with the requested RSI value based on the current construction.
- return BTAP::Resources::Envelope::Constructions::get_tvis(model,construction)
- end
-
-
- def self.get_surface_net_area(surface)
- return surface.netArea()
- end
-
- def self.get_sub_surface_net_area(subsurface)
- return subsurface.netArea()
- end
-
-
- def self.set_surfaces_construction(surfaces, construction)
- surfaces.each do |surface|
- surface.setConstruction(construction)
- end
- return true
- end
-
# This method sets the boundary condition for a surface and it's matching surface.
# If set to adiabatic, it will remove all subsurfaces since E+ cannot have adiabatic sub surfaces.
def self.set_surfaces_boundary_condition(model, surfaces, boundaryCondition)
surfaces = BTAP::Common::validate_array(model, surfaces, "Surface")
if OpenStudio::Model::Surface::validOutsideBoundaryConditionValues.include?(boundaryCondition)
@@ -2883,11 +646,11 @@
#subsurface.
surface.subSurfaces.each do |subsurface|
subsurface.remove
end
- #A bug with adiabatic surfaces. They do not hold the default contruction.
+ #A bug with adiabatic surfaces. They do not hold the default contruction.
surface.setConstruction(surface.construction.get()) if surface.isConstructionDefaulted
end
surface.setOutsideBoundaryCondition(boundaryCondition)
adj_surface = surface.adjacentSurface
@@ -2906,11 +669,10 @@
non_defaulted_surfaces = Array.new()
surfaces.each {|surface| non_defaulted_surfaces << surface unless surface.isConstructionDefaulted}
return non_defaulted_surfaces
end
-
def self.filter_by_boundary_condition(surfaces, boundary_conditions)
#check to see if a string or an array was passed.
if boundary_conditions.kind_of?(String)
temp = boundary_conditions
boundary_conditions = Array.new()
@@ -2985,10 +747,9 @@
return_surfaces << surface
end
end
return return_surfaces
end
-
def self.show(surfaces)
surfaces.each do |surface|
if drawing_interface = surface.drawing_interface
if entity = drawing_interface.entity