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)))