honeybee-openstudio 0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yaml +88 -0
  3. data/.gitignore +33 -0
  4. data/.releaserc.json +7 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE.md +23 -0
  7. data/README.md +95 -0
  8. data/Rakefile +16 -0
  9. data/doc_templates/LICENSE.md +23 -0
  10. data/doc_templates/README.md.erb +42 -0
  11. data/doc_templates/copyright_erb.txt +32 -0
  12. data/doc_templates/copyright_js.txt +5 -0
  13. data/doc_templates/copyright_ruby.txt +30 -0
  14. data/honeybee-openstudio.gemspec +38 -0
  15. data/lib/files/Honeybee.rb +113 -0
  16. data/lib/files/honeybee_workflow.osw +48 -0
  17. data/lib/files/urbanopt_Gemfile +32 -0
  18. data/lib/from_openstudio.rb +49 -0
  19. data/lib/from_openstudio/geometry/aperture.rb +136 -0
  20. data/lib/from_openstudio/geometry/door.rb +136 -0
  21. data/lib/from_openstudio/geometry/face.rb +174 -0
  22. data/lib/from_openstudio/geometry/room.rb +121 -0
  23. data/lib/from_openstudio/geometry/shade.rb +87 -0
  24. data/lib/from_openstudio/model.rb +123 -0
  25. data/lib/from_openstudio/model_object.rb +43 -0
  26. data/lib/from_openstudio/simulation/design_day.rb +123 -0
  27. data/lib/from_openstudio/simulation/parameter_model.rb +93 -0
  28. data/lib/from_openstudio/simulation/simulation_output.rb +67 -0
  29. data/lib/honeybee.rb +93 -0
  30. data/lib/honeybee/_defaults/energy_default.json +1682 -0
  31. data/lib/honeybee/_defaults/model.json +11311 -0
  32. data/lib/honeybee/_defaults/simulation-parameter.json +973 -0
  33. data/lib/honeybee/construction/air.rb +42 -0
  34. data/lib/honeybee/construction/opaque.rb +42 -0
  35. data/lib/honeybee/construction/shade.rb +42 -0
  36. data/lib/honeybee/construction/window.rb +51 -0
  37. data/lib/honeybee/construction/windowshade.rb +43 -0
  38. data/lib/honeybee/construction_set.rb +42 -0
  39. data/lib/honeybee/extension.rb +129 -0
  40. data/lib/honeybee/geometry/aperture.rb +42 -0
  41. data/lib/honeybee/geometry/door.rb +42 -0
  42. data/lib/honeybee/geometry/face.rb +48 -0
  43. data/lib/honeybee/geometry/room.rb +56 -0
  44. data/lib/honeybee/geometry/shade.rb +42 -0
  45. data/lib/honeybee/hvac/ideal_air.rb +42 -0
  46. data/lib/honeybee/hvac/template.rb +73 -0
  47. data/lib/honeybee/load/electric_equipment.rb +42 -0
  48. data/lib/honeybee/load/gas_equipment.rb +42 -0
  49. data/lib/honeybee/load/infiltration.rb +42 -0
  50. data/lib/honeybee/load/lighting.rb +43 -0
  51. data/lib/honeybee/load/people.rb +42 -0
  52. data/lib/honeybee/load/setpoint_humidistat.rb +46 -0
  53. data/lib/honeybee/load/setpoint_thermostat.rb +46 -0
  54. data/lib/honeybee/load/ventilation.rb +42 -0
  55. data/lib/honeybee/material/opaque.rb +42 -0
  56. data/lib/honeybee/material/opaque_no_mass.rb +42 -0
  57. data/lib/honeybee/material/window_blind.rb +42 -0
  58. data/lib/honeybee/material/window_gas.rb +42 -0
  59. data/lib/honeybee/material/window_gas_custom.rb +42 -0
  60. data/lib/honeybee/material/window_gas_mixture.rb +42 -0
  61. data/lib/honeybee/material/window_glazing.rb +42 -0
  62. data/lib/honeybee/material/window_shade.rb +42 -0
  63. data/lib/honeybee/material/window_simpleglazsys.rb +42 -0
  64. data/lib/honeybee/model.rb +87 -0
  65. data/lib/honeybee/model_object.rb +108 -0
  66. data/lib/honeybee/program_type.rb +56 -0
  67. data/lib/honeybee/schedule/fixed_interval.rb +42 -0
  68. data/lib/honeybee/schedule/ruleset.rb +42 -0
  69. data/lib/honeybee/schedule/type_limit.rb +42 -0
  70. data/lib/honeybee/simulation/design_day.rb +42 -0
  71. data/lib/honeybee/simulation/parameter_model.rb +86 -0
  72. data/lib/honeybee/simulation/simulation_output.rb +42 -0
  73. data/lib/honeybee/ventcool/control.rb +42 -0
  74. data/lib/honeybee/ventcool/opening.rb +46 -0
  75. data/lib/honeybee/ventcool/simulation.rb +42 -0
  76. data/lib/measures/.gitkeep +0 -0
  77. data/lib/measures/from_honeybee_model/LICENSE.md +23 -0
  78. data/lib/measures/from_honeybee_model/README.md +32 -0
  79. data/lib/measures/from_honeybee_model/measure.rb +91 -0
  80. data/lib/measures/from_honeybee_model/measure.xml +80 -0
  81. data/lib/measures/from_honeybee_model/tests/from_honeybee_model_test.rb +126 -0
  82. data/lib/measures/from_honeybee_simulation_parameter/LICENSE.md +23 -0
  83. data/lib/measures/from_honeybee_simulation_parameter/README.md +32 -0
  84. data/lib/measures/from_honeybee_simulation_parameter/measure.rb +95 -0
  85. data/lib/measures/from_honeybee_simulation_parameter/measure.xml +86 -0
  86. data/lib/measures/from_honeybee_simulation_parameter/tests/from_honeybee_simulation_parameter_test.rb +109 -0
  87. data/lib/to_openstudio.rb +92 -0
  88. data/lib/to_openstudio/construction/air.rb +56 -0
  89. data/lib/to_openstudio/construction/opaque.rb +67 -0
  90. data/lib/to_openstudio/construction/shade.rb +99 -0
  91. data/lib/to_openstudio/construction/window.rb +70 -0
  92. data/lib/to_openstudio/construction/windowshade.rb +196 -0
  93. data/lib/to_openstudio/construction_set.rb +266 -0
  94. data/lib/to_openstudio/geometry/aperture.rb +157 -0
  95. data/lib/to_openstudio/geometry/door.rb +150 -0
  96. data/lib/to_openstudio/geometry/face.rb +178 -0
  97. data/lib/to_openstudio/geometry/room.rb +442 -0
  98. data/lib/to_openstudio/geometry/shade.rb +79 -0
  99. data/lib/to_openstudio/hvac/Model.hvac.rb +641 -0
  100. data/lib/to_openstudio/hvac/ideal_air.rb +141 -0
  101. data/lib/to_openstudio/hvac/template.rb +169 -0
  102. data/lib/to_openstudio/load/electric_equipment.rb +87 -0
  103. data/lib/to_openstudio/load/gas_equipment.rb +88 -0
  104. data/lib/to_openstudio/load/infiltration.rb +86 -0
  105. data/lib/to_openstudio/load/lighting.rb +89 -0
  106. data/lib/to_openstudio/load/people.rb +91 -0
  107. data/lib/to_openstudio/load/setpoint_humidistat.rb +66 -0
  108. data/lib/to_openstudio/load/setpoint_thermostat.rb +62 -0
  109. data/lib/to_openstudio/load/ventilation.rb +87 -0
  110. data/lib/to_openstudio/material/opaque.rb +85 -0
  111. data/lib/to_openstudio/material/opaque_no_mass.rb +85 -0
  112. data/lib/to_openstudio/material/window_blind.rb +229 -0
  113. data/lib/to_openstudio/material/window_gas.rb +67 -0
  114. data/lib/to_openstudio/material/window_gas_custom.rb +108 -0
  115. data/lib/to_openstudio/material/window_gas_mixture.rb +70 -0
  116. data/lib/to_openstudio/material/window_glazing.rb +157 -0
  117. data/lib/to_openstudio/material/window_shade.rb +151 -0
  118. data/lib/to_openstudio/material/window_simpleglazsys.rb +64 -0
  119. data/lib/to_openstudio/model.rb +497 -0
  120. data/lib/to_openstudio/model_object.rb +52 -0
  121. data/lib/to_openstudio/program_type.rb +104 -0
  122. data/lib/to_openstudio/schedule/fixed_interval.rb +105 -0
  123. data/lib/to_openstudio/schedule/ruleset.rb +164 -0
  124. data/lib/to_openstudio/schedule/type_limit.rb +76 -0
  125. data/lib/to_openstudio/simulation/design_day.rb +96 -0
  126. data/lib/to_openstudio/simulation/parameter_model.rb +243 -0
  127. data/lib/to_openstudio/ventcool/control.rb +185 -0
  128. data/lib/to_openstudio/ventcool/opening.rb +189 -0
  129. data/lib/to_openstudio/ventcool/simulation.rb +101 -0
  130. metadata +301 -0
