honeybee-openstudio 2.6.9 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/pull_request.yaml +25 -0
  3. data/.gitignore +1 -0
  4. data/README.md +5 -5
  5. data/Rakefile +2 -7
  6. data/doc_templates/README.md.erb +42 -0
  7. data/doc_templates/copyright_erb.txt +2 -2
  8. data/doc_templates/copyright_ruby.txt +2 -2
  9. data/honeybee-openstudio.gemspec +11 -7
  10. data/lib/files/Honeybee.rb +7 -7
  11. data/lib/from_openstudio.rb +49 -0
  12. data/lib/from_openstudio/geometry/aperture.rb +136 -0
  13. data/lib/from_openstudio/geometry/door.rb +136 -0
  14. data/lib/from_openstudio/geometry/face.rb +174 -0
  15. data/lib/from_openstudio/geometry/room.rb +121 -0
  16. data/lib/from_openstudio/geometry/shade.rb +87 -0
  17. data/lib/from_openstudio/model.rb +123 -0
  18. data/lib/from_openstudio/model_object.rb +43 -0
  19. data/lib/from_openstudio/simulation/design_day.rb +123 -0
  20. data/lib/from_openstudio/simulation/parameter_model.rb +93 -0
  21. data/lib/from_openstudio/simulation/simulation_output.rb +67 -0
  22. data/lib/{from_honeybee.rb → honeybee.rb} +47 -40
  23. data/lib/{from_honeybee → honeybee}/_defaults/energy_default.json +0 -0
  24. data/lib/{from_honeybee → honeybee}/_defaults/model.json +0 -0
  25. data/lib/{from_honeybee → honeybee}/_defaults/simulation-parameter.json +1 -0
  26. data/lib/honeybee/construction/air.rb +42 -0
  27. data/lib/honeybee/construction/opaque.rb +42 -0
  28. data/lib/honeybee/construction/shade.rb +42 -0
  29. data/lib/honeybee/construction/window.rb +51 -0
  30. data/lib/honeybee/construction/windowshade.rb +43 -0
  31. data/lib/honeybee/construction_set.rb +42 -0
  32. data/lib/{from_honeybee → honeybee}/extension.rb +5 -5
  33. data/lib/honeybee/geometry/aperture.rb +42 -0
  34. data/lib/honeybee/geometry/door.rb +42 -0
  35. data/lib/honeybee/geometry/face.rb +48 -0
  36. data/lib/honeybee/geometry/room.rb +56 -0
  37. data/lib/honeybee/geometry/shade.rb +42 -0
  38. data/lib/honeybee/hvac/ideal_air.rb +42 -0
  39. data/lib/honeybee/hvac/template.rb +73 -0
  40. data/lib/honeybee/load/electric_equipment.rb +42 -0
  41. data/lib/honeybee/load/gas_equipment.rb +42 -0
  42. data/lib/honeybee/load/infiltration.rb +42 -0
  43. data/lib/{from_honeybee/simulation/extension.rb → honeybee/load/lighting.rb} +10 -13
  44. data/lib/honeybee/load/people.rb +42 -0
  45. data/lib/honeybee/load/setpoint_humidistat.rb +46 -0
  46. data/lib/honeybee/load/setpoint_thermostat.rb +46 -0
  47. data/lib/honeybee/load/ventilation.rb +42 -0
  48. data/lib/honeybee/material/opaque.rb +42 -0
  49. data/lib/honeybee/material/opaque_no_mass.rb +42 -0
  50. data/lib/honeybee/material/window_blind.rb +42 -0
  51. data/lib/honeybee/material/window_gas.rb +42 -0
  52. data/lib/honeybee/material/window_gas_custom.rb +42 -0
  53. data/lib/honeybee/material/window_gas_mixture.rb +42 -0
  54. data/lib/honeybee/material/window_glazing.rb +42 -0
  55. data/lib/honeybee/material/window_shade.rb +42 -0
  56. data/lib/honeybee/material/window_simpleglazsys.rb +42 -0
  57. data/lib/honeybee/model.rb +87 -0
  58. data/lib/{from_honeybee → honeybee}/model_object.rb +16 -18
  59. data/lib/honeybee/program_type.rb +56 -0
  60. data/lib/honeybee/schedule/fixed_interval.rb +42 -0
  61. data/lib/honeybee/schedule/ruleset.rb +42 -0
  62. data/lib/honeybee/schedule/type_limit.rb +42 -0
  63. data/lib/honeybee/simulation/design_day.rb +42 -0
  64. data/lib/honeybee/simulation/parameter_model.rb +86 -0
  65. data/lib/honeybee/simulation/simulation_output.rb +42 -0
  66. data/lib/honeybee/ventcool/control.rb +42 -0
  67. data/lib/honeybee/ventcool/opening.rb +46 -0
  68. data/lib/honeybee/ventcool/simulation.rb +42 -0
  69. data/lib/measures/from_honeybee_model/LICENSE.md +18 -22
  70. data/lib/measures/from_honeybee_model/measure.rb +4 -4
  71. data/lib/measures/from_honeybee_model/measure.xml +14 -37
  72. data/lib/measures/from_honeybee_model/tests/from_honeybee_model_test.rb +2 -2
  73. data/lib/measures/from_honeybee_simulation_parameter/LICENSE.md +18 -22
  74. data/lib/measures/from_honeybee_simulation_parameter/measure.rb +4 -4
  75. data/lib/measures/from_honeybee_simulation_parameter/measure.xml +15 -20
  76. data/lib/measures/from_honeybee_simulation_parameter/tests/from_honeybee_simulation_parameter_test.rb +3 -3
  77. data/lib/to_openstudio.rb +92 -0
  78. data/lib/{from_honeybee → to_openstudio}/construction/air.rb +7 -16
  79. data/lib/{from_honeybee → to_openstudio}/construction/opaque.rb +9 -19
  80. data/lib/{from_honeybee → to_openstudio}/construction/shade.rb +17 -26
  81. data/lib/{from_honeybee → to_openstudio}/construction/window.rb +12 -21
  82. data/lib/{from_honeybee → to_openstudio}/construction/windowshade.rb +8 -23
  83. data/lib/{from_honeybee → to_openstudio}/construction_set.rb +11 -23
  84. data/lib/{from_honeybee → to_openstudio}/geometry/aperture.rb +22 -32
  85. data/lib/{from_honeybee → to_openstudio}/geometry/door.rb +21 -31
  86. data/lib/{from_honeybee → to_openstudio}/geometry/face.rb +11 -28
  87. data/lib/{from_honeybee → to_openstudio}/geometry/room.rb +15 -38
  88. data/lib/{from_honeybee → to_openstudio}/geometry/shade.rb +8 -18
  89. data/lib/{from_honeybee → to_openstudio}/hvac/Model.hvac.rb +2 -2
  90. data/lib/{from_honeybee → to_openstudio}/hvac/ideal_air.rb +10 -19
  91. data/lib/{from_honeybee → to_openstudio}/hvac/template.rb +9 -43
  92. data/lib/{from_honeybee → to_openstudio}/load/electric_equipment.rb +12 -21
  93. data/lib/{from_honeybee → to_openstudio}/load/gas_equipment.rb +13 -22
  94. data/lib/{from_honeybee → to_openstudio}/load/infiltration.rb +14 -23
  95. data/lib/{from_honeybee → to_openstudio}/load/lighting.rb +10 -19
  96. data/lib/{from_honeybee → to_openstudio}/load/people.rb +9 -18
  97. data/lib/{from_honeybee → to_openstudio}/load/setpoint_humidistat.rb +8 -17
  98. data/lib/{from_honeybee → to_openstudio}/load/setpoint_thermostat.rb +8 -17
  99. data/lib/{from_honeybee → to_openstudio}/load/ventilation.rb +11 -20
  100. data/lib/{from_honeybee → to_openstudio}/material/opaque.rb +7 -16
  101. data/lib/{from_honeybee → to_openstudio}/material/opaque_no_mass.rb +8 -17
  102. data/lib/{from_honeybee → to_openstudio}/material/window_blind.rb +27 -36
  103. data/lib/{from_honeybee → to_openstudio}/material/window_gas.rb +8 -17
  104. data/lib/{from_honeybee → to_openstudio}/material/window_gas_custom.rb +10 -20
  105. data/lib/{from_honeybee → to_openstudio}/material/window_gas_mixture.rb +9 -18
  106. data/lib/{from_honeybee → to_openstudio}/material/window_glazing.rb +21 -30
  107. data/lib/{from_honeybee → to_openstudio}/material/window_shade.rb +17 -26
  108. data/lib/{from_honeybee → to_openstudio}/material/window_simpleglazsys.rb +7 -16
  109. data/lib/{from_honeybee → to_openstudio}/model.rb +13 -103
  110. data/lib/to_openstudio/model_object.rb +52 -0
  111. data/lib/{from_honeybee → to_openstudio}/program_type.rb +14 -34
  112. data/lib/{from_honeybee → to_openstudio}/schedule/fixed_interval.rb +11 -21
  113. data/lib/{from_honeybee → to_openstudio}/schedule/ruleset.rb +43 -44
  114. data/lib/{from_honeybee → to_openstudio}/schedule/type_limit.rb +9 -21
  115. data/lib/{from_honeybee/simulation/designday.rb → to_openstudio/simulation/design_day.rb} +7 -16
  116. data/lib/{from_honeybee/simulation/parameter.rb → to_openstudio/simulation/parameter_model.rb} +8 -57
  117. data/lib/{from_honeybee → to_openstudio}/ventcool/control.rb +8 -17
  118. data/lib/{from_honeybee → to_openstudio}/ventcool/opening.rb +8 -22
  119. data/lib/{from_honeybee → to_openstudio}/ventcool/simulation.rb +7 -16
  120. metadata +105 -134
@@ -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