urbanopt-geojson 0.2.0.pre3 → 0.4.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 (56) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +1 -1
  3. data/CHANGELOG.md +77 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/Gemfile +0 -3
  6. data/LICENSE.md +1 -1
  7. data/RDOC_MAIN.md +1 -1
  8. data/README.md +1 -1
  9. data/Rakefile +2 -2
  10. data/doc_templates/LICENSE.md +1 -1
  11. data/doc_templates/copyright_erb.txt +1 -1
  12. data/doc_templates/copyright_js.txt +1 -1
  13. data/doc_templates/copyright_ruby.txt +1 -1
  14. data/docs/README.md +1 -1
  15. data/docs/package-lock.json +5206 -6883
  16. data/docs/package.json +12 -9
  17. data/lib/measures/.rubocop.yml +1 -1
  18. data/lib/measures/urban_geometry_creation/LICENSE.md +1 -1
  19. data/lib/measures/urban_geometry_creation/README.md +2 -2
  20. data/lib/measures/urban_geometry_creation/measure.rb +21 -2
  21. data/lib/measures/urban_geometry_creation/measure.xml +17 -20
  22. data/lib/measures/urban_geometry_creation_zoning/LICENSE.md +1 -1
  23. data/lib/measures/urban_geometry_creation_zoning/README.md +1 -1
  24. data/lib/measures/urban_geometry_creation_zoning/measure.rb +5 -4
  25. data/lib/measures/urban_geometry_creation_zoning/measure.xml +15 -18
  26. data/lib/urbanopt-geojson.rb +1 -1
  27. data/lib/urbanopt/geojson.rb +2 -1
  28. data/lib/urbanopt/geojson/building.rb +74 -26
  29. data/lib/urbanopt/geojson/derived_extension.rb +1 -1
  30. data/lib/urbanopt/geojson/district_system.rb +1 -1
  31. data/lib/urbanopt/geojson/feature.rb +116 -2
  32. data/lib/urbanopt/geojson/geo_file.rb +28 -29
  33. data/lib/urbanopt/geojson/helper.rb +42 -7
  34. data/lib/urbanopt/geojson/logging.rb +1 -1
  35. data/lib/urbanopt/geojson/mapper_classes.rb +47 -47
  36. data/lib/urbanopt/geojson/model.rb +3 -4
  37. data/lib/urbanopt/geojson/region.rb +1 -1
  38. data/lib/urbanopt/geojson/scale_area.rb +91 -0
  39. data/lib/urbanopt/geojson/schema/building_properties.json +252 -80
  40. data/lib/urbanopt/geojson/schema/electrical_connector_properties.json +9 -9
  41. data/lib/urbanopt/geojson/schema/electrical_junction_properties.json +4 -5
  42. data/lib/urbanopt/geojson/schema/thermal_connector_properties.json +1 -1
  43. data/lib/urbanopt/geojson/schema/thermal_junction_properties.json +1 -1
  44. data/lib/urbanopt/geojson/update_areas.rb +2 -2
  45. data/lib/urbanopt/geojson/validate_geojson.rb +3 -1
  46. data/lib/urbanopt/geojson/version.rb +2 -2
  47. data/lib/urbanopt/geojson/workflows/building.osw.out +4 -4
  48. data/lib/urbanopt/geojson/zoning.rb +21 -16
  49. data/urbanopt-geojson-gem.gemspec +10 -17
  50. metadata +29 -48
  51. data/lib/change_log.rb +0 -147
  52. data/lib/measures/urban_geometry_creation/tests/nrel_stm_footprints.geojson +0 -3238
  53. data/lib/measures/urban_geometry_creation/tests/shadowed_tests.rb +0 -80
  54. data/lib/measures/urban_geometry_creation/tests/urban_geometry_creation_test.rb +0 -139
  55. data/lib/measures/urban_geometry_creation_zoning/tests/nrel_stm_footprints.geojson +0 -3238
  56. data/lib/measures/urban_geometry_creation_zoning/tests/urban_geometry_creation_zoning_test.rb +0 -139
