openstudio-standards 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -19,7 +19,7 @@ Standard.class_eval do
19
19
  # this is required to be blank otherwise it may cause side effects.
20
20
  epw_file = ''
21
21
  end
22
- model = load_initial_osm(@geometry_file)
22
+ model = load_geometry_osm(@geometry_file)
23
23
  model.getThermostatSetpointDualSetpoints(&:remove)
24
24
  model.getBuilding.setName(self.class.to_s)
25
25
  # save new basefile to new geometry folder as class name.
@@ -102,6 +102,28 @@ class Standard
102
102
  return model
103
103
  end
104
104
 
105
+ # Loads a JSON file containing the space type map into a hash
106
+ #
107
+ # @param hvac_map_file [String] path to JSON file, relative to the /data folder
108
+ # @return [Hash] returns a hash that contains the space type map
109
+ def load_hvac_map(hvac_map_file)
110
+ # Load the geometry .osm from relative to the data folder
111
+ rel_path_to_hvac_map = "../../../../../data/#{hvac_map_file}"
112
+
113
+ # Load the JSON depending on whether running from normal gem location
114
+ # or from the embedded location in the OpenStudio CLI
115
+ if File.dirname(__FILE__)[0] == ':'
116
+ # running from embedded location in OpenStudio CLI
117
+ hvac_map_string = load_resource_relative(rel_path_to_hvac_map)
118
+ hvac_map = JSON.parse(hvac_map_string)
119
+ else
120
+ abs_path = File.join(File.dirname(__FILE__), rel_path_to_hvac_map)
121
+ hvac_map = JSON.parse(File.read(abs_path))if File.exist?(abs_path)
122
+ end
123
+
124
+ return hvac_map
125
+ end
126
+
105
127
  # Convert from SEER to COP (no fan) for cooling coils
106
128
  # @ref [References::ASHRAE9012013] Appendix G
107
129
  #
@@ -70,9 +70,9 @@ end
70
70
  end
71
71
  @lookup_building_type = self.model_get_lookup_name(@@building_type)
72
72
  #ideally we should map the data required to a instance variable.
73
- @geometry_file = Folders.instance.data_geometry_folder + '/' + self.class.name + '.osm'
74
- hvac_map_file = Folders.instance.data_geometry_folder + '/' + self.class.name + '.hvac_map.json'
75
- @system_to_space_map = JSON.parse(File.read(hvac_map_file))if File.exist?(hvac_map_file)
73
+ @geometry_file = 'geometry/' + self.class.name + '.osm'
74
+ hvac_map_file = 'geometry/' + self.class.name + '.hvac_map.json'
75
+ @system_to_space_map = load_hvac_map(hvac_map_file)
76
76
  self.set_variables()
77
77
  end
78
78
  # This method is used to extend the class with building-type-specific
@@ -188,9 +188,9 @@ end
188
188
  end
189
189
  @lookup_building_type = self.model_get_lookup_name(@building_type)
190
190
  #ideally we should map the data required to a instance variable.
191
- @geometry_file = Folders.instance.data_geometry_folder + '/' + self.class.name + '.osm'
192
- hvac_map_file = Folders.instance.data_geometry_folder + '/' + self.class.name + '.hvac_map.json'
193
- @system_to_space_map = JSON.parse(File.read(hvac_map_file))if File.exist?(hvac_map_file)
191
+ @geometry_file = 'geometry/' + self.class.name + '.osm'
192
+ hvac_map_file = 'geometry/' + self.class.name + '.hvac_map.json'
193
+ # @system_to_space_map = load_hvac_map(hvac_map_file) # No HVAC map json files for NECB
194
194
  self.set_variables()
195
195
  end
196
196
 
@@ -512,19 +512,9 @@ end
512
512
  end
513
513
  @lookup_building_type = @@building_type
514
514
  #ideally we should map the data required to a instance variable.