@@ -0,0 +1,113 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'urbanopt/reporting'
33
+ require 'openstudio/common_measures'
34
+ require 'openstudio/model_articulation'
35
+
36
+ require 'json'
37
+
38
+ module URBANopt
39
+ module Scenario
40
+ class HoneybeeMapper < SimulationMapperBase
41
+
42
+ # class level variables
43
+ @@instance_lock = Mutex.new
44
+ @@osw = nil
45
+ @@geometry = nil
46
+
47
+ def initialize()
48
+
49
+ # do initialization of class variables in thread safe way
50
+ @@instance_lock.synchronize do
51
+ if @@osw.nil?
52
+
53
+ # load the OSW for this class
54
+ osw_path = File.join(File.dirname(__FILE__), 'honeybee_workflow.osw')
55
+ File.open(osw_path, 'r') do |file|
56
+ @@osw = JSON.parse(file.read, symbolize_names: true)
57
+ end
58
+
59
+ # configure OSW with extension gem paths for measures and files
60
+ # all extension gems must be required before this line
61
+ @@osw = OpenStudio::Extension.configure_osw(@@osw)
62
+ end
63
+ end
64
+ end
65
+
66
+ def create_osw(scenario, features, feature_names)
67
+
68
+ if features.size != 1
69
+ raise "Mapper currently cannot simulate more than one feature at a time."
70
+ end
71
+ feature = features[0]
72
+ feature_id = feature.id
73
+ feature_type = feature.type
74
+ feature_name = feature.name
75
+ if feature_names.size == 1
76
+ feature_name = feature_names[0]
77
+ end
78
+
79
+ # deep clone of @@osw before we configure it
80
+ osw = Marshal.load(Marshal.dump(@@osw))
81
+
82
+ # set the name and description of the OSW to reference this particular feature
83
+ osw[:name] = feature_name
84
+ osw[:description] = feature_name
85
+
86
+ if feature_type == 'Building'
87
+ # set the honeybee JSON key to the honeybee_model measure
88
+ OpenStudio::Extension.set_measure_argument(
89
+ osw, 'from_honeybee_model', 'model_json', feature.detailed_model_filename)
90
+
91
+ # check if there is a HVAC key in the feature JSON properties
92
+ building_hash = feature.to_hash
93
+ if building_hash.key?(:system_type)
94
+ # assume the typical building measure is in the OSW and add the system type
95
+ OpenStudio::Extension.set_measure_argument(
96
+ osw, 'create_typical_building_from_model', 'system_type', system_type)
97
+ end
98
+
99
+ # add the feature id and name to the reporting measure
100
+ OpenStudio::Extension.set_measure_argument(
101
+ osw, 'default_feature_reports', 'feature_id', feature_id)
102
+ OpenStudio::Extension.set_measure_argument(
103
+ osw, 'default_feature_reports', 'feature_name', feature_name)
104
+ OpenStudio::Extension.set_measure_argument(
105
+ osw, 'default_feature_reports', 'feature_type', feature_type)
106
+
107
+ end
108
+ return osw
109
+ end
110
+
111
+ end #HoneybeeMapper
112
+ end #Scenario
113
+ end #URBANopt
@@ -0,0 +1,48 @@
1
+ {
2
+ "seed_file": null,
3
+ "weather_file": null,
4
+ "measure_paths": [],
5
+ "file_paths": [],
6
+ "run_directory": null,
7
+ "steps": [
8
+ {
9
+ "measure_dir_name": "from_honeybee_simulation_parameter",
10
+ "arguments": {
11
+ "simulation_parameter_json": "simulation_parameter.json"
12
+ }
13
+ },{
14
+ "measure_dir_name": "from_honeybee_model",
15
+ "arguments": {
16
+ "model_json": "multi_zone_model.json"
17
+ }
18
+ },{
19
+ "name": "create_typical_building_from_model",
20
+ "measure_dir_name": "create_typical_building_from_model",
21
+ "arguments": {
22
+ "__SKIP__": true,
23
+ "template": "90.1-2004",
24
+ "add_constructions": false,
25
+ "add_space_type_loads": false,
26
+ "add_elevators": false,
27
+ "add_exterior_lights": false,
28
+ "add_exhaust": false,
29
+ "add_swh": false,
30
+ "add_refrigeration": false,
31
+ "remove_objects": false,
32
+ "system_type": "Inferred",
33
+ "add_hvac": true,
34
+ "use_upstream_args": false
35
+ }
36
+ },{
37
+ "measure_dir_name": "default_feature_reports",
38
+ "arguments": {
39
+ "__SKIP__": true,
40
+ "feature_id": null,
41
+ "feature_name": null,
42
+ "feature_type": null
43
+ }
44
+ }
45
+ ],
46
+ "name": null,
47
+ "description": null
48
+ }
@@ -0,0 +1,32 @@
1
+ source 'http://rubygems.org'
2
+
3
+ ruby '~> 2.5.0'
4
+
5
+ allow_local = ENV['FAVOR_LOCAL_GEMS']
6
+
7
+ if allow_local && File.exist?('../openstudio-model-articulation-gem')
8
+ gem 'openstudio-model-articulation', path: '../openstudio-model-articulation-gem'
9
+ elsif allow_local
10
+ gem 'openstudio-model-articulation', github: 'NREL/openstudio-model-articulation-gem', branch: 'develop'
11
+ else
12
+ gem 'openstudio-model-articulation', '0.2.0'
13
+ end
14
+
15
+ if allow_local && File.exist?('../urbanopt-geojson-gem')
16
+ gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem'
17
+ elsif allow_local
18
+ gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop'
19
+ else
20
+ gem 'urbanopt-geojson', '~> 0.4.0'
21
+ end
22
+
23
+ if allow_local && File.exist?('../urbanopt-reporting-gem')
24
+ gem 'urbanopt-reporting', path: '../urbanopt-reporting-gem'
25
+ elsif allow_local
26
+ gem 'urbanopt-reporting', github: 'URBANopt/urbanopt-reporting-gem', branch: 'develop'
27
+ else
28
+ gem 'urbanopt-reporting', '~> 0.2.1'
29
+ end
30
+
31
+ # include the honeybee-openstudio-gem
32
+ gem 'honeybee-openstudio', '2.7.3'
@@ -0,0 +1,49 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ # import the honeybee objects which we will extend
33
+ require 'honeybee'
34
+
35
+ # extend the compound objects that house the other objects
36
+ require 'from_openstudio/model'
37
+ require 'from_openstudio/model_object'
38
+
39
+ # extend the geometry objects
40
+ require 'from_openstudio/geometry/aperture'
41
+ require 'from_openstudio/geometry/door'
42
+ require 'from_openstudio/geometry/face'
43
+ require 'from_openstudio/geometry/room'
44
+ require 'from_openstudio/geometry/shade'
45
+
46
+ # extend the simulation objects
47
+ require 'from_openstudio/simulation/design_day'
48
+ require 'from_openstudio/simulation/parameter_model'
49
+ require 'from_openstudio/simulation/simulation_output'
@@ -0,0 +1,136 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/geometry/aperture'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class Aperture < ModelObject
38
+
39
+ def self.from_sub_surface(sub_surface, site_transformation)
40
+ hash = {}
41
+ hash[:type] = 'Aperture'
42
+ hash[:identifier] = clean_identifier(sub_surface.nameString)
43
+ hash[:display_name] = sub_surface.nameString
44
+ hash[:user_data] = {handle: sub_surface.handle.to_s}
45
+ hash[:properties] = properties_from_sub_surface(sub_surface)
46
+ hash[:geometry] = geometry_from_sub_surface(sub_surface, site_transformation)
47
+ hash[:boundary_condition] = boundary_condition_from_sub_surface(sub_surface)
48
+
49
+ sub_surface_type = sub_surface.subSurfaceType
50
+ hash[:is_operable] = (sub_surface_type == 'OperableWindow')
51
+
52
+ indoor_shades = indoor_shades_from_sub_surface(sub_surface)
53
+ hash[:indoor_shades] = indoor_shades if !indoor_shades.empty?
54
+
55
+ outdoor_shades = outdoor_shades_from_sub_surface(sub_surface)
56
+ hash[:outdoor_shades] = outdoor_shades if !outdoor_shades.empty?
57
+
58
+ hash
59
+ end
60
+
61
+ def self.properties_from_sub_surface(sub_surface)
62
+ hash = {}
63
+ hash[:type] = 'AperturePropertiesAbridged'
64
+ hash[:energy] = energy_properties_from_sub_surface(sub_surface)
65
+ hash
66
+ end
67
+
68
+ def self.energy_properties_from_sub_surface(sub_surface)
69
+ hash = {}
70
+ hash[:type] = 'ApertureEnergyPropertiesAbridged'
71
+
72
+ construction = sub_surface.construction
73
+ if !construction.empty?
74
+ hash[:construction] = clean_identifier(construction.get.nameString)
75
+ end
76
+
77
+ hash
78
+ end
79
+
80
+ def self.geometry_from_sub_surface(sub_surface, site_transformation)
81
+ result = {}
82
+ result[:type] = 'Face3D'
83
+ result[:boundary] = []
84
+ vertices = site_transformation * sub_surface.vertices
85
+ vertices.each do |v|
86
+ result[:boundary] << [v.x, v.y, v.z]
87
+ end
88
+ result
89
+ end
90
+
91
+ def self.boundary_condition_from_sub_surface(sub_surface)
92
+ result = {}
93
+ surface = sub_surface.surface.get
94
+ surface_type = surface.surfaceType
95
+ adjacent_sub_surface = sub_surface.adjacentSubSurface
96
+ if !adjacent_sub_surface.empty?
97
+ adjacent_space = clean_identifier(adjacent_sub_surface.get.space.get.nameString)
98
+ adjacent_surface = clean_identifier(adjacent_sub_surface.get.surface.get.nameString)
99
+ adjacent_sub_surface = clean_identifier(adjacent_sub_surface.get.nameString)
100
+ result = {type: 'Surface', boundary_condition_objects: [adjacent_sub_surface, adjacent_surface, adjacent_space]}
101
+ elsif surface.isGroundSurface
102
+ result = {type: 'Ground'}
103
+ elsif surface_type == 'Adiabatic'
104
+ result = {type: 'Adiabatic'}
105
+ else
106
+ sun_exposure = (surface.sunExposure == 'SunExposed')
107
+ wind_exposure = (surface.windExposure == 'WindExposed')
108
+ view_factor = sub_surface.viewFactortoGround
109
+ if view_factor.empty?
110
+ view_factor = {type: 'Autocalculate'}
111
+ else
112
+ view_factor = view_factor.get
113
+ end
114
+ result = {type: 'Outdoors', sun_exposure: sun_exposure,
115
+ wind_exposure: wind_exposure, view_factor: view_factor}
116
+ end
117
+ result
118
+ end
119
+
120
+ def self.indoor_shades_from_sub_surface(sub_surface)
121
+ []
122
+ end
123
+
124
+ def self.outdoor_shades_from_sub_surface(sub_surface)
125
+ result = []
126
+ sub_surface.shadingSurfaceGroups.each do |shading_surface_group|
127
+ site_transformation = shading_surface_group.siteTransformation
128
+ shading_surface_group.shadingSurfaces.each do |shading_surface|
129
+ result << Shade.from_shading_surface(shading_surface, site_transformation)
130
+ end
131
+ end
132
+ result
133
+ end
134
+
135
+ end # Aperture
136
+ end # Honeybee
@@ -0,0 +1,136 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/geometry/door'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class Door
38
+
39
+ def self.from_sub_surface(sub_surface, site_transformation)
40
+ hash = {}
41
+ hash[:type] = 'Door'
42
+ hash[:identifier] = clean_identifier(sub_surface.nameString)
43
+ hash[:display_name] = sub_surface.nameString
44
+ hash[:user_data] = {handle: sub_surface.handle.to_s}
45
+ hash[:properties] = properties_from_sub_surface(sub_surface)
46
+ hash[:geometry] = geometry_from_sub_surface(sub_surface, site_transformation)
47
+ hash[:boundary_condition] = boundary_condition_from_sub_surface(sub_surface)
48
+
49
+ sub_surface_type = sub_surface.subSurfaceType
50
+ hash[:is_glass] = (sub_surface_type == 'GlassDoor')
51
+
52
+ indoor_shades = indoor_shades_from_sub_surface(sub_surface)
53
+ hash[:indoor_shades] = indoor_shades if !indoor_shades.empty?
54
+
55
+ outdoor_shades = outdoor_shades_from_sub_surface(sub_surface)
56
+ hash[:outdoor_shades] = outdoor_shades if !outdoor_shades.empty?
57
+
58
+ hash
59
+ end
60
+
61
+ def self.properties_from_sub_surface(sub_surface)
62
+ hash = {}
63
+ hash[:type] = 'DoorPropertiesAbridged'
64
+ hash[:energy] = energy_properties_from_sub_surface(sub_surface)
65
+ hash
66
+ end
67
+
68
+ def self.energy_properties_from_sub_surface(sub_surface)
69
+ hash = {}
70
+ hash[:type] = 'DoorEnergyPropertiesAbridged'
71
+
72
+ construction = sub_surface.construction
73
+ if !construction.empty?
74
+ hash[:construction] = clean_identifier(construction.get.nameString)
75
+ end
76
+
77
+ hash
78
+ end
79
+
80
+ def self.geometry_from_sub_surface(sub_surface, site_transformation)
81
+ result = {}
82
+ result[:type] = 'Face3D'
83
+ result[:boundary] = []
84
+ vertices = site_transformation * sub_surface.vertices
85
+ vertices.each do |v|
86
+ result[:boundary] << [v.x, v.y, v.z]
87
+ end
88
+ result
89
+ end
90
+
91
+ def self.boundary_condition_from_sub_surface(sub_surface)
92
+ result = {}
93
+ surface = sub_surface.surface.get
94
+ surface_type = surface.surfaceType
95
+ adjacent_sub_surface = sub_surface.adjacentSubSurface
96
+ if !adjacent_sub_surface.empty?
97
+ adjacent_space = clean_identifier(adjacent_sub_surface.get.space.get.nameString)
98
+ adjacent_surface = clean_identifier(adjacent_sub_surface.get.surface.get.nameString)
99
+ adjacent_sub_surface = clean_identifier(adjacent_sub_surface.get.nameString)
100
+ result = {type: 'Surface', boundary_condition_objects: [adjacent_sub_surface, adjacent_surface, adjacent_space]}
101
+ elsif surface.isGroundSurface
102
+ result = {type: 'Ground'}
103
+ elsif surface_type == 'Adiabatic'
104
+ result = {type: 'Adiabatic'}
105
+ else
106
+ sun_exposure = (surface.sunExposure == 'SunExposed')
107
+ wind_exposure = (surface.windExposure == 'WindExposed')
108
+ view_factor = sub_surface.viewFactortoGround
109
+ if view_factor.empty?
110
+ view_factor = {type: 'Autocalculate'}
111
+ else
112
+ view_factor = view_factor.get
113
+ end
114
+ result = {type: 'Outdoors', sun_exposure: sun_exposure,
115
+ wind_exposure: wind_exposure, view_factor: view_factor}
116
+ end
117
+ result
118
+ end
119
+
120
+ def self.indoor_shades_from_sub_surface(sub_surface)
121
+ []
122
+ end
123
+
124
+ def self.outdoor_shades_from_sub_surface(sub_surface)
125
+ result = []
126
+ sub_surface.shadingSurfaceGroups.each do |shading_surface_group|
127
+ site_transformation = shading_surface_group.siteTransformation
128
+ shading_surface_group.shadingSurfaces.each do |shading_surface|
129
+ result << Shade.from_shading_surface(shading_surface, site_transformation)
130
+ end
131
+ end
132
+ result
133
+ end
134
+
135
+ end # Door
136
+ end # Honeybee