Source code for ladybug_rhino.openstudio
"""Functions for importing OpenStudio into the Python environment."""
import os
import shutil
import sys
try:
import clr
except ImportError as e: # No .NET being used
print('Failed to import CLR. OpenStudio SDK is unavailable.\n{}'.format(e))
try:
from honeybee_energy.config import folders
except ImportError as e:
print('Failed to import honeybee_energy. '
'OpenStudio SDK is unavailable.\n{}'.format(e))
[docs]
def load_osm(osm_path):
"""Load an OSM file to an OpenStudio SDK Model object in the Python environment.
Args:
osm_path: The path to an OSM file to be loaded an an OpenStudio Model.
Returns:
An OpenStudio Model object derived from the input osm_path.
Usage:
.. code-block:: python
from ladybug_rhino.openstudio import load_osm
# load an OpenStudio model from an OSM file
osm_path = 'C:/path/to/model.osm'
os_model = load_osm(osm_path)
# get the space types from the model
os_space_types = os_model.getSpaceTypes()
for spt in os_space_types:
print(spt)
"""
# check that the file exists and OpenStudio is installed
assert os.path.isfile(osm_path), 'No OSM file was found at "{}".'.format(osm_path)
ops = import_openstudio()
# load the model object and return it
os_path = ops.OpenStudioUtilitiesCore.toPath(osm_path)
osm_path_obj = ops.Path(os_path)
exist_os_model = ops.Model.load(osm_path_obj)
if exist_os_model.is_initialized():
return exist_os_model.get()
else:
raise ValueError(
'The file at "{}" does not appear to be an OpenStudio model.'.format(
osm_path
))
[docs]
def dump_osm(model, osm_path):
"""Dump an OpenStudio Model object to an OSM file.
Args:
model: An OpenStudio Model to be written to a file.
osm_path: The path of the .osm file where the OpenStudio Model will be saved.
Returns:
The path to the .osm file as a string.
Usage:
.. code-block:: python
from ladybug_rhino.openstudio import load_osm, dump_osm
# load an OpenStudio model from an OSM file
osm_path = 'C:/path/to/model.osm'
model = load_osm(osm_path)
# get all of the SetpointManagers and set their properties
setpt_managers = model.getSetpointManagerOutdoorAirResets()
for setpt in setpt_managers:
setpt.setSetpointatOutdoorLowTemperature(19)
setpt.setOutdoorLowTemperature(12)
setpt.setSetpointatOutdoorHighTemperature(16)
setpt.setOutdoorHighTemperature(22)
# save the edited OSM over the original one
osm = dump_osm(model, osm_path)
"""
# check that the model is the correct object type
ops = import_openstudio()
assert isinstance(model, ops.Model), \
'Expected OpenStudio Model. Got {}.'.format(type(model))
# load the model object and return it
os_path = ops.OpenStudioUtilitiesCore.toPath(osm_path)
osm_path_obj = ops.Path(os_path)
model.save(osm_path_obj, True)
return osm_path
[docs]
def import_openstudio():
"""Import the OpenStudio SDK into the Python environment.
Returns:
The OpenStudio NameSpace with all of the modules, classes and methods
of the OpenStudio SDK.
Usage:
.. code-block:: python
from ladybug_rhino.openstudio import import_openstudio, dump_osm
OpenStudio = import_openstudio()
# create a new OpenStudio model from scratch
os_model = OpenStudio.Model()
space_type = OpenStudio.SpaceType(os_model)
# save the Model to an OSM
osm_path = 'C:/path/to/model.osm'
osm = dump_osm(os_model, osm_path)
"""
try: # first see if OpenStudio has already been loaded
import OpenStudio
return OpenStudio
except ImportError:
# check to be sure that the OpenStudio CSharp folder has been installed
compatibility_url = 'https://github.com/ladybug-tools/lbt-grasshopper/wiki/' \
'1.4-Compatibility-Matrix'
in_msg = 'Download and install the version of OpenStudio listed in the ' \
'Ladybug Tools compatibility matrix\n{}.'.format(compatibility_url)
assert folders.openstudio_path is not None, \
'No OpenStudio installation was found on this machine.\n{}'.format(in_msg)
assert folders.openstudio_csharp_path is not None, \
'No OpenStudio CSharp folder was found in the OpenStudio installation ' \
'at:\n{}'.format(os.path.dirname(folders.openstudio_path))
_copy_openstudio_lib()
# add the OpenStudio DLL to the Common Language Runtime (CLR)
os_dll = os.path.join(folders.openstudio_csharp_path, 'OpenStudio.dll')
clr.AddReferenceToFileAndPath(os_dll)
if folders.openstudio_csharp_path not in sys.path:
sys.path.append(folders.openstudio_csharp_path)
import OpenStudio
return OpenStudio
def _copy_openstudio_lib():
"""Copy the openstudiolib.dll into the CSharp folder.
This is a workaround that is necessary because the OpenStudio installer
does not install the CSharp bindings correctly.
"""
# see if the CSharp folder already has everything it needs
dest_file = os.path.join(folders.openstudio_csharp_path, 'openstudiolib.dll')
if os.path.isfile(dest_file):
return None
# if not, see if the openstudio_lib_path has the file that needs to be copied
base_msg = 'The OpenStudio CSharp path at "{}" lacks the openstudiolib.dll'.format(
folders.openstudio_csharp_path)
assert os.path.isdir(folders.openstudio_lib_path), \
'{}\nand there is no OpenStudio Lib installed.'.format(base_msg)
src_file = os.path.join(folders.openstudio_lib_path, 'openstudiolib.dll')
assert os.path.isfile(src_file), \
'{}\nand this file was not found at "{}".'.format(base_msg, src_file)
# copy the DLL if it exists
shutil.copy(src_file, dest_file)