Class: RenameSpaceSurfacesBasedonParentSpaceandOrientation
- Inherits:
-
OpenStudio::Measure::ModelMeasure
- Object
- OpenStudio::Measure::ModelMeasure
- RenameSpaceSurfacesBasedonParentSpaceandOrientation
- Defined in:
- lib/measures/RenameSpaceSurfacesBasedonParentSpaceandOrientation/measure.rb
Overview
start the measure
Instance Method Summary collapse
-
#arguments(model) ⇒ Object
define the arguments that the user will input.
-
#name ⇒ Object
define the name that a user will see, this method may be deprecated as the display name in PAT comes from the name field in measure.xml.
-
#run(model, runner, user_arguments) ⇒ Object
define what happens when the measure is run.
Instance Method Details
#arguments(model) ⇒ Object
define the arguments that the user will input
21 22 23 24 25 26 27 |
# File 'lib/measures/RenameSpaceSurfacesBasedonParentSpaceandOrientation/measure.rb', line 21 def arguments(model) args = OpenStudio::Measure::OSArgumentVector.new # there are no arguments for this. At some point we could add arguments to customize naming logic. return args end |
#name ⇒ Object
define the name that a user will see, this method may be deprecated as the display name in PAT comes from the name field in measure.xml
16 17 18 |
# File 'lib/measures/RenameSpaceSurfacesBasedonParentSpaceandOrientation/measure.rb', line 16 def name return 'RenameSpaceSurfacesBasedonParentSpaceandOrientation' end |
#run(model, runner, user_arguments) ⇒ Object
define what happens when the measure is run
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/measures/RenameSpaceSurfacesBasedonParentSpaceandOrientation/measure.rb', line 30 def run(model, runner, user_arguments) super(model, runner, user_arguments) # use the built-in error checking if !runner.validateUserArguments(arguments(model), user_arguments) return false end # no arguments assign the user inputs to variables # get model objects surfaces = model.getSurfaces subSurfaces = model.getSubSurfaces # reporting initial condition of model runner.registerInitialCondition("The building has #{surfaces.size} space surfaces and #{subSurfaces.size} sub-surfaces.") # give temp names to surfaces so there are no conflicts if this is re-run more than once. counter = 0 surfaces.each do |surface| if !surface.space.empty? counter += 1 surface.setName("temp #{counter}") else # issue warning about orphan surface, and delete it (could add argument to control this) runner.registerWarning("#{surface.name} does not have a space and will be removed from the model.") surface.remove end end # array of alpha characters to use in surface names suffix = ('a'..'z').to_a # give final names to surfaces and sub-surfaces surfaces = model.getSurfaces # added so don't loop through removed orphan surfaces surfaces.each do |surface| # get parent name # space name, surface type and azimuth space_name = surface.space.get.name surface_type = surface.surfaceType surface_azimuth = OpenStudio::Quantity.new(surface.azimuth, OpenStudio.createSIAngle) surface_azimuth = OpenStudio.convert(surface_azimuth, OpenStudio.createIPAngle).get.value surface_azimuth = format('%03d', surface_azimuth.round) if surface_azimuth == '360' then surface_azimuth = '0' end if surface_type == 'Wall' base_name = "#{space_name} - #{surface_type} #{surface_azimuth}" else base_name = "#{space_name} - #{surface_type}" end # rename (need loop to address more than one surface in space with same type and azimuth) counter = 0 until suffix.include?(surface.name.get.reverse[0, 1]) # keep going until there is an alpha character at the end alpha = counter % 26 # gives me alpha character to use for name if counter > 25 # this is to address spaces with more than 26 surfaces with same azimuth. Adds second leading alpha character alpha2 = (counter / 26).truncate - 1 surface.setName("#{base_name}:#{suffix[alpha2]}#{suffix[alpha]}") else surface.setName("#{base_name}:#{suffix[alpha]}") # this will be name until more than 26 end counter += 1 end end # give temp names to sub-surfaces so there are no conflicts if this is re-run more than once. counter = 0 subSurfaces = model.getSubSurfaces # need to ask this a second time because some sub-surfaces may have been deleted with base surfaces subSurfaces.each do |subSurface| if !subSurface.surface.empty? counter += 1 subSurface.setName("temp #{counter}") else # issue warning about orphan surface, and delete it (could add argument to control this) runner.registerWarning("#{subSurface.name} does not have a parent surface and will be removed from the model.") subSurface.remove end end # give final names to surfaces and sub-surfaces subSurfaces = model.getSubSurfaces # need to ask this again so don't loop through removed orphaned sub-surfaces subSurfaces.each do |subSurface| # get parent name # space name, surface type and azimuth surface_name = subSurface.surface.get.name base_name = "#{surface_name} - Sub" # rename (need loop to address more than one surface in space with same type and azimuth) counter = 0 until suffix.include?(subSurface.name.get.reverse[0, 1]) # keep going until there is an alpha character at the end alpha = counter % 26 # gives me alpha character to use for name if counter > 25 # this is to address spaces with more than 26 surfaces with same azimuth. Adds second leading alpha character alpha2 = (counter / 26).truncate - 1 subSurface.setName("#{base_name}:#{suffix[alpha2]}#{suffix[alpha]}") else subSurface.setName("#{base_name}:#{suffix[alpha]}") # this will be name until more than 26 end counter += 1 end end # TODO: - also rename shading surfaces, and try and maintain namings matched to windows by using overhang script. # reporting final condition of model runner.registerFinalCondition('All space surfaces and sub-surfaces have been renamed.') return true end |