Source code for honeybee_radiance_command.cutil
"""Collection of auxilary functions for radiance commands and options."""
import re
import collections
import os
import sys
if (sys.version_info < (3, 0)):
    import urllib2
    readmode = 'rb'
    writemode = 'wb'
else:
    import urllib.request
    readmode = 'r'
    writemode = 'w'
_rad_opt_pattern = r'-[a-zA-Z]+'
_rad_opt_compiled_pattern = re.compile(_rad_opt_pattern)
[docs]
def parse_radiance_options(string):
    """Parse a radiance options string (e.g. '-ab 4 -ad 256').
    The string should start with a '-' otherwise it will be trimmed to the first '-' in
    string.
    """
    try:
        index = string.index('-')
    except ValueError:
        if not ' '.join(string.split()).replace('"', '').replace("'", '').strip():
            return {}
        raise ValueError(
            'Invalid Radiance options string input. Failed to find - in input string.'
        )
    sub_string = ' '.join(string[index:].split())
    value = re.split(_rad_opt_compiled_pattern, sub_string)[1:]
    key = re.findall(_rad_opt_pattern, sub_string)
    options = collections.OrderedDict()
    for k, v in zip(key, value):
        values = v.split()
        count = len(values)
        if count == 0:
            values = ''
        elif count == 1:
            values = values[0]
        options[k[1:]] = values
    return options 
[docs]
def nukedir(target_dir, rmdir=False):
    """Delete all the files inside target_dir.
    Usage:
        nukedir("c:/ladybug/libs", True)
    """
    d = os.path.normpath(target_dir)
    if not os.path.isdir(d):
        return
    files = os.listdir(d)
    for f in files:
        if f == '.' or f == '..':
            continue
        path = os.path.join(d, f)
        if os.path.isdir(path):
            nukedir(path)
        else:
            try:
                os.remove(path)
            except Exception:
                print("Failed to remove %s" % path)
    if rmdir:
        try:
            os.rmdir(d)
        except Exception:
            print("Failed to remove %s" % d) 
[docs]
def preparedir(target_dir, remove_content=True):
    """Prepare a folder for analysis.
    This method creates the folder if it is not created, and removes the file in
    the folder if the folder already existed.
    """
    if os.path.isdir(target_dir):
        if remove_content:
            nukedir(target_dir, False)
        return True
    else:
        try:
            os.makedirs(target_dir)
            return True
        except Exception as e:
            print("Failed to create folder: %s\n%s" % (target_dir, e))
            return False 
[docs]
def write_to_file_by_name(folder, fname, data, mkdir=False):
    """Write a string of data to file by filename and folder.
    Args:
        folder: Target folder (e.g. c:/ladybug).
        fname: File name (e.g. testPts.pts).
        data: Any data as string.
        mkdir: Set to True to create the directory if doesn't exist (Default: False).
    """
    if not os.path.isdir(folder):
        if mkdir:
            preparedir(folder)
        else:
            created = preparedir(folder, False)
            if not created:
                raise ValueError("Failed to find %s." % folder)
    file_path = os.path.join(folder, fname)
    with open(file_path, writemode) as outf:
        try:
            outf.write(str(data))
            return file_path
        except Exception as e:
            raise IOError("Failed to write %s to file:\n\t%s" % (fname, str(e)))