Source code for eppy.simplesurface

# Copyright (c) 2012 Santosh Philip
# =======================================================================
#  Distributed under the MIT License.
#  (See accompanying file LICENSE or copy at
#  http://opensource.org/licenses/MIT)
# =======================================================================
"""from BUILDINGSURFACE:DETAILED and FENESTRATIONSURFACE:DETAILED make a wall
floor, celiling etc or a window"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

# key fields:
# Name
# Surface Type
#     key Floor
#     key Wall
#     key Ceiling
#     key Roof
# Construction Name
# Zone Name
# Outside Boundary Condition
#     key Adiabatic
#     key Surface
#     key Zone
#     key Outdoors
#     key Ground
#     key GroundFCfactorMethod
#     key OtherSideCoefficients
#     key OtherSideConditionsModel
#     key GroundSlabPreprocessorAverage
#     key GroundSlabPreprocessorCore
#     key GroundSlabPreprocessorPerimeter
#     key GroundBasementPreprocessorAverageWall
#     key GroundBasementPreprocessorAverageFloor
#     key GroundBasementPreprocessorUpperWall
#     key GroundBasementPreprocessorLowerWall
# Outside Boundary Condition Object
#
# 'FENESTRATIONSURFACE:DETAILED',
# Surface_Type
#        key Window
#        key Door
#        key GlassDoor
#        key TubularDaylightDome
#        key TubularDaylightDiffuser
#
#
# 'BUILDINGSURFACE:DETAILED',
# (simple_surface, Surface_Type, Outside_Boundary_Condition)
# ----------------------------------------------------------
# ('WALL:EXTERIOR', Wall, Outdoors)
# ('WALL:ADIABATIC',Wall, Adiabatic)
# ('WALL:UNDERGROUND', Wall, s.startswith('Ground'))
# ('WALL:INTERZONE', Wall, Surface OR Zone)
# ('ROOF', Roof, None or Outdoor)
# ('CEILING:ADIABATIC', Ceiling, Adiabatic)
# ('CEILING:INTERZONE', Ceiling, Surface OR Zone or OtherSideCoefficients)
# ('FLOOR:GROUNDCONTACT', Floor, s.startswith('Ground'))
# ('FLOOR:ADIABATIC', Floor, Adiabatic)
# ('FLOOR:INTERZONE', Floor, Surface OR Zone or OtherSideCoefficients)
#
# 'FENESTRATIONSURFACE:DETAILED',
# (simple_surface, Surface_Type, Outside_Boundary_Condition)
# ----------------------------------------------------------
# ('WINDOW',  Window, None)
# ('DOOR', Door, None)


[docs]class NotImplementedError(Exception): """Exception Object""" pass
[docs]def bsdorigin(bsdobject, setto000=False): """return the origin of the surface""" # not yet implemented if setto000: return (0, 0, 0) else: raise NotImplementedError
[docs]def fsdorigin(fsdobject, setto000=False): """return the origin of the surface""" # not yet implemented if setto000: return (0, 0) else: raise NotImplementedError
[docs]def wallexterior(idf, bsdobject, deletebsd=True, setto000=False): """return an wall:exterior object if the (buildingsurface:detailed) is an exterior wall""" # ('WALL:EXTERIOR', Wall, Outdoors) # test if it is an exterior wall if bsdobject.Surface_Type.upper() == "WALL": # Surface_Type == wall if ( bsdobject.Outside_Boundary_Condition.upper() == "OUTDOORS" ): # Outside_Boundary_Condition == Outdoor simpleobject = idf.newidfobject("WALL:EXTERIOR") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Height = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def walladiabatic(idf, bsdobject, deletebsd=True, setto000=False): """return a wall:adiabatic if bsdobject (buildingsurface:detailed) is an adibatic wall""" # ('WALL:ADIABATIC',Wall, Adiabatic) # test if it is an adiabatic wall if bsdobject.Surface_Type.upper() == "WALL": # Surface_Type == wall if ( bsdobject.Outside_Boundary_Condition.upper() == "ADIABATIC" ): # Outside_Boundary_Condition == Adiabatic simpleobject = idf.newidfobject("WALL:ADIABATIC") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Height = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def wallunderground(idf, bsdobject, deletebsd=True, setto000=False): """return a wall:underground if bsdobject (buildingsurface:detailed) is an underground wall""" # ('WALL:UNDERGROUND', Wall, s.startswith('Ground')) # test if it is an underground wall if bsdobject.Surface_Type.upper() == "WALL": # Surface_Type == wall if bsdobject.Outside_Boundary_Condition.upper().startswith( "GROUND" ): # Outside_Boundary_Condition startswith 'ground' simpleobject = idf.newidfobject("WALL:UNDERGROUND") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Height = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def wallinterzone(idf, bsdobject, deletebsd=True, setto000=False): """return an wall:interzone object if the bsd (buildingsurface:detailed) is an interaone wall""" # ('WALL:INTERZONE', Wall, Surface OR Zone OR OtherSideCoefficients) # test if it is an exterior wall if bsdobject.Surface_Type.upper() == "WALL": # Surface_Type == wall if bsdobject.Outside_Boundary_Condition.upper() in ( "SURFACE", "ZONE", "OtherSideCoefficients".upper(), ): simpleobject = idf.newidfobject("WALL:INTERZONE") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name obco = "Outside_Boundary_Condition_Object" simpleobject[obco] = bsdobject[obco] simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Height = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def roof(idf, bsdobject, deletebsd=True, setto000=False): """return an roof object if the bsd (buildingsurface:detailed) is a roof""" # ('ROOF', Roof, None or Outdoor) # test if it is aroof if bsdobject.Surface_Type.upper() == "ROOF": # Surface_Type == roof if bsdobject.Outside_Boundary_Condition.upper() in ( "OUTDOORS", "", ): # Outside_Boundary_Condition == Outdoor simpleobject = idf.newidfobject("ROOF") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def ceilingadiabatic(idf, bsdobject, deletebsd=True, setto000=False): """return a ceiling:adiabatic if bsdobject (buildingsurface:detailed) is an adiabatic ceiling""" # ('CEILING:ADIABATIC', Ceiling, Adiabatic) # test if it is an adiabatic ceiling if bsdobject.Surface_Type.upper() == "CEILING": # Surface_Type == ceiling if ( bsdobject.Outside_Boundary_Condition.upper() == "ADIABATIC" ): # Outside_Boundary_Condition == Adiabatic simpleobject = idf.newidfobject("CEILING:ADIABATIC") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
# ('CEILING:INTERZONE', Ceiling, Surface OR Zone)
[docs]def ceilinginterzone(idf, bsdobject, deletebsd=True, setto000=False): """return an ceiling:interzone object if the bsd (buildingsurface:detailed) is an interzone ceiling""" # ('WALL:INTERZONE', Wall, Surface OR Zone OR OtherSideCoefficients) # test if it is an exterior wall if bsdobject.Surface_Type.upper() == "CEILING": # Surface_Type == ceiling if bsdobject.Outside_Boundary_Condition.upper() in ( "SURFACE", "ZONE", "OtherSideCoefficients".upper(), ): simpleobject = idf.newidfobject("CEILING:INTERZONE") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name obco = "Outside_Boundary_Condition_Object" simpleobject[obco] = bsdobject[obco] simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def floorgroundcontact(idf, bsdobject, deletebsd=True, setto000=False): """return a wall:adiabatic if bsdobject (buildingsurface:detailed) is an adibatic wall""" # ('FLOOR:GROUNDCONTACT', Floor, s.startswith('Ground')) # test if it is an underground wall if bsdobject.Surface_Type.upper() == "FLOOR": # Surface_Type == wall if bsdobject.Outside_Boundary_Condition.upper().startswith( "GROUND" ): # Outside_Boundary_Condition startswith 'ground' simpleobject = idf.newidfobject("FLOOR:GROUNDCONTACT") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def flooradiabatic(idf, bsdobject, deletebsd=True, setto000=False): """return a floor:adiabatic if bsdobject (buildingsurface:detailed) is an adibatic floor""" # ('FLOOR:ADIABATIC', Floor, Adiabatic) # test if it is an adiabatic wall if bsdobject.Surface_Type.upper() == "FLOOR": # Surface_Type == wall if ( bsdobject.Outside_Boundary_Condition.upper() == "ADIABATIC" ): # Outside_Boundary_Condition == Adiabatic simpleobject = idf.newidfobject("FLOOR:ADIABATIC") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def floorinterzone(idf, bsdobject, deletebsd=True, setto000=False): """return an floor:interzone object if the bsd (buildingsurface:detailed) is an interaone floor""" # ('FLOOR:INTERZONE', Floor, Surface OR Zone OR OtherSideCoefficients) # test if it is an exterior wall if bsdobject.Surface_Type.upper() == "FLOOR": # Surface_Type == wall if bsdobject.Outside_Boundary_Condition.upper() in ( "SURFACE", "ZONE", "OtherSideCoefficients".upper(), ): simpleobject = idf.newidfobject("FLOOR:INTERZONE") simpleobject.Name = bsdobject.Name simpleobject.Construction_Name = bsdobject.Construction_Name simpleobject.Zone_Name = bsdobject.Zone_Name obco = "Outside_Boundary_Condition_Object" simpleobject[obco] = bsdobject[obco] simpleobject.Azimuth_Angle = bsdobject.azimuth simpleobject.Tilt_Angle = bsdobject.tilt surforigin = bsdorigin(bsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Y_Coordinate = surforigin[1] simpleobject.Starting_Z_Coordinate = surforigin[2] simpleobject.Length = bsdobject.width simpleobject.Width = bsdobject.height if deletebsd: idf.removeidfobject(bsdobject) return simpleobject return None
[docs]def window(idf, fsdobject, deletebsd=True, setto000=False): """return an window object if the fsd (fenestrationsurface:detailed) is a window""" # ('WINDOW', Window, None) if fsdobject.Surface_Type.upper() == "WINDOW": # Surface_Type == w simpleobject = idf.newidfobject("WINDOW") simpleobject.Name = fsdobject.Name simpleobject.Construction_Name = fsdobject.Construction_Name simpleobject.Building_Surface_Name = fsdobject.Building_Surface_Name simpleobject.Shading_Control_Name = fsdobject.Shading_Control_Name simpleobject.Frame_and_Divider_Name = fsdobject.Frame_and_Divider_Name simpleobject.Multiplier = fsdobject.Multiplier surforigin = fsdorigin(fsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Z_Coordinate = surforigin[1] simpleobject.Length = fsdobject.width simpleobject.Height = fsdobject.height if deletebsd: idf.removeidfobject(fsdobject) return simpleobject return None
[docs]def door(idf, fsdobject, deletebsd=True, setto000=False): """return an door object if the fsd (fenestrationsurface:detailed) is a door""" # ('DOOR', Door, None) # test if it is aroof if fsdobject.Surface_Type.upper() == "DOOR": # Surface_Type == w simpleobject = idf.newidfobject("DOOR") simpleobject.Name = fsdobject.Name simpleobject.Construction_Name = fsdobject.Construction_Name simpleobject.Building_Surface_Name = fsdobject.Building_Surface_Name simpleobject.Multiplier = fsdobject.Multiplier surforigin = fsdorigin(fsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Z_Coordinate = surforigin[1] simpleobject.Length = fsdobject.width simpleobject.Height = fsdobject.height if deletebsd: idf.removeidfobject(fsdobject) return simpleobject return None
[docs]def glazeddoor(idf, fsdobject, deletebsd=True, setto000=False): """return an glazeddoor object if the fsd (fenestrationsurface:detailed) is a glassdoor""" # ('WINDOW', glassdoor, None) # test if it is glassdoor if fsdobject.Surface_Type.upper() == "GLASSDOOR": simpleobject = idf.newidfobject("GLAZEDDOOR") simpleobject.Name = fsdobject.Name simpleobject.Construction_Name = fsdobject.Construction_Name simpleobject.Building_Surface_Name = fsdobject.Building_Surface_Name simpleobject.Shading_Control_Name = fsdobject.Shading_Control_Name simpleobject.Frame_and_Divider_Name = fsdobject.Frame_and_Divider_Name simpleobject.Multiplier = fsdobject.Multiplier surforigin = fsdorigin(fsdobject, setto000=setto000) simpleobject.Starting_X_Coordinate = surforigin[0] simpleobject.Starting_Z_Coordinate = surforigin[1] simpleobject.Length = fsdobject.width simpleobject.Height = fsdobject.height if deletebsd: idf.removeidfobject(fsdobject) return simpleobject return None
[docs]def simplesurface(idf, bsd, deletebsd=True, setto000=False): """convert a bsd (buildingsurface:detailed) into a simple surface""" funcs = ( wallexterior, walladiabatic, wallunderground, wallinterzone, roof, ceilingadiabatic, ceilinginterzone, floorgroundcontact, flooradiabatic, floorinterzone, ) for func in funcs: surface = func(idf, bsd, deletebsd=deletebsd, setto000=setto000) if surface: return surface return None
[docs]def simplefenestration(idf, fsd, deletebsd=True, setto000=False): """convert a bsd (fenestrationsurface:detailed) into a simple fenestrations""" funcs = (window, door, glazeddoor) for func in funcs: fenestration = func(idf, fsd, deletebsd=deletebsd, setto000=setto000) if fenestration: return fenestration return None