Basics ====== The API for `geomeppy` depends on replacing an `eppy` IDF object with a `geomeppy` IDF object. To use this, you will need to import IDF from `geomeppy` rather than directly from `eppy`. In your scripts, use ``from geomeppy import IDF`` instead of ``from eppy.modeleditor import IDF``. All other features of the current release version of `eppy` will still be available. `geomeppy` then provides a simple Python API for actions on the IDF object: Intersect and match surfaces ---------------------------- Intersect all surfaces: :: IDF.intersect() Set boundary conditions of surfaces: :: IDF.match() Intersect surfaces then set/update boundary conditions: :: IDF.intersect_match() Move an IDF ----------- Move the whole IDF close to 0,0 on the x, y axes: :: IDF.translate_to_origin() Move the whole IDF to x + 50, y + 20: :: IDF.translate([50, 20]) Move the whole IDF to z + 10: :: IDF.translate([0, 0, 10]) Rotate ------ Rotate the IDF 90 degrees counterclockwise around the centre of its bounding box: :: IDF.rotate(90) Scale ----- Scale the IDF to double its size (default is on the xy axes): :: IDF.scale(2) Scale the IDF to double its size (in the xy axes): :: IDF.scale(2, axes='xy') Scale the IDF to double its size (in the z axis): :: IDF.scale(2, axes='z') Add windows to external walls ----------------------------- Set a WWR of 20% (the default) for all external walls: :: IDF.set_wwr() Set a WWR of 25% for all external walls: :: IDF.set_wwr(wwr=0.25) Set no windows on all external walls with azimuth of 90, and WWR of 20% on other walls: :: IDF.set_wwr(wwr_map={90: 0}) Set a WWR of 30% for all external walls with azimuth of 90, and no windows on other walls: :: IDF.set_wwr(wwr=0, wwr_map={90: 0.3}) If ``wwr_map`` is passed, it overrides any value passed to ``wwr``, including the default of 0.2. However it only overrides it on walls which have an azimuth in the ``wwr_map``. Any omitted walls' WWR will be set to the value in ``wwr``. If you want to specify no windows for walls which are not specified in ``wwr_map``, you must also set ``wwr=None``. Set constructions ----------------- Set a name for each construction in the model: :: IDF.set_default_constructions() View a simple 3D model ---------------------- Show a zoomable, rotatable transparent model using `matplotlib`: :: IDF.view_model() Export a 3D OBJ file -------------------- Generate a model which can be viewed in external programs: :: IDF.to_obj('mymodel.obj') You can view the exported model `here `_. Just drag the .obj file and .mtl file into the browser window. Get all surfaces ---------------- :: IDF.getsurfaces() Get all surfaces of a given type -------------------------------- :: IDF.getsurfaces('wall') This only works if the surface type has been set in the IDF. Get all subsurfaces ------------------- :: IDF.getsubsurfaces() Get all subsurfaces of a given type ----------------------------------- :: IDF.getsubsurfaces('window') This only works if the surface type has been set in the IDF. Add a block automatically ------------------------- Automatically add a building block to the IDF: :: IDF.add_block(...) This method requires some explanation. The parameters required are: :: name : str A name for the block. coordinates : list A list of (x, y) tuples representing the building outline. height : float The height of the block roof above ground level. num_stories : int, optional The total number of stories including basement stories. Default : 1. below_ground_stories : int, optional The number of stories below ground. Default : 0. below_ground_storey_height : float, optional The height of each basement storey. Default : 2.5. zoning : str, optional The rules to use in creating zones. Currently two options are available: - `by_storey`: sets each storey in the block as a Zone. - `core/perim`: creates core and perimeter Zones for each storey (see perim_depth). perim_depth : float, optional Depth of the perimeter zones if the core/perim zoning pattern is requested. Default : 3.0. The block generated will have boundary conditions set correctly and any intersections with adjacent blocks will be handled automatically. The surface type will be set to ``wall``, ``floor``, ``ceiling`` or ``roof`` for each surface. Constructions are not set automatically so these will need to be added afterwards in the normal way for Eppy. Set surface coordinates ----------------------- :: surface.setcoords(...) For example: :: wall = idf.newidfobject( 'BUILDINGSURFACE:DETAILED', Name='awall', Surface_Type = 'wall', ) wall.setcoords([(0,0,1),(0,0,0),(1,0,0),(1,0,1)])