@@ -10,20 +10,23 @@
10
10
  },
11
11
  "author": "Brian Schiller",
12
12
  "dependencies": {
13
- "highlight.js": "^9.15.6",
14
- "json-schema-ref-parser": "^6.1.0",
13
+ "highlight.js": "^10.2.0",
14
+ "json-schema-ref-parser": "^9.0.6",
15
15
  "json-schema-view-js": "git+https://git@github.com/bgschiller/json-schema-view-js.git",
16
- "vuepress": "^0.14.10",
16
+ "vuepress": "^1.5.4",
17
17
  "webpack-dev-middleware": "^3.6.0"
18
18
  },
19
19
  "devDependencies": {
20
- "braces": ">=2.3.1",
21
- "gh-pages": "^2.0.1",
20
+ "braces": "^3.0.2",
21
+ "dot-prop": ">=5.1.1",
22
+ "gh-pages": "^3.1.0",
22
23
  "js-yaml": ">=3.13.1",
23
- "lodash": ">=4.17.12",
24
+ "lodash": ">=4.17.19",
24
25
  "lodash.template": ">=4.5.0",
25
- "mixin-deep": ">=1.3.2",
26
- "serialize-javascript": ">=2.1.1",
27
- "set-value": ">=2.0.1"
26
+ "minimist": ">=1.2.3",
27
+ "mixin-deep": "^2.0.1",
28
+ "serialize-javascript": "^5.0.1",
29
+ "set-value": "^3.0.2",
30
+ "yargs-parser": ">=18.1.1"
28
31
  }
29
32
  }
@@ -2,4 +2,4 @@ AllCops:
2
2
  Exclude:
3
3
  - 'spec/test_measures/**/*'
4
4
  inherit_from:
5
- - http://s3.amazonaws.com/openstudio-resources/styles/rubocop.yml
5
+ - http://s3.amazonaws.com/openstudio-resources/styles/rubocop_v3.yml
@@ -1,4 +1,4 @@
1
- URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt™, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -5,10 +5,10 @@
5
5
  # UrbanGeometryCreation
6
6
 
7
7
  ## Description
8
- This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.
8
+ This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.
9
9
 
10
10
  ## Modeler Description
11
-
11
+ This measure takes in the GeoJSON file, the feature_id of the building and the surrounding buildings as arguments and add has methods to create space types and add default construction sets.
12
12
 
13
13
  ## Measure Type
14
14
  ModelMeasure
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
4
+ # URBANopt™, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
5
  # contributors. All rights reserved.
4
6
  #
5
7
  # Redistribution and use in source and binary forms, with or without modification,
@@ -73,6 +75,12 @@ class UrbanGeometryCreation < OpenStudio::Measure::ModelMeasure
73
75
  surrounding_buildings.setDescription('Select which surrounding buildings to include.')
74
76
  surrounding_buildings.setDefaultValue('ShadingOnly')
75
77
  args << surrounding_buildings
78
+ # not a required argument
79
+ scale_footprint_area_by_floor_area = OpenStudio::Ruleset::OSArgument.makeBoolArgument('scale_footprint_area_by_floor_area', false)
80
+ scale_footprint_area_by_floor_area.setDisplayName('Scale Footprint Area by the Floor Area?')
81
+ scale_footprint_area_by_floor_area.setDescription('If true, the footprint area from GeoJSON will be scaled by the floor_area provided by the user in URBANopt.')
82
+ scale_footprint_area_by_floor_area.setDefaultValue(false)
83
+ args << scale_footprint_area_by_floor_area
76
84
  return args
77
85
  end
78
86
 
@@ -88,6 +96,7 @@ class UrbanGeometryCreation < OpenStudio::Measure::ModelMeasure
88
96
  geojson_file = runner.getStringArgumentValue('geojson_file', user_arguments)
89
97
  feature_id = runner.getStringArgumentValue('feature_id', user_arguments)
