Class: ScaleGeometry

Inherits:
OpenStudio::Measure::ModelMeasure
  • Object
show all
Defined in:
lib/measures/scale_geometry/measure.rb

Overview

start the measure

Instance Method Summary collapse

Instance Method Details

#arguments(model) ⇒ Object

define the arguments that the user will input



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/measures/scale_geometry/measure.rb', line 27

def arguments(model)
  args = OpenStudio::Measure::OSArgumentVector.new

  # x scale
  x_scale = OpenStudio::Measure::OSArgument.makeDoubleArgument('x_scale', true)
  x_scale.setDisplayName('X Scale')
  x_scale.setDescription('Multiplier to apply to X direction.')
  x_scale.setDefaultValue(1.0)
  args << x_scale

  # y scale
  y_scale = OpenStudio::Measure::OSArgument.makeDoubleArgument('y_scale', true)
  y_scale.setDisplayName('Y Scale')
  y_scale.setDescription('Multiplier to apply to Y direction.')
  y_scale.setDefaultValue(1.0)
  args << y_scale

  # z scale
  z_scale = OpenStudio::Measure::OSArgument.makeDoubleArgument('z_scale', true)
  z_scale.setDisplayName('Z Scale')
  z_scale.setDescription('Multiplier to apply to Z direction.')
  z_scale.setDefaultValue(1.0)
  args << z_scale

  return args
end

#descriptionObject

human readable description



17
18
19
# File 'lib/measures/scale_geometry/measure.rb', line 17

def description
  return 'Scales geometry in the model by fixed multiplier in the x, y, z directions.  Does not guarantee that the resulting model will be correct (e.g. not self-intersecting).  '
end

#modeler_descriptionObject

human readable description of modeling approach



22
23
24
# File 'lib/measures/scale_geometry/measure.rb', line 22

def modeler_description
  return 'Scales all PlanarSurfaceGroup origins and then all PlanarSurface vertices in the model. Also applies to DaylightingControls, GlareSensors, and IlluminanceMaps.'
end

#nameObject

human readable name



12
13
14
# File 'lib/measures/scale_geometry/measure.rb', line 12

def name
  return 'scale_geometry'
end

#run(model, runner, user_arguments) ⇒ Object

define what happens when the measure is run



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
# File 'lib/measures/scale_geometry/measure.rb', line 55

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

  # assign the user inputs to variables
  x_scale = runner.getDoubleArgumentValue('x_scale', user_arguments)
  y_scale = runner.getDoubleArgumentValue('y_scale', user_arguments)
  z_scale = runner.getDoubleArgumentValue('z_scale', user_arguments)

  # report initial condition of model
  runner.registerInitialCondition("The building started with floor area of #{model.getBuilding.floorArea} m^2.")

  model.getPlanarSurfaceGroups.each do |group|
    group.setXOrigin(x_scale * group.xOrigin)
    group.setYOrigin(y_scale * group.yOrigin)
    group.setZOrigin(z_scale * group.zOrigin)
  end

  model.getPlanarSurfaces.each do |surface|
    vertices = surface.vertices
    new_vertices = OpenStudio::Point3dVector.new
    vertices.each do |vertex|
      new_vertices << OpenStudio::Point3d.new(x_scale * vertex.x, y_scale * vertex.y, z_scale * vertex.z)
    end
    surface.setVertices(new_vertices)
  end

  model.getDaylightingControls.each do |control|
    control.setPositionXCoordinate(x_scale * control.positionXCoordinate)
    control.setPositionYCoordinate(y_scale * control.positionYCoordinate)
    control.setPositionZCoordinate(z_scale * control.positionZCoordinate)
  end

  model.getGlareSensors.each do |sensor|
    sensor.setPositionXCoordinate(x_scale * sensor.positionXCoordinate)
    sensor.setPositionYCoordinate(y_scale * sensor.positionYCoordinate)
    sensor.setPositionZCoordinate(z_scale * sensor.positionZCoordinate)
  end

  model.getGlareSensors.each do |map|
    map.setOriginXCoordinate(x_scale * map.originXCoordinate)
    map.setOriginYCoordinate(y_scale * map.originYCoordinate)
    map.setXLength(x_scale * map.xLength)
    map.setYLength(y_scale * map.yLength)
  end

  # report final condition of model
  runner.registerFinalCondition("The building finished with floor area of #{model.getBuilding.floorArea} m^2.")

  return true
end