Source code for dragonfly_iesve.writer

# coding: utf-8
"""Write a gem file from a Dragonfly model."""
from __future__ import division

from ladybug_geometry.geometry3d import Polyface3D
from honeybee.facetype import Floor, RoofCeiling, face_types
from honeybee.room import Room as HBRoom
from honeybee_ies.writer import model_to_gem as hb_model_to_gem


[docs] def model_to_gem(model, use_multiplier=True, exclude_plenums=False, merge_method='None'): """Generate an IES GEM string from a Dragonfly Model. Args: model: A dragonfly Model. use_multiplier: Boolean to note whether the multipliers on each Building story will be passed along to the Room objects or if full geometry objects should be written for each repeated story in the building. (Default: True). exclude_plenums: Boolean to indicate whether ceiling/floor plenum depths assigned to Room2Ds should generate distinct 3D Rooms in the translation. (Default: False). merge_method: An optional text string to describe how the Room2Ds should be merged into individual Rooms during the translation. Specifying a value here can be an effective way to reduce the number of Room volumes in the resulting Model and, ultimately, yield a faster simulation time with less results to manage. Note that Room2Ds will only be merged if they form a contiguous volume across their solved adjacencies. Otherwise, there will be multiple Rooms per zone or story, each with an integer added at the end of their identifiers. Choose from the following options: * None - No merging of Room2Ds will occur * Zones - Room2Ds in the same zone will be merged * PlenumZones - Only plenums in the same zone will be merged * Stories - Rooms in the same story will be merged * PlenumStories - Only plenums in the same story will be merged Returns: Path to exported GEM file. """ # translate the model to honeybee hb_model = model.to_honeybee( 'District', use_multiplier=use_multiplier, exclude_plenums=exclude_plenums, solve_ceiling_adjacencies=False, merge_method=merge_method, enforce_adj=False, enforce_solid=True )[0] # check if there are any ceiling/floor air boundaries to translate cf_air_rooms = [] for room in model.room_2ds: if not room.has_floor or not room.has_ceiling: cf_air_rooms.append(room) # if any floor/ceiling rooms were found, solve adjacency between them if len(cf_air_rooms) != 0: tolerance = model.tolerance room_ids = [r.identifier for r in cf_air_rooms] has_floor_ceil = [(r.has_floor, r.has_ceiling) for r in cf_air_rooms] hb_rooms = hb_model.rooms_by_identifier(room_ids) # intersect the Rooms with one another for matching adjacencies HBRoom.intersect_adjacency(hb_rooms, tolerance, model.angle_tolerance) # solve adjacencies between rooms to yield matching air boundaries for i, (room_1, fc_1) in enumerate(zip(hb_rooms, has_floor_ceil)): try: for room_2, fc_2 in zip(hb_rooms[i + 1:], has_floor_ceil[i + 1:]): if not Polyface3D.overlapping_bounding_boxes( room_1.geometry, room_2.geometry, tolerance): continue # no overlap in bounding box; adjacency impossible for face_1 in room_1._faces: for face_2 in room_2._faces: if face_1.geometry.is_centered_adjacent( face_2.geometry, tolerance): face_1.remove_sub_faces() face_2.remove_sub_faces() hf_1, hc_1 = fc_1 hf_2, hc_2 = fc_2 if not hc_1 and not hf_2: if isinstance(face_1.type, RoofCeiling) and \ isinstance(face_2.type, Floor): face_1.type = face_types.air_boundary face_2.type = face_types.air_boundary if not hf_1 and not hc_2: if isinstance(face_2.type, RoofCeiling) and \ isinstance(face_1.type, Floor): face_1.type = face_types.air_boundary face_2.type = face_types.air_boundary break except IndexError: pass # we have reached the end of the list of zones # return the honeybee model translated to GEM return hb_model_to_gem(hb_model)