90
98
  surrounding_buildings = runner.getStringArgumentValue('surrounding_buildings', user_arguments)
99
+ scale_footprint_area_by_floor_area = runner.getBoolArgumentValue('scale_footprint_area_by_floor_area', user_arguments)
91
100
 
92
101
  default_construction_set = URBANopt::GeoJSON::Model.create_construction_set(model, runner)
93
102
 
@@ -131,7 +140,17 @@ class UrbanGeometryCreation < OpenStudio::Measure::ModelMeasure
131
140
 
132
141
  if feature.type == 'Building'
133
142
  # make requested building
134
- spaces = feature.create_building(:space_per_floor, model, @origin_lat_lon, @runner)
143
+ # pass in scaled_footprint_area (calculated from floor_area / number_of_stories)
144
+ scaled_footprint_area = 0
145
+ if scale_footprint_area_by_floor_area
146
+ building_hash = feature.to_hash
147
+ if building_hash[:number_of_stories] && building_hash[:floor_area]
148
+ scaled_footprint_area = building_hash[:floor_area].to_f / building_hash[:number_of_stories].to_f
149
+ @runner.registerInfo("Desired footprint area in ft2: #{scaled_footprint_area}")
150
+ end
151
+ end
152
+
153
+ spaces = feature.create_building(:space_per_floor, model, @origin_lat_lon, @runner, false, scaled_footprint_area)
135
154
  if spaces.nil?
136
155
  @runner.registerError("Failed to create spaces for building '#{name}'")
137
156
  return false
@@ -1,14 +1,15 @@
1
+ <?xml version="1.0"?>
1
2
  <measure>
2
3
  <schema_version>3.0</schema_version>
3
4
  <name>urban_geometry_creation</name>
4
5
  <uid>5ab85d6b-c9af-4361-8ab9-613ee99a5666</uid>
5
- <version_id>0808dbbe-ec8a-46c7-b416-cbae39e2b06c</version_id>
6
- <version_modified>20190523T021410Z</version_modified>
6
+ <version_id>e32672b2-91b1-4b62-9770-7712cab86004</version_id>
7
+ <version_modified>20200807T210717Z</version_modified>
7
8
  <xml_checksum>D254E772</xml_checksum>
8
9
  <class_name>UrbanGeometryCreation</class_name>
9
10
  <display_name>UrbanGeometryCreation</display_name>
10
11
  <description>This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.</description>
11
- <modeler_description></modeler_description>
12
+ <modeler_description>This measure takes in the GeoJSON file, the feature_id of the building and the surrounding buildings as arguments and add has methods to create space types and add default construction sets.</modeler_description>
12
13
  <arguments>
13
14
  <argument>
14
15
  <name>geojson_file</name>
@@ -43,15 +44,11 @@
43
44
  <value>ShadingOnly</value>
44
45
  <display_name>ShadingOnly</display_name>
45
46
  </choice>
46
- <choice>
47
- <value>All</value>
48
- <display_name>All</display_name>
49
- </choice>
50
47
  </choices>
51
48
  </argument>
52
49
  </arguments>
53
- <outputs/>
54
- <provenances/>
50
+ <outputs />
51
+ <provenances />
55
52
  <tags>
56
53
  <tag>Envelope.Form</tag>
57
54
  </tags>
@@ -94,35 +91,35 @@
94
91
  <usage_type>readmeerb</usage_type>
95
92
  <checksum>703C9964</checksum>
96
93
  </file>
97
- <file>
98
- <filename>README.md</filename>
99
- <filetype>md</filetype>
100
- <usage_type>readme</usage_type>
101
- <checksum>D339FA87</checksum>
102
- </file>
103
94
  <file>
104
95
  <filename>LICENSE.md</filename>
105
96
  <filetype>md</filetype>
106
97
  <usage_type>license</usage_type>
107
- <checksum>B646B327</checksum>
98
+ <checksum>EA283B74</checksum>
108
99
  </file>
109
100
  <file>
110
101
  <filename>nrel_stm_footprints.geojson</filename>
