honeybee-openstudio 0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,174 @@
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/model_object'
33
+
34
+ module Honeybee
35
+ class Face < ModelObject
36
+
37
+ def self.from_surface(surface, site_transformation)
38
+ hash = {}
39
+ hash[:type] = 'Face'
40
+ hash[:identifier] = clean_identifier(surface.nameString)
41
+ hash[:display_name] = surface.nameString
42
+ hash[:user_data] = {handle: surface.handle.to_s}
43
+ hash[:properties] = properties_from_surface(surface)
44
+ hash[:geometry] = geometry_from_surface(surface, site_transformation)
45
+ hash[:face_type] = face_type_from_surface(surface)
46
+ hash[:boundary_condition] = boundary_condition_from_surface(surface)
47
+
48
+ apertures = apertures_from_surface(surface, site_transformation)
49
+ hash[:apertures] = apertures if !apertures.empty?
50
+
51
+ doors = doors_from_surface(surface, site_transformation)
52
+ hash[:doors] = doors if !doors.empty?
53
+
54
+ indoor_shades = indoor_shades_from_surface(surface)
55
+ hash[:indoor_shades] = indoor_shades if !indoor_shades.empty?
56
+
57
+ outdoor_shades = outdoor_shades_from_surface(surface)
58
+ hash[:outdoor_shades] = outdoor_shades if !outdoor_shades.empty?
59
+
60
+ hash
61
+ end
62
+
63
+ def self.properties_from_surface(surface)
64
+ hash = {}
65
+ hash[:type] = 'FacePropertiesAbridged'
66
+ hash[:energy] = energy_properties_from_surface(surface)
67
+ hash
68
+ end
69
+
70
+ def self.energy_properties_from_surface(surface)
71
+ hash = {}
72
+ hash[:type] = 'FaceEnergyPropertiesAbridged'
73
+
74
+ construction = surface.construction
75
+ if !construction.empty?
76
+ hash[:construction] = clean_identifier(construction.get.nameString)
77
+ end
78
+
79
+ hash
80
+ end
81
+
82
+ def self.geometry_from_surface(surface, site_transformation)
83
+ result = {}
84
+ result[:type] = 'Face3D'
85
+ result[:boundary] = []
86
+ vertices = site_transformation * surface.vertices
87
+ vertices.each do |v|
88
+ result[:boundary] << [v.x, v.y, v.z]
89
+ end
90
+ result
91
+ end
92
+
93
+ def self.face_type_from_surface(surface)
94
+ # "Wall", "Floor", "RoofCeiling", "AirBoundary"
95
+ result = nil
96
+ surface_type = surface.surfaceType
97
+ if surface.isAirWall
98
+ result = 'AirBoundary'
99
+ elsif /Wall/i.match(surface_type)
100
+ result = 'Wall'
101
+ elsif /Floor/i.match(surface_type)
102
+ result = 'Floor'
103
+ elsif /RoofCeiling/i.match(surface_type)
104
+ result = 'RoofCeiling'
105
+ end
106
+ result
107
+ end
108
+
109
+ def self.boundary_condition_from_surface(surface)
110
+ result = {}
111
+ surface_type = surface.surfaceType
112
+ adjacent_surface = surface.adjacentSurface
113
+ if !adjacent_surface.empty?
114
+ adjacent_space = clean_identifier(adjacent_surface.get.space.get.nameString)
115
+ adjacent_surface = clean_identifier(adjacent_surface.get.nameString)
116
+ result = {type: 'Surface', boundary_condition_objects: [adjacent_surface, adjacent_space]}
117
+ elsif surface.isGroundSurface
118
+ result = {type: 'Ground'}
119
+ elsif surface_type == 'Adiabatic'
120
+ result = {type: 'Adiabatic'}
121
+ else
122
+ sun_exposure = (surface.sunExposure == 'SunExposed')
123
+ wind_exposure = (surface.windExposure == 'WindExposed')
124
+ view_factor = surface.viewFactortoGround
125
+ if view_factor.empty?
126
+ view_factor = {type: 'Autocalculate'}
127
+ else
128
+ view_factor = view_factor.get
129
+ end
130
+ result = {type: 'Outdoors', sun_exposure: sun_exposure,
131
+ wind_exposure: wind_exposure, view_factor: view_factor}
132
+ end
133
+ result
134
+ end
135
+
136
+ def self.apertures_from_surface(surface, site_transformation)
137
+ result = []
138
+ surface.subSurfaces.each do |sub_surface|
139
+ sub_surface_type = sub_surface.subSurfaceType
140
+ if !/Door/i.match(sub_surface_type)
141
+ result << Aperture.from_sub_surface(sub_surface, site_transformation)
142
+ end
143
+ end
144
+ result
145
+ end
146
+
147
+ def self.doors_from_surface(surface, site_transformation)
148
+ result = []
149
+ surface.subSurfaces.each do |sub_surface|
150
+ sub_surface_type = sub_surface.subSurfaceType
151
+ if /Door/i.match(sub_surface_type)
152
+ result << Door.from_sub_surface(sub_surface, site_transformation)
153
+ end
154
+ end
155
+ result
156
+ end
157
+
158
+ def self.indoor_shades_from_surface(surface)
159
+ []
160
+ end
161
+
162
+ def self.outdoor_shades_from_surface(surface)
163
+ result = []
164
+ surface.shadingSurfaceGroups.each do |shading_surface_group|
165
+ site_transformation = shading_surface_group.siteTransformation
166
+ shading_surface_group.shadingSurfaces.each do |shading_surface|
167
+ result << Shade.from_shading_surface(shading_surface, site_transformation)
168
+ end
169
+ end
170
+ result
171
+ end
172
+
173
+ end #Face
174
+ end #Honeybee
@@ -0,0 +1,121 @@
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/model_object'
33
+
34
+ module Honeybee
35
+ class Room < ModelObject
36
+
37
+ def self.from_space(space)
38
+ hash = {}
39
+ hash[:type] = 'Room'
40
+ hash[:identifier] = clean_identifier(space.nameString)
41
+ hash[:display_name] = space.nameString
42
+ hash[:user_data] = {space: space.handle.to_s}
43
+ hash[:properties] = properties_from_space(space)
44
+
45
+ site_transformation = space.siteTransformation
46
+ hash[:faces] = faces_from_space(space, site_transformation)
47
+
48
+ indoor_shades = indoor_shades_from_space(space)
49
+ hash[:indoor_shades] = indoor_shades if !indoor_shades.empty?
50
+
51
+ outdoor_shades = outdoor_shades_from_space(space)
52
+ hash[:outdoor_shades] = outdoor_shades if !outdoor_shades.empty?
53
+
54
+ multipler = multiplier_from_space(space)
55
+ hash[:multipler] = multipler if multipler
56
+
57
+ story = story_from_space(space)
58
+ hash[:story] = story if story
59
+
60
+ hash
61
+ end
62
+
63
+ def self.properties_from_space(space)
64
+ hash = {}
65
+ hash[:type] = 'RoomPropertiesAbridged'
66
+ hash[:energy] = self.energy_properties_from_space(space)
67
+ hash
68
+ end
69
+
70
+ def self.energy_properties_from_space(space)
71
+ hash = {}
72
+ hash[:type] = 'RoomEnergyPropertiesAbridged'
73
+ hash
74
+ end
75
+
76
+ def self.faces_from_space(space, site_transformation)
77
+ result = []
78
+ space.surfaces.each do |surface|
79
+ result << Face.from_surface(surface, site_transformation)
80
+ end
81
+ result
82
+ end
83
+
84
+ def self.indoor_shades_from_space(space)
85
+ []
86
+ end
87
+
88
+ def self.outdoor_shades_from_space(space)
89
+ result = []
90
+ space.shadingSurfaceGroups.each do |shading_surface_group|
91
+ # skip if attached to a surface or sub_surface
92
+ if !shading_surface_group.shadedSurface.empty? || !shading_surface_group.shadedSubSurface.empty?
93
+ next
94
+ end
95
+
96
+ site_transformation = shading_surface_group.siteTransformation
97
+ shading_surface_group.shadingSurfaces.each do |shading_surface|
98
+ result << Shade.from_shading_surface(shading_surface, site_transformation)
99
+ end
100
+ end
101
+ result
102
+ end
103
+
104
+ def self.multiplier_from_space(space)
105
+ multiplier = space.multiplier
106
+ if multiplier != 1
107
+ return multiplier
108
+ end
109
+ nil
110
+ end
111
+
112
+ def self.story_from_space(space)
113
+ story = space.buildingStory
114
+ if !story.empty?
115
+ return clean_identifier(story.get.nameString)
116
+ end
117
+ nil
118
+ end
119
+
120
+ end # Aperture
121
+ end # Honeybee
@@ -0,0 +1,87 @@
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/shade'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class Shade
38
+
39
+ def self.from_shading_surface(shading_surface, site_transformation)
40
+ hash = {}
41
+ hash[:type] = 'Shade'
42
+ hash[:identifier] = clean_identifier(shading_surface.nameString)
43
+ hash[:display_name] = shading_surface.nameString
44
+ hash[:user_data] = {handle: shading_surface.handle.to_s}
45
+ hash[:properties] = properties_from_shading_surface(shading_surface)
46
+ hash[:geometry] = geometry_from_shading_surface(shading_surface, site_transformation)
47
+
48
+ hash
49
+ end
50
+
51
+ def self.properties_from_shading_surface(shading_surface)
52
+ hash = {}
53
+ hash[:type] = 'ShadePropertiesAbridged'
54
+ hash[:energy] = energy_properties_from_shading_surface(shading_surface)
55
+ hash
56
+ end
57
+
58
+ def self.energy_properties_from_shading_surface(shading_surface)
59
+ hash = {}
60
+ hash[:type] = 'ShadeEnergyPropertiesAbridged'
61
+
62
+ construction = shading_surface.construction
63
+ if !construction.empty?
64
+ hash[:construction] = clean_identifier(construction.get.nameString)
65
+ end
66
+
67
+ transmittance_schedule = shading_surface.transmittanceSchedule
68
+ if !transmittance_schedule.empty?
69
+ hash[:transmittance_schedule] = clean_identifier(transmittance_schedule.get.nameString)
70
+ end
71
+
72
+ hash
73
+ end
74
+
75
+ def self.geometry_from_shading_surface(shading_surface, site_transformation)
76
+ result = {}
77
+ result[:type] = 'Face3D'
78
+ result[:boundary] = []
79
+ vertices = site_transformation * shading_surface.vertices
80
+ vertices.each do |v|
81
+ result[:boundary] << [v.x, v.y, v.z]
82
+ end
83
+ result
84
+ end
85
+
86
+ end #Shade
87
+ end #Honeybee
@@ -0,0 +1,123 @@
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/model'
33
+
34
+ require 'from_openstudio/geometry/room'
35
+ require 'from_openstudio/geometry/shade'
36
+
37
+ require 'openstudio'
38
+
39
+ module Honeybee
40
+ class Model
41
+
42
+ # Create Ladybug Energy Model JSON from OpenStudio Model
43
+ def self.translate_from_openstudio(openstudio_model)
44
+ hash = {}
45
+ hash[:type] = 'Model'
46
+ hash[:identifier] = 'Model'
47
+ hash[:display_name] = 'Model'
48
+ hash[:units] = 'Meters'
49
+ hash[:tolerance] = 0.01
50
+ hash[:angle_tolerance] = 1.0
51
+
52
+ hash[:properties] = properties_from_model(openstudio_model)
53
+
54
+ rooms = rooms_from_model(openstudio_model)
55
+ hash[:rooms] = rooms if !rooms.empty?
56
+
57
+ orphaned_shades = orphaned_shades_from_model(openstudio_model)
58
+ hash[:orphaned_shades] = orphaned_shades if !orphaned_shades.empty?
59
+
60
+ Model.new(hash)
61
+ end
62
+
63
+ # Create Ladybug Energy Model JSON from OSM file
64
+ def self.translate_from_osm_file(file)
65
+ vt = OpenStudio::OSVersion::VersionTranslator.new
66
+ openstudio_model = vt.loadModel(file)
67
+ raise "Cannot load OSM file at '#{}'" if openstudio_model.empty?
68
+ self.translate_from_openstudio(openstudio_model.get)
69
+ end
70
+
71
+ # Create Ladybug Energy Model JSON from gbXML file
72
+ def self.translate_from_gbxml_file(file)
73
+ translator = OpenStudio::GbXML::GbXMLReverseTranslator.new
74
+ openstudio_model = translator.loadModel(file)
75
+ raise "Cannot load gbXML file at '#{}'" if openstudio_model.empty?
76
+ self.translate_from_openstudio(openstudio_model.get)
77
+ end
78
+
79
+ # Create Ladybug Energy Model JSON from IDF file
80
+ def self.translate_from_idf_file(file)
81
+ translator = OpenStudio::EnergyPlus::ReverseTranslator.new
82
+ openstudio_model = translator.loadModel(file)
83
+ raise "Cannot load IDF file at '#{}'" if openstudio_model.empty?
84
+ self.translate_from_openstudio(openstudio_model.get)
85
+ end
86
+
87
+ def self.properties_from_model(openstudio_model)
88
+ hash = {}
89
+ hash[:type] = 'ModelProperties'
90
+ hash
91
+ end
92
+
93
+ def self.energy_properties_from_model(openstudio_model)
94
+ hash = {}
95
+ hash[:type] = 'ModelEnergyProperties'
96
+ hash[:energy] = energy_properties_from_model(openstudio_model)
97
+ hash
98
+ end
99
+
100
+ def self.rooms_from_model(openstudio_model)
101
+ result = []
102
+ openstudio_model.getSpaces.each do |space|
103
+ result << Room.from_space(space)
104
+ end
105
+ result
106
+ end
107
+
108
+ def self.orphaned_shades_from_model(openstudio_model)
109
+ result = []
110
+ openstudio_model.getShadingSurfaceGroups.each do |shading_surface_group|
111
+ shading_surface_type = shading_surface_group.shadingSurfaceType
112
+ if shading_surface_type == 'Site' || shading_surface_type == 'Building'
113
+ site_transformation = shading_surface_group.siteTransformation
114
+ shading_surface_group.shadingSurfaces.each do |shading_surface|
115
+ result << Shade.from_shading_surface(shading_surface, site_transformation)
116
+ end
117
+ end
118
+ end
119
+ result
120
+ end
121
+
122
+ end # Model
123
+ end # Honeybee