515
- @geometry_file = Folders.instance.data_geometry_folder + '/' + @prototype_input['geometry_osm']
516
- if !File.exist?(@geometry_file)
517
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', \"Could not find prototype inputs for \#{{'template' => @template,'building_type' => @@building_type, 'hvac' => @@hvac_system}}, cannot create model.\")
518
- raise(\"Could not find geometry osm \#{@prototype_input['geometry_osm']} for #{template}#{building_type}#{hvac_system}, cannot create model.\")
519
- return false
520
- end
521
- hvac_map_file = Folders.instance.data_geometry_folder + '/' + @prototype_input['hvac_json']
522
- if !File.exist?(hvac_map_file)
523
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', \"Could not find prototype inputs for \#{{'template' => @template,'building_type' => @@building_type, 'hvac' => @@hvac_system}}, cannot create model.\")
524
- raise(\"Could not find HVAC json \#{@prototype_input['hvac_json']} for #{template}#{building_type}#{hvac_system}, cannot create model.\")
525
- return false
526
- end
527
- @system_to_space_map = JSON.parse(File.read(hvac_map_file))if File.exist?(hvac_map_file)
515
+ @geometry_file = 'geometry/' + @prototype_input['geometry_osm']
516
+ hvac_map_file = 'geometry/' + @prototype_input['hvac_json']
517
+ @system_to_space_map = load_hvac_map(hvac_map_file)
528
518
  self.set_variables()
529
519
  end
530
520
 
@@ -4433,16 +4433,33 @@ class Standard
4433
4433
 
4434
4434
  # Loads a osm as a starting point.
4435
4435
  #
4436
+ # @param osm_file [String] path to the .osm file, relative to the /data folder
4436
4437
  # @return [Bool] returns true if successful, false if not
4437
- def load_initial_osm(osm_file)
4438
- # Load the geometry .osm
4439
- unless File.exist?(osm_file)
4440
- raise("The initial osm path: #{osm_file} does not exist.")
4441
- end
4442
- osm_model_path = OpenStudio::Path.new(osm_file.to_s)
4443
- # Upgrade version if required.
4444
- version_translator = OpenStudio::OSVersion::VersionTranslator.new
4445
- model = version_translator.loadModel(osm_model_path).get
4438
+ def load_geometry_osm(osm_file)
4439
+ # Load the geometry .osm from relative to the data folder
4440
+ osm_model_path = "../../../data/#{osm_file}"
4441
+
4442
+ # Load the .osm depending on whether running from normal gem location
4443
+ # or from the embedded location in the OpenStudio CLI
4444
+ if File.dirname(__FILE__)[0] == ':'
4445
+ # running from embedded location in OpenStudio CLI
4446
+ geom_model_string = load_resource_relative(osm_model_path)
4447
+ version_translator = OpenStudio::OSVersion::VersionTranslator.new
4448
+ model = version_translator.loadModelFromString(geom_model_string)
4449
+ else
4450
+ abs_path = File.join(File.dirname(__FILE__), osm_model_path)
4451
+ version_translator = OpenStudio::OSVersion::VersionTranslator.new
4452
+ model = version_translator.loadModel(abs_path)
4453
+ end
4454
+
4455
+ # Check that the model loaded successfully
4456
+ if model.empty?
4457
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Version translation failed for #{osm_model_path}")
4458
+ return false
4459
+ end
4460
+ model = model.get
4461
+
4462
+ # Check for expected characteristics of geometry model
4446
4463
  if model.getBuildingStorys.empty?
4447
4464
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Please assign Spaces to BuildingStorys in the geometry model: #{osm_model_path}.")
4448
4465
  end
@@ -88,10 +88,17 @@ class StandardsData
88
88
  end
89
89
 
90
90
  def load_standards_data(datafolder = File.dirname(__FILE__))
91
- files = Dir.glob("#{datafolder}/**/*.json").select {|e| File.file? e}
92
91
  @standards_data = {}
93
- files.each do |file|
94
- @standards_data = standards_data.deep_merge (JSON.parse(File.read(file)))
92
+ if __dir__[0] == ':' # Running from OpenStudio CLI
93
+ files = embedded_files_relative('./', /.*\.json/)
94
+ files.each do |file|
95
+ @standards_data = standards_data.deep_merge(JSON.parse(EmbeddedScripting.getFileAsString(file)))
96
+ end
97
+ else
98
+ files = Dir.glob("#{datafolder}/**/*.json").select {|e| File.file? e}
99
+ files.each do |file|
100
+ @standards_data = standards_data.deep_merge (JSON.parse(File.read(file)))
101
+ end
95
102
  end
96
103
  @standards_data = @standards_data.sort_by_key(true)
97
104
  return @standards_data
@@ -6,23 +6,34 @@ class NECB2011 < Standard
6
6
  attr_reader :template
7
7
  attr_accessor :standards_data
8
8
 
9
-
9
+ # Combine the data from the JSON files into a single hash
10
+ # Load JSON files differently depending on whether loading from
11
+ # the OpenStudio CLI embedded filesystem or from typical gem installation
10
12
  def load_standards_database_new()
11
- # Combine the data from the JSON files into a single hash
12
- top_dir = File.expand_path('../../..', File.dirname(__FILE__))
13
- standards_data_dir = "#{top_dir}/data/"
14
- files = Dir.glob("#{File.dirname(__FILE__)}/data/*.json").select {|e| File.file? e}
15
13
  @standards_data = {}
16
14
  @standards_data["tables"] = []
17
- files.each do |file|
18
- #puts "loading standards data from #{file}"
19
- data = JSON.parse(File.read(file))
20
- if not data["tables"].nil? and data["tables"].first["data_type"] =="table"
21
- @standards_data["tables"] << data["tables"].first
22
- else
23
- @standards_data[data.keys.first] = data[data.keys.first]
15
+
16
+ if __dir__[0] == ':' # Running from OpenStudio CLI
17
+ embedded_files_relative('data/', /.*\.json/).each do |file|
18
+ data = JSON.parse(EmbeddedScripting.getFileAsString(file))
19
+ if not data["tables"].nil? and data["tables"].first["data_type"] =="table"
20
+ @standards_data["tables"] << data["tables"].first
21
+ else
22
+ @standards_data[data.keys.first] = data[data.keys.first]
23
+ end
24
+ end
25
+ else
26
+ files = Dir.glob("#{File.dirname(__FILE__)}/data/*.json").select {|e| File.file? e}
27
+ files.each do |file|
28
+ data = JSON.parse(File.read(file))
29
+ if not data["tables"].nil? and data["tables"].first["data_type"] =="table"
30
+ @standards_data["tables"] << data["tables"].first
31
+ else
32
+ @standards_data[data.keys.first] = data[data.keys.first]
33
+ end
24
34
  end
25
35
  end
36
+
26
37
  #needed for compatibility of standards database format
27
38
  @standards_data['tables'].each do |table|
28
39
  @standards_data[table['name']] = table
@@ -102,7 +113,7 @@ class NECB2011 < Standard
102
113
  #get models weather object to get the province. Then use that to look up the province.
103
114
  epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
104
115
  fuel_sources = @standards_data['tables'].detect {|table| table['name'] == 'regional_fuel_use'}['table'].detect {|fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region)}
105
- raise() if fuel_sources.nil? #this should never happen since we are using only canadian weather files.
116
+ raise("Could not find fuel sources for weather file, make sure it is a Canadian weather file.") if fuel_sources.nil? #this should never happen since we are using only canadian weather files.
106
117
  return fuel_sources
107
118
  end
108
119
 
@@ -136,7 +147,7 @@ class NECB2011 < Standard
136
147
  raise 'no building_type!' if @instvarbuilding_type.nil?
137
148
  model = nil
138
149
  # prototype generation.
139
- model = load_initial_osm(@geometry_file) # standard candidate
150
+ model = load_geometry_osm(@geometry_file) # standard candidate
140
151
  model.getThermostatSetpointDualSetpoints(&:remove)
141
152
  model.yearDescription.get.setDayofWeekforStartDay('Sunday')
142
153
  model_add_design_days_and_weather_file(model, climate_zone, epw_file) # Standards
@@ -112,9 +112,9 @@ class Standard
112
112
  @standards_data = {}
113
113
  standards_files.sort.each do |standards_file|
114
114
  temp = ''
115
- begin
115
+ if __dir__[0] == ':' # Running from OpenStudio CLI
116
116
  temp = load_resource_relative("../../../data/standards/#{standards_file}", 'r:UTF-8')
117
- rescue NoMethodError
117
+ else
118
118
  File.open("#{standards_data_dir}/#{standards_file}", 'r:UTF-8') do |f|
119
119
  temp = f.read
120
120
  end
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.2.0'.freeze
16
+ VERSION = '0.2.1'.freeze
17
17
  end
@@ -73,9 +73,7 @@ class Standard
73
73
 
74
74
  # Define where the weather files lives
75
75
  weather_dir = nil
76
- if File.dirname(__FILE__)[0] == ':'
77
- # running embedded copy of the gem
78
-
76
+ if __dir__[0] == ':' # Running from OpenStudio CLI
79
77
  # load weather file from embedded files
80
78
  epw_string = load_resource_relative("../../../data/weather/#{weather_file_name}")
81
79
  ddy_string = load_resource_relative("../../../data/weather/#{weather_file_name.gsub('.epw', '.ddy')}")
@@ -237,8 +235,16 @@ module BTAP
237
235
  # this method is used to populate user interfaces if needed from the hash above.
238
236
  def self.get_canadian_weather_file_names()
239
237
  canadian_file_names = []
240
- Dir.glob("#{File.dirname(__FILE__)}/../../../**/*.epw").each do |file|
241
- canadian_file_names << File.basename(file).to_s
238
+ if __dir__[0] == ':' # Running from OpenStudio CLI
239
+ embedded_files_relative('../../../', /.*\.epw/).each do |file|
240
+ canadian_file_names << File.basename(file).to_s
241
+ end
242
+ else
243
+ Dir.glob("#{File.dirname(__FILE__)}/../../../**/*.epw").each do |file|
244
+ canadian_file_names << File.basename(file).to_s
245
+ puts "File.basename = #{File.basename(file)}"
246
+ puts "File.dirname = #{File.dirname(file)}"
247
+ end
242
248
  end
243
249
  return canadian_file_names
244
250
  end
@@ -384,10 +390,6 @@ module BTAP
384
390
  # @param weather_file [String]
385
391
  # @return [String] self
386
392
  def initialize(weather_file)
387
- # Define the openstudio-standards weather location
388
- top_dir = File.expand_path('../../..', File.dirname(__FILE__))
389
- weather_dir = "#{top_dir}/data/weather"
390
-
391
393
  # First check if the epw file exists at a full path. If not found there,
392
394
  # check for the file in the openstudio-standards/data/weather directory.
393
395
  weather_file = weather_file.to_s
@@ -398,12 +400,29 @@ module BTAP
398
400
  @epw_filepath = weather_file.to_s
399
401
  @ddy_filepath = weather_file.sub('epw', 'ddy').to_s
400
402
  @stat_filepath = weather_file.sub('epw', 'stat').to_s
401
- elsif File.exist?("#{weather_dir}/#{weather_file}")
403
+ else
404
+ # Run differently depending on whether running from embedded filesystem in OpenStudio CLI or not
405
+ if __dir__[0] == ':' # Running from OpenStudio CLI
406
+ # load weather file from embedded files
407
+ epw_string = load_resource_relative("../../../data/weather/#{weather_file}")
408
+ ddy_string = load_resource_relative("../../../data/weather/#{weather_file.gsub('.epw', '.ddy')}")
409
+ stat_string = load_resource_relative("../../../data/weather/#{weather_file.gsub('.epw', '.stat')}")
410
+
411
+ # extract to local weather dir
412
+ weather_dir = File.expand_path(File.join(Dir.pwd, 'extracted_files/weather/'))
413
+ puts "Extracting weather files to #{weather_dir}"
414
+ FileUtils.mkdir_p(weather_dir)
415
+ File.open("#{weather_dir}/#{weather_file}", 'wb') { |f| f << epw_string; f.flush }
416
+ File.open("#{weather_dir}/#{weather_file.gsub('.epw', '.ddy')}", 'wb') { |f| f << ddy_string; f.flush }
417
+ File.open("#{weather_dir}/#{weather_file.gsub('.epw', '.stat')}", 'wb') { |f| f << stat_string; f.flush }
418
+ else # loaded gem from system path
419
+ top_dir = File.expand_path('../../..', File.dirname(__FILE__))
420
+ weather_dir = File.expand_path("#{top_dir}/data/weather")
421
+ end
422
+
402
423
  @epw_filepath = "#{weather_dir}/#{weather_file}"
403
424
  @ddy_filepath = "#{weather_dir}/#{weather_file.sub('epw', 'ddy')}"
404
425
  @stat_filepath = "#{weather_dir}/#{weather_file.sub('epw', 'stat')}"
405
- else
406
- raise("Could not find weather file #{weather_file}. Make sure file path is correct.")
407
426
  end
408
427
 
409
428
  # Ensure that epw, ddy, and stat file all exist
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -21,7 +21,7 @@ authors:
21
21
  autorequire:
22
22
  bindir: bin
23
23
  cert_chain: []
24
- date: 2018-03-25 00:00:00.000000000 Z
24
+ date: 2018-04-19 00:00:00.000000000 Z
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: minitest-reporters
@@ -1630,7 +1630,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1630
1630
  version: 1.3.6
1631
1631
  requirements: []
1632
1632
  rubyforge_project:
1633
- rubygems_version: 2.4.5.2
1633
+ rubygems_version: 2.7.6
1634
1634
  signing_key:
1635
1635
  specification_version: 4
1636
1636
  summary: Creates DOE Prototype building models and transforms proposed OpenStudio