111
102
  <filetype>geojson</filetype>
112
103
  <usage_type>test</usage_type>
113
- <checksum>21E06908</checksum>
104
+ <checksum>40290298</checksum>
105
+ </file>
106
+ <file>
107
+ <filename>README.md</filename>
108
+ <filetype>md</filetype>
109
+ <usage_type>readme</usage_type>
110
+ <checksum>A09F345D</checksum>
114
111
  </file>
115
112
  <file>
116
113
  <filename>shadowed_tests.rb</filename>
117
114
  <filetype>rb</filetype>
118
115
  <usage_type>test</usage_type>
119
- <checksum>53A7DD48</checksum>
116
+ <checksum>4E51A05C</checksum>
120
117
  </file>
121
118
  <file>
122
119
  <filename>urban_geometry_creation_test.rb</filename>
123
120
  <filetype>rb</filetype>
124
121
  <usage_type>test</usage_type>
125
- <checksum>B55E2F27</checksum>
122
+ <checksum>DDAD6BFA</checksum>
126
123
  </file>
127
124
  <file>
128
125
  <version>
@@ -133,7 +130,7 @@
133
130
  <filename>measure.rb</filename>
134
131
  <filetype>rb</filetype>
135
132
  <usage_type>script</usage_type>
136
- <checksum>E152B533</checksum>
133
+ <checksum>2F8C09F7</checksum>
137
134
  </file>
138
135
  </files>
139
136
  </measure>
@@ -1,4 +1,4 @@
1
- URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt™, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -5,7 +5,7 @@
5
5
  # UrbanGeometryCreationZoning
6
6
 
7
7
  ## Description
8
- This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.
8
+ This measure reads an URBANopt GeoJSON and creates geometry with zoning for a particular building. Surrounding buildings are included as shading structures.
9
9
 
10
10
  ## Modeler Description
11
11
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
4
+ # URBANopt™, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
5
  # contributors. All rights reserved.
4
6
  #
5
7
  # Redistribution and use in source and binary forms, with or without modification,
@@ -111,8 +113,8 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
111
113
  @runner = runner
112
114
  @origin_lat_lon = nil
113
115
 
114
- all_features = URBANopt::GeoJSON::GeoFile.from_file(geojson_file)
115
- feature = URBANopt::GeoJSON::GeoFile.from_file(geojson_file).get_feature_by_id(feature_id)
116
+ all_features = URBANopt::GeoJSON::GeoFile.from_file(geojson_file)
117
+ feature = URBANopt::GeoJSON::GeoFile.from_file(geojson_file).get_feature_by_id(feature_id)
116
118
 
117
119
  # EXPOSE NAME
118
120
  name = feature.feature_json[:properties][:name]
@@ -153,7 +155,6 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
153
155
  convert_to_shades = feature.create_other_buildings(surrounding_buildings, all_features.json, model, @origin_lat_lon, @runner)
154
156
  end
155
157
 
156
-
157
158
  # intersect surfaces in this building with others
158
159
  @runner.registerInfo('Intersecting surfaces')
159
160
  spaces.each do |space|
@@ -1,13 +1,14 @@
1
+ <?xml version="1.0"?>
1
2
  <measure>
2
3
  <schema_version>3.0</schema_version>
3
4
  <name>urban_geometry_creation_zoning</name>
4
5
  <uid>96ea1317-76ac-4670-b51d-71ee3f4fdd65</uid>
5
- <version_id>63e08249-fcf1-4037-9cb4-b1188702b056</version_id>
6
- <version_modified>20190523T021410Z</version_modified>
6
+ <version_id>884d6eb0-6517-40dc-96ca-ac4db7c2ad7d</version_id>
7
+ <version_modified>20200807T210718Z</version_modified>
7
8
  <xml_checksum>D254E772</xml_checksum>
8
9
  <class_name>UrbanGeometryCreationZoning</class_name>
9
10
  <display_name>UrbanGeometryCreationZoning</display_name>
