Module: BTAP::Geometry::Spaces
- Defined in:
- lib/openstudio-standards/btap/geometry.rb
Overview
This module contains helper functions that deal with Space objects.
Class Method Summary collapse
-
.assign_spaces_to_thermal_zone(model, spaces_array, thermal_zone) ⇒ Object
to do write test.
-
.filter_core_spaces(model, spaces_array) ⇒ Object
This method will filter an array of spaces that have no external wall passed floors.
-
.filter_perimeter_spaces(model, spaces_array) ⇒ Object
This method will filter an array of spaces that have an external wall passed floors.
- .filter_spaces_by_space_types(model, spaces_array, spacetype_array) ⇒ Object
-
.get_space_placement(space) ⇒ Object
This method will return the horizontal placement type.
-
.get_spaces_from_storeys(model, floors) ⇒ Array<OpenStudio::Model::Space>
This method will return a SpaceArray of surfaces that are contained within the passed floors.
-
.get_surfaces_from_spaces(model, spaces_array) ⇒ Object
This method will return a Array of surfaces that are contained within the passed spaces.
- .hide(model, space) ⇒ Object
- .is_perimeter_space?(model, space) ⇒ Boolean
- .show(model, space) ⇒ Object
Class Method Details
.assign_spaces_to_thermal_zone(model, spaces_array, thermal_zone) ⇒ Object
to do write test.
2565 2566 2567 2568 2569 2570 2571 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2565 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 |
.filter_core_spaces(model, spaces_array) ⇒ Object
This method will filter an array of spaces that have no 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] )
2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2541 def self.filter_core_spaces(model, spaces_array) spaces_array = BTAP::Common::validate_array(model, spaces_array, "Space") array = Array.new() spaces_array.each do |space| unless space.is_a_perimeter_space?() array.push(space) end end return array end |
.filter_perimeter_spaces(model, spaces_array) ⇒ Object
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] )
2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2524 def self.filter_perimeter_spaces(model, spaces_array) spaces_array = BTAP::Common::validate_array(model, spaces_array, "Space") array = Array.new() spaces_array.each do |space| if space.is_a_perimeter_space?() array.push(space) end end return array end |
.filter_spaces_by_space_types(model, spaces_array, spacetype_array) ⇒ Object
2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2553 def self.filter_spaces_by_space_types(model, spaces_array, spacetype_array) spaces_array = BTAP::Common::validate_array(model, spaces_array, "Space") spacetype_array = BTAP::Common::validate_array(model, spacetype_array, "SpaceType") #validate space array returnarray = Array.new() spaces_array.each do |space| returnarray << spacetype_array.include?(space.spaceType()) end return returnarray end |
.get_space_placement(space) ⇒ Object
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.
2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2328 def self.get_space_placement(space) horizontal_placement = nil vertical_placement = nil json_data = nil #get all exterior surfaces. surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces, ["Outdoors", "Ground", "GroundFCfactorMethod", "GroundSlabPreprocessorAverage", "GroundSlabPreprocessorCore", "GroundSlabPreprocessorPerimeter", "GroundBasementPreprocessorAverageWall", "GroundBasementPreprocessorAverageFloor", "GroundBasementPreprocessorUpperWall", "GroundBasementPreprocessorLowerWall"]) #exterior Surfaces ext_wall_surfaces = BTAP::Geometry::Surfaces::filter_by_surface_types(surfaces, ["Wall"]) ext_bottom_surface = BTAP::Geometry::Surfaces::filter_by_surface_types(surfaces, ["Floor"]) ext_top_surface = BTAP::Geometry::Surfaces::filter_by_surface_types(surfaces, ["RoofCeiling"]) #Interior Surfaces..if needed.... internal_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces, ["Surface"]) int_wall_surfaces = BTAP::Geometry::Surfaces::filter_by_surface_types(internal_surfaces, ["Wall"]) 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. 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 vertical_placement = "bottom" elsif ext_bottom_surface.size == 0 and ext_top_surface.size == 0 vertical_placement = "middle" end #determine if what cardinal direction has the majority of external #surface area of the space. #set this to 'core' by default and change it if it is found to be a space exposed to a cardinal direction. horizontal_placement = nil #set up summing hashes for each direction. json_data = Hash.new walls_area_array = Hash.new subsurface_area_array = Hash.new boundary_conditions = {} boundary_conditions[:outdoors] = ["Outdoors"] boundary_conditions[:ground] = [ "Ground", "GroundFCfactorMethod", "GroundSlabPreprocessorAverage", "GroundSlabPreprocessorCore", "GroundSlabPreprocessorPerimeter", "GroundBasementPreprocessorAverageWall", "GroundBasementPreprocessorAverageFloor", "GroundBasementPreprocessorUpperWall", "GroundBasementPreprocessorLowerWall"] #go through all directions.. need to do north twice since that goes around zero degree mark. orientations = [ {:surface_type => 'Wall', :direction => 'north', :azimuth_from => 0.00, :azimuth_to => 45.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'Wall', :direction => 'north', :azimuth_from => 315.001, :azimuth_to => 360.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'Wall', :direction => 'east', :azimuth_from => 45.001, :azimuth_to => 135.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'Wall', :direction => 'south', :azimuth_from => 135.001, :azimuth_to => 225.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'Wall', :direction => 'west', :azimuth_from => 225.001, :azimuth_to => 315.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'RoofCeiling', :direction => 'top', :azimuth_from => 0.0, :azimuth_to => 360.0, :tilt_from => 0.0, :tilt_to => 180.0}, {:surface_type => 'Floor', :direction => 'bottom', :azimuth_from => 0.0, :azimuth_to => 360.0, :tilt_from => 0.0, :tilt_to => 180.0} ] [:outdoors, :ground].each do |bc| orientations.each do |orientation| walls_area_array[orientation[:direction]] = 0.0 subsurface_area_array[orientation[:direction]] = 0.0 json_data[orientation[:direction]] = {} if json_data[orientation[:direction]].nil? json_data[orientation[:direction]][bc] = {:surface_area => 0.0, :glazed_subsurface_area => 0.0, :opaque_subsurface_area => 0.0} end end [:outdoors, :ground].each do |bc| orientations.each do |orientation| # puts "bc= #{bc}" # puts boundary_conditions[bc.to_sym] # puts boundary_conditions surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces, boundary_conditions[bc]) selected_surfaces = BTAP::Geometry::Surfaces::filter_by_surface_types(surfaces, [orientation[:surface_type]]) BTAP::Geometry::Surfaces::filter_by_azimuth_and_tilt(selected_surfaces, orientation[:azimuth_from], orientation[:azimuth_to], orientation[:tilt_from], orientation[:tilt_to]).each do |surface| #sum wall area and subsurface area by direction. This is the old way so excluding top and bottom surfaces. walls_area_array[orientation[:direction]] += surface.grossArea unless ['RoofCeiling', 'Floor'].include?(orientation[:surface_type]) subsurface_area_array[orientation[:direction]] += surface.subSurfaces.map {|subsurface| subsurface.grossArea}.inject(0) {|sum, x| sum + x} json_data[orientation[:direction]][bc][:surface_area] += surface.grossArea glazings = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(surface.subSurfaces, ["FixedWindow", "OperableWindow", "GlassDoor", "Skylight", "TubularDaylightDiffuser", "TubularDaylightDome"]) doors = BTAP::Geometry::Surfaces::filter_subsurfaces_by_types(surface.subSurfaces, ["Door", "OverheadDoor"]) json_data[orientation[:direction]][bc][:glazed_subsurface_area] += glazings.map {|subsurface| subsurface.grossArea}.inject(0) {|sum, x| sum + x} json_data[orientation[:direction]][bc][:opaque_subsurface_area] += doors.map {|subsurface| subsurface.grossArea}.inject(0) {|sum, x| sum + x} end end end puts JSON.pretty_generate(json_data) puts walls_area_array #find if no direction sum= 0.0 ['north','east','south','west'].each do |direction| [:outdoors,:ground].each do |bc| sum += json_data[direction][bc][:surface_area] end end if sum == 0.0 horizontal_placement = "core" else #find our which cardinal direction has the most exterior surface and declare it that orientation. horizontal_placement = walls_area_array.max_by {|k, v| v}[0] #include ext and ground. end #save JSON data json_data = ({:horizontal_placement => horizontal_placement, :vertical_placement => vertical_placement, }).merge(json_data) puts JSON.pretty_generate(json_data) return json_data end |
.get_spaces_from_storeys(model, floors) ⇒ Array<OpenStudio::Model::Space>
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] )
2511 2512 2513 2514 2515 2516 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2511 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 |
.get_surfaces_from_spaces(model, spaces_array) ⇒ Object
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] )
2500 2501 2502 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2500 def self.get_surfaces_from_spaces(model, spaces_array) BTAP::Geometry::Surfaces::get_surfaces_from_spaces(spaces_array) end |
.hide(model, space) ⇒ Object
2485 2486 2487 2488 2489 2490 2491 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2485 def self.hide(model, space) if drawing_interface = BTAP::Common::validate_array(model, space, "Space").first.drawing_interface if entity = drawing_interface.entity entity.visible = false end end end |
.is_perimeter_space?(model, space) ⇒ Boolean
2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2460 def self.is_perimeter_space?(model, space) exterior_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(space.surfaces, ["Outdoors", "Ground", "GroundFCfactorMethod", "GroundSlabPreprocessorAverage", "GroundSlabPreprocessorCore", "GroundSlabPreprocessorPerimeter", "GroundBasementPreprocessorAverageWall", "GroundBasementPreprocessorAverageFloor", "GroundBasementPreprocessorUpperWall", "GroundBasementPreprocessorLowerWall"]) return BTAP::Geometry::Surfaces::filter_by_surface_types(exterior_surfaces, ["Wall"]).size > 0 end |
.show(model, space) ⇒ Object
2477 2478 2479 2480 2481 2482 2483 |
# File 'lib/openstudio-standards/btap/geometry.rb', line 2477 def self.show(model, space) if drawing_interface = BTAP::Common::validate_array(model, space, "Space").first.drawing_interface if entity = drawing_interface.entity entity.visible = true end end end |