@@ -1138,7 +1138,7 @@ def is_spandrel(s=None):
11381138 cl = openstudio .model .Surface
11391139
11401140 if not isinstance (s , cl ):
1141- return oslg .mismatch ("surface" , s , cl , mth , CN .DBG )
1141+ return oslg .mismatch ("surface" , s , cl , mth , CN .DBG , False )
11421142
11431143 # Prioritize AdditionalProperties route.
11441144 if s .additionalProperties ().hasFeature ("spandrel" ):
@@ -1158,6 +1158,38 @@ def is_spandrel(s=None):
11581158 return "spandrel" in s .nameString ().lower ()
11591159
11601160
1161+ def is_fenestration (s = None ):
1162+ """Validates whether a sub surface is fenestrated.
1163+
1164+ Args:
1165+ s (openstudio.model.SubSurface):
1166+ An OpenStudio sub surface.
1167+
1168+ Returns:
1169+ bool: Whether subsurface can be considered 'fenestrated'.
1170+ False: If invalid input (see logs).
1171+
1172+ """
1173+ mth = "osut.is_fenestration"
1174+ cl = openstudio .model .SubSurface
1175+
1176+ if not isinstance (s , cl ):
1177+ return oslg .mismatch ("subsurface" , s , cl , mth , CN .DBG , False )
1178+
1179+ # OpenStudio::Model::SubSurface.validSubSurfaceTypeValues
1180+ # "FixedWindow" : fenestration
1181+ # "OperableWindow" : fenestration
1182+ # "Door"
1183+ # "GlassDoor" : fenestration
1184+ # "OverheadDoor"
1185+ # "Skylight" : fenestration
1186+ # "TubularDaylightDome" : fenestration
1187+ # "TubularDaylightDiffuser" : fenestration
1188+ if s .subSurfaceType ().lower () in ["door" , "overheaddoor" ]: return False
1189+
1190+ return True
1191+
1192+
11611193def transforms (group = None ) -> dict :
11621194 """"Returns OpenStudio site/space transformation & rotation angle.
11631195
0 commit comments