10
- <description>This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.</description>
11
+ <description>This measure reads an URBANopt GeoJSON and creates geometry with zoning for a particular building. Surrounding buildings are included as shading structures.</description>
11
12
  <modeler_description></modeler_description>
12
13
  <arguments>
13
14
  <argument>
@@ -43,15 +44,11 @@
43
44
  <value>ShadingOnly</value>
44
45
  <display_name>ShadingOnly</display_name>
45
46
  </choice>
46
- <choice>
47
- <value>All</value>
48
- <display_name>All</display_name>
49
- </choice>
50
47
  </choices>
51
48
  </argument>
52
49
  </arguments>
53
- <outputs/>
54
- <provenances/>
50
+ <outputs />
51
+ <provenances />
55
52
  <tags>
56
53
  <tag>Envelope.Form</tag>
57
54
  </tags>
@@ -104,19 +101,13 @@
104
101
  <filename>LICENSE.md</filename>
105
102
  <filetype>md</filetype>
106
103
  <usage_type>license</usage_type>
107
- <checksum>B646B327</checksum>
104
+ <checksum>EA283B74</checksum>
108
105
  </file>
109
106
  <file>
110
107
  <filename>README.md</filename>
111
108
  <filetype>md</filetype>
112
109
  <usage_type>readme</usage_type>
113
- <checksum>15702F0A</checksum>
114
- </file>
115
- <file>
116
- <filename>urban_geometry_creation_test.rb</filename>
117
- <filetype>rb</filetype>
118
- <usage_type>test</usage_type>
119
- <checksum>111178B3</checksum>
110
+ <checksum>0458EE16</checksum>
120
111
  </file>
121
112
  <file>
122
113
  <version>
@@ -127,7 +118,13 @@
127
118
  <filename>measure.rb</filename>
128
119
  <filetype>rb</filetype>
129
120
  <usage_type>script</usage_type>
130
- <checksum>F9C7D6B2</checksum>
121
+ <checksum>2505C43D</checksum>
122
+ </file>
123
+ <file>
124
+ <filename>urban_geometry_creation_zoning_test.rb</filename>
125
+ <filetype>rb</filetype>
126
+ <usage_type>test</usage_type>
127
+ <checksum>986CB63E</checksum>
131
128
  </file>
132
129
  </files>
133
130
  </measure>
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -39,3 +39,4 @@ require 'urbanopt/geojson/zoning'
39
39
  require 'urbanopt/geojson/model'
40
40
  require 'urbanopt/geojson/derived_extension'
41
41
  require 'urbanopt/geojson/logging'
42
+ require 'urbanopt/geojson/scale_area'
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -33,7 +33,6 @@ require 'urbanopt/geojson/feature'
33
33
  module URBANopt
34
34
  module GeoJSON
35
35
  class Building < URBANopt::GeoJSON::Feature
36
-
37
36
  ##
38
37
  # Used to initialize the feature. This method is inherited from the Feature class.
39
38
  def initialize(feature = {})
@@ -88,9 +87,11 @@ module URBANopt
88
87
  # * +origin_lat_lon+ - _Type:Float_ - An instance of +OpenStudio::PointLatLon+ indicating the latitude and longitude of the origin.
89
88
  # * +runner+ - _Type:String_ - An instance of +OpenStudio::Measure::OSRunner+ for the measure run.
90
89
  # * +zoning+ - _Type:Boolean_ - Value is +true+ if utilizing detailed zoning, else
91
- # +false+. Zoning is set to False by default.
90
+ # +false+ Zoning is set to False by default.
91
+ # * +scaled_footprint_area+ - Used to scale the footprint area using the floor area. 0 by
92
+ # default (no scaling).
92
93
  # * +other_building+ - _Type:URBANopt::GeoJSON::Feature - Optional, allow the user to pass in a different building to process. This is used for creating the other buildings for shading.
93
- def create_building(create_method, model, origin_lat_lon, runner, zoning = false, other_building = @feature_json)
94
+ def create_building(create_method, model, origin_lat_lon, runner, zoning = false, scaled_footprint_area = 0, other_building = @feature_json)
94
95
  number_of_stories = other_building[:properties][:number_of_stories]
