Source code for honeybee_plus.config

"""Honeybee configurations.

Import this module in every module that you need to access Honeybee configurations.

Usage:

    import config
    print(config.radlib_path)
    print(config.radbin_path)
    print(config.platform)
    config.radbin_path = "c:/radiance/bin"
"""
import os
import sys
import json


[docs]class Folders(object): """Honeybee folders. Attributes: mute: Set to True if you don't want the class to print the report (Default: False) Usage: folders = Folders(mute=False) print(folders.radbin_path) """ __defaultPath = { "path_to_radiance": r'', "path_to_energyplus": r'', "path_to_openstudio": r'', "path_to_perl": r'' } __configFile = os.path.join(os.path.dirname(__file__), 'config.json') def __init__(self, mute=False): """Find default path for Honeybee. It currently includes: Default path to Radinace folders. Default path to EnergyPlus folders. """ self.mute = mute # try to load paths from config file self.load_from_file() # set path for openstudio self.open_studio_path = self.__defaultPath["path_to_openstudio"] # set path for radiance, if path to radiance is not set honeybee will # try to set it up to the radiance installation that comes with openStudio self.radiance_path = self.__defaultPath["path_to_radiance"] self.perl_path = self.__defaultPath["path_to_perl"] @staticmethod def _which(program): """Find executable programs. Args: program: Full file name for the program (e.g. rad.exe) Returns: File directory and full path to program in case of success. None, None in case of failure. """ def is_exe(fpath): # Make sure it's not part of Dive installation as DIVA doesn't # follow the standard structure folder for Daysim and Radiance if os.name == 'nt' and fpath.upper().find("DIVA"): return False # Return true if file exists and is executable return os.path.isfile(fpath) and os.access(fpath, os.X_OK) # check for the file in all path in environment for path in os.environ["PATH"].split(os.pathsep): # strip "" from Windows path exe_file = os.path.join(path.strip('"'), program) if is_exe(exe_file): return path, exe_file # couldn't find it! return None :| return None, None @property def open_studio_path(self): """Set and get the path to openstudio installation folder.""" return self._open_studio_path @open_studio_path.setter def open_studio_path(self, path): if not path: # check the default installation folders on Windows path = self._find_open_studio_folder() self._open_studio_path = path if os.name == 'nt' and self._open_studio_path: assert os.path.isfile(os.path.join(path, 'bin/openstudio.exe')), \ '{} is not a valid path to openstudio installation.'.format(path) if not self.mute and self._open_studio_path: print("Path to OpenStudio is set to: %s" % self._open_studio_path) # TODO(mostapha or chris): Update for OpenStudio 2 @staticmethod def _find_open_studio_folder(): def getversion(open_studio_path): ver = ''.join(s for s in open_studio_path if (s.isdigit() or s == '.')) return sum(int(i) * d ** 10 for d, i in enumerate(reversed(ver.split('.')))) if os.name == 'nt': os_folders = ['C:/Program Files/' + f for f in os.listdir('C:/Program Files') if (f.lower().startswith('openstudio') and os.path.isdir('C:/Program Files/' + f))] if not os_folders: return return sorted(os_folders, key=getversion, reverse=True)[0] else: return @property def radiance_path(self): """Get and set path to radiance installation folder.""" return self._radiancePath @property def radbin_path(self): """Path to Radiance binary folder.""" return self._radbin @property def radlib_path(self): """Path to Radiance library folder.""" return self._radlib @radiance_path.setter def radiance_path(self, path): if not path: if os.name == 'nt': __radbin, __rad_file = self._which("rad.exe") if __radbin: path = os.path.split(__radbin)[0] # finding by path failed. Let's check typical folders on Windows elif os.path.isfile(r"c:/radiance/bin/rad.exe"): path = r"c:/radiance" elif os.path.isfile(r"c:/Program Files/radiance/bin/rad.exe"): path = r"c:/Program Files/radiance" elif self.open_studio_path and os.path.isfile( os.path.join(self.open_studio_path, r"share/openStudio/Radiance/bin/rad.exe")): path = os.path.join(self.open_studio_path, r"share/openStudio/Radiance") elif os.name == 'posix': __radbin, __rad_file = self._which("mkillum") if __radbin: path = os.path.split(__radbin)[0] self._radiancePath = path if not os.path.isdir(path): if not self.mute: msg = "Warning: Failed to find radiance installation folder.\n" \ "You can set it up manually in {}.".format(self.__configFile) print(msg) self._radbin = "" self._radlib = "" else: # set up lib path self._radbin = os.path.normpath(os.path.join(path, 'bin')) self._radlib = os.path.normpath(os.path.join(path, 'lib')) if not self.mute and self._radiancePath: print("Path to radiance is set to: %s" % self._radiancePath) if self._radiancePath.find(' ') != -1: msg = 'Radiance path {} has a whitespace. Some of the radiance ' \ 'commands may fail.\nWe strongly suggest you to install radiance ' \ 'under a path with no withspace (e.g. c:/radiance)'.format( self._radiancePath ) print(msg) @property def perl_path(self): """Path to the folder containing Perl binary files.""" return self._perl_path @property def perl_exe_path(self): """Path to perl executable file.""" return self._perlExePath @perl_path.setter def perl_path(self, path): """Path to the folder containing Perl binary files.""" self._perl_path = path or "" self._perlExePath = path + "/perl" if not self._perl_path: if os.name == 'nt': self._perl_path, self._perlExePath = self._which("perl.exe") elif os.name == 'posix': self._perl_path, self._perlExePath = self._which("perl") if not self._perl_path and self.open_studio_path: # try to find perl under openstudio p = os.path.join(self.open_studio_path, 'strawberry-perl-5.16.2.1-32bit-portable-reduced') if os.path.isfile(os.path.join(p, 'perl/bin/perl.exe')): self._perl_path, self._perlExePath = p, \ os.path.join(p, 'perl/bin/perl.exe') if not self.mute and self._perl_path: print("Path to perl is set to: %s" % self._perl_path) @property def ep_folder(self): """Path to EnergyPlus folder.""" raise NotImplementedError # return self._eplus @property def python_exe_path(self): """Path to Python folder.""" return sys.executable
[docs] def load_from_file(self, file_path=None): """Load installation folders from a json file.""" file_path = file_path or self.__configFile assert os.path.isfile(str(file_path)), \ ValueError('No such a file as {}'.format(file_path)) with open(file_path, 'rb') as cfg: path = os.path.normpath(cfg.read()) try: paths = json.loads(path) except Exception: print('Failed to load paths from {}.'.format(file_path)) else: for key, p in paths.items(): if not key.startswith('__') and p.strip(): self.__defaultPath[key] = p.strip()
f = Folders(mute=False) radlib_path = f.radlib_path """Path to Radinace libraries folder.""" radbin_path = f.radbin_path """Path to Radinace binaries folder.""" # NotImplemented yet ep_path = None """Path to EnergyPlus folder.""" perl_exe_path = f.perl_exe_path """Path to the perl executable needed for some othe Radiance Scripts.""" python_exe_path = f.python_exe_path """Path to python executable needed for some Radiance scripts from the PyRad library""" wrapper = "\"" if os.name == 'nt' else "'" """Wrapper for path with white space."""