95
96
  number_of_stories_above_ground = other_building[:properties][:number_of_stories_above_ground]
96
97
  number_of_stories_below_ground = other_building[:properties][:number_of_stories_below_ground]
@@ -129,7 +130,7 @@ module URBANopt
129
130
  spaces = []
130
131
  if create_method == :space_per_floor || create_method == :spaces_per_floor
131
132
  (-number_of_stories_below_ground + 1..number_of_stories_above_ground).each do |story_number|
132
- new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning)
133
+ new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning, scaled_footprint_area)
133
134
  spaces.concat(new_spaces)
134
135
  end
135
136
  elsif create_method == :space_per_building
@@ -248,6 +249,41 @@ module URBANopt
248
249
  end
249
250
  end
250
251
 
252
+ def calculate_perimeter(feature)
253
+ model = OpenStudio::Model::Model.new
254
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
255
+ origin_lat_lon = nil
256
+ origin_lat_lon = feature.create_origin_lat_lon(runner)
257
+ spaces = feature.create_building(:space_per_building, model, origin_lat_lon, runner)
258
+ surfaces = spaces[0].surfaces
259
+ ground_surface = nil
260
+ surfaces.each do |surface|
261
+ boundary_condition = surface.outsideBoundaryCondition
262
+ if boundary_condition == 'Ground'
263
+ ground_surface = surface
264
+ end
265
+ end
266
+ vertices = ground_surface.vertices
267
+ n = vertices.size
268
+ perimeter = 0
269
+ for i in (0..n - 1) do i
270
+ vertex_1 = nil
271
+ vertex_2 = nil
272
+ if i == n - 1
273
+ vertex_1 = vertices[n - 1]
274
+ vertex_2 = vertices[0]
275
+ else
276
+ vertex_1 = vertices[i]
277
+ vertex_2 = vertices[i + 1]
278
+ end
279
+ length = OpenStudio::Vector3d.new(vertex_2 - vertex_1).length
280
+ perimeter += length
281
+ end
282
+ perimeter = OpenStudio.convert(perimeter, 'm', 'ft').get
283
+ perimeter = perimeter.round(4)
284
+ return perimeter
285
+ end
286
+
251
287
  ##
252
288
  # Convert to a Hash equivalent for JSON serialization
253
289
  ##
@@ -277,14 +313,13 @@ module URBANopt
277
313
  result[:mixed_type_3_percentage] = @mixed_type_3_percentage if @mixed_type_3_percentage
278
314
  result[:mixed_type_4] = @mixed_type_4 if @mixed_type_4
279
315
  result[:mixed_type_4_percentage] = @mixed_type_4_percentage if @mixed_type_4_percentage
280
- return result
316
+ return result
281
317
  end
282
318
 
283
-
284
319
  private
285
320
 
286
321
  ##
287
- # Returns an array of instances of +OpenStudio::Model::Space+ per building
322
+ # Returns an array of instances of +OpenStudio::Model::Space+ per building.
288
323
  #
289
324
  # [Parameters]
290
325
  # * +min_elevation+ - _Type:Integer_ - Indicates minimum elevation across all buildings.
@@ -294,7 +329,9 @@ module URBANopt
294
329
  # * +runner+ - _Type:String_ - An instance of +Openstudio::Measure::OSRunner+ for the measure run.
295
330
  # * +zoning+ - _Type:Boolean_ - Value is +true+ if utilizing detailed zoning, else
296
331
  # +false+. Zoning is set to False by default.
332
+ # rubocop:disable Style/OptionalArguments, Style/CommentedKeyword
297
333
  def create_space_per_building(min_elevation, max_elevation, model, origin_lat_lon, runner, zoning = false, other_building) #:doc:
334
+ # rubocop: enable Style/OptionalArguments, Style/CommentedKeyword
298
335
  if other_building
299
336
  geometry = other_building[:geometry]
300
337
  properties = other_building[:properties]
@@ -338,7 +375,7 @@ module URBANopt
338
375
  result << space
339
376
  end
340
377
  return result
341
- end
378
+ end
342
379
 
343
380
  ##
344
381
  # Returns an array of instances of +OpenStudio::Model::Space+ per floor.
@@ -352,10 +389,20 @@ module URBANopt
352
389
  # origin's latitude and longitude.
353
390
  # * +runner+ - _Type:String_ - An instance of +Openstudio::Measure::OSRunner+ for the measure run.
354
391
  # * +zoning+ - _Type:Boolean_ - Value is +true+ if utilizing detailed zoning, else
355
- # +false+. Zoning is set to False by default.
356
- def create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning = false) #:doc:
357
- geometry = @feature_json[:geometry]
358
- properties = @feature_json[:properties]
392
+ # +false+. Zoning is set to False by default.
393
+ # rubocop:disable Style/CommentedKeyword
394
+ def create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning = false, scaled_footprint_area) #:doc:
395
+ # rubocop:enable Style/CommentedKeyword
396
+ begin
397
+ if other_building
398
+ geometry = other_building[:geometry]
399
+ properties = other_building[:properties]
400
+ else
401
+ geometry = @feature_json[:geometry]
402
+ properties = @feature_json[:properties]
403
+ end
404
+ rescue StandardError
405
+ end
359
406
  floor_prints = []
360
407
  multi_polygons = get_multi_polygons
361
408
  multi_polygons.each do |multi_polygon|
@@ -364,10 +411,10 @@ module URBANopt
364
411
  end
365
412
  multi_polygon.each do |polygon|
366
413
  elevation = (story_number - 1) * floor_to_floor_height
367
- floor_print = URBANopt::GeoJSON::Helper.floor_print_from_polygon(polygon, elevation, origin_lat_lon, runner, zoning)
414
+ floor_print = URBANopt::GeoJSON::Helper.floor_print_from_polygon(polygon, elevation, origin_lat_lon, runner, zoning, scaled_footprint_area)
368
415
  if floor_print
369
416
  if zoning
370
- this_floor_prints = URBANopt::GeoJSON::Zoning.divide_floor_print(floor_print, 4.0, runner)
417
+ this_floor_prints = URBANopt::GeoJSON::Zoning.divide_floor_print(floor_print, 4.0, runner)
371
418
  floor_prints.concat(this_floor_prints)
372
419
  else
373
420
  floor_prints << floor_print
@@ -377,8 +424,8 @@ module URBANopt
377
424
  end
378
425
  # Subsequent polygons are holes, and are not supported.
379
426
  break
380
- end
381
- end
427
+ end
428
+ end
382
429
  spaces = []
383
430
  floor_prints.each do |floor_print|
384
431
  space = OpenStudio::Model::Space.fromFloorPrint(floor_print, floor_to_floor_height, model)
@@ -394,22 +441,23 @@ module URBANopt
394
441
  surface.setOutsideBoundaryCondition('Ground')
395
442
  end
396
443
  end
397
- end
444
+ end
398
445
  spaces << space
399
- end
400
-
446
+ end
447
+
401
448
  building_story = OpenStudio::Model::BuildingStory.new(model)
402
449
  building_story.setName("Building Story #{story_number}")
450
+ building_story.setNominalZCoordinate(story_number * floor_to_floor_height)
451
+ building_story.setNominalFloortoFloorHeight(floor_to_floor_height)
403
452
  spaces.each do |space|
404
453
  space.setBuildingStory(building_story)
405
454
  thermal_zone = OpenStudio::Model::ThermalZone.new(model)
406
455
  thermal_zone.setName("Building Story #{story_number} ThermalZone")
407
456
  space.setThermalZone(thermal_zone)
408
- end
409
-
457
+ end
458
+
410
459
  return spaces
411
460
  end
412
-
413
- end
414
- end
415
- end
461
+ end
462
+ end
463
+ end