Source code for eppy.EPlusInterfaceFunctions.parse_idd
#!/usr/bin/env python
## EPlusInterface (EPI) - An interface for EnergyPlus
## Copyright (C) 2004 Santosh Philip
# =======================================================================
# Distributed under the MIT License.
# (See accompanying file LICENSE or copy at
# http://opensource.org/licenses/MIT)
# =======================================================================
"""legacy code from EPlusInterface"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from io import StringIO
from io import FileIO
from decorator import decorator
import eppy.EPlusInterfaceFunctions.mylib1 as mylib1
import eppy.EPlusInterfaceFunctions.mylib2 as mylib2
import eppy.EPlusInterfaceFunctions.iddgroups as iddgroups
import eppy.EPlusInterfaceFunctions.iddindex as iddindex
[docs]def nocomment(astr, com):
"""
just like the comment in python.
removes any text after the phrase 'com'
"""
alist = astr.splitlines()
for i in range(len(alist)):
element = alist[i]
pnt = element.find(com)
if pnt != -1:
alist[i] = element[:pnt]
return "\n".join(alist)
[docs]def get_nocom_vars(astr):
"""
input 'astr' which is the Energy+.idd file as a string
returns (st1, st2, lss)
st1 = with all the ! comments striped
st2 = strips all comments - both the '!' and '\\'
lss = nested list of all the variables in Energy+.idd file
"""
nocom = nocomment(astr, "!") # remove '!' comments
st1 = nocom
nocom1 = nocomment(st1, "\\") # remove '\' comments
st1 = nocom
st2 = nocom1
# alist = string.split(st2, ';')
alist = st2.split(";")
lss = []
# break the .idd file into a nested list
# =======================================
for element in alist:
# item = string.split(element, ',')
item = element.split(",")
lss.append(item)
for i in range(0, len(lss)):
for j in range(0, len(lss[i])):
lss[i][j] = lss[i][j].strip()
if len(lss) > 1:
lss.pop(-1)
# =======================================
# st1 has the '\' comments --- looks like I don't use this
# lss is the .idd file as a nested list
return (st1, st2, lss)
[docs]def removeblanklines(astr):
"""remove the blank lines in astr"""
lines = astr.splitlines()
lines = [line for line in lines if line.strip() != ""]
return "\n".join(lines)
def _readfname(fname):
"""copied from extractidddata below.
It deals with all the types of fnames"""
try:
if isinstance(fname, (file, StringIO)):
astr = fname.read()
else:
astr = open(fname, "rb").read()
except NameError:
if isinstance(fname, (FileIO, StringIO)):
astr = fname.read()
else:
astr = mylib2.readfile(fname)
return astr
@decorator
def make_idd_index(extract_func, fname, debug):
"""generate the iddindex"""
astr = _readfname(fname)
# fname is exhausted by the above read
# reconstitute fname as a StringIO
fname = StringIO(astr)
# glist = iddgroups.iddtxt2grouplist(astr.decode('ISO-8859-2'))
blocklst, commlst, commdct = extract_func(fname)
name2refs = iddindex.makename2refdct(commdct)
ref2namesdct = iddindex.makeref2namesdct(name2refs)
idd_index = dict(name2refs=name2refs, ref2names=ref2namesdct)
commdct = iddindex.ref2names2commdct(ref2namesdct, commdct)
return blocklst, commlst, commdct, idd_index
@decorator
def embedgroupdata(extract_func, fname, debug):
"""insert group info into extracted idd"""
astr = _readfname(fname)
# fname is exhausted by the above read
# reconstitute fname as a StringIO
fname = StringIO(astr)
try:
astr = astr.decode("ISO-8859-2")
except Exception as e:
pass # for python 3
glist = iddgroups.iddtxt2grouplist(astr)
blocklst, commlst, commdct = extract_func(fname)
# add group information to commlst and commdct
# glist = getglist(fname)
commlst = iddgroups.group2commlst(commlst, glist)
commdct = iddgroups.group2commdct(commdct, glist)
return blocklst, commlst, commdct
[docs]@make_idd_index
@embedgroupdata
def extractidddata(fname, debug=False):
"""
extracts all the needed information out of the idd file
if debug is True, it generates a series of text files.
Each text file is incrementally different. You can do a diff
see what the change is
-
this code is from 2004.
it works.
I am trying not to change it (until I rewrite the whole thing)
to add functionality to it, I am using decorators
So if
Does not integrate group data into the results (@embedgroupdata does it)
Does not integrate iddindex into the results (@make_idd_index does it)
"""
try:
if isinstance(fname, (file, StringIO)):
astr = fname.read()
try:
astr = astr.decode("ISO-8859-2")
except AttributeError:
pass
else:
astr = mylib2.readfile(fname)
# astr = astr.decode('ISO-8859-2') -> mylib1 does a decode
except NameError:
if isinstance(fname, (FileIO, StringIO)):
astr = fname.read()
try:
astr = astr.decode("ISO-8859-2")
except AttributeError:
pass
else:
astr = mylib2.readfile(fname)
# astr = astr.decode('ISO-8859-2') -> mylib2.readfile has decoded
(nocom, nocom1, blocklst) = get_nocom_vars(astr)
astr = nocom
st1 = removeblanklines(astr)
if debug:
mylib1.write_str2file("nocom2.txt", st1.encode("latin-1"))
# find the groups and the start object of the group
# find all the group strings
groupls = []
alist = st1.splitlines()
for element in alist:
lss = element.split()
if lss[0].upper() == "\\group".upper():
groupls.append(element)
# find the var just after each item in groupls
groupstart = []
for i in range(len(groupls)):
iindex = alist.index(groupls[i])
groupstart.append([alist[iindex], alist[iindex + 1]])
# remove the group commentline
for element in groupls:
alist.remove(element)
if debug:
st1 = "\n".join(alist)
mylib1.write_str2file("nocom3.txt", st1.encode("latin-1"))
# strip each line
for i in range(len(alist)):
alist[i] = alist[i].strip()
if debug:
st1 = "\n".join(alist)
mylib1.write_str2file("nocom4.txt", st1.encode("latin-1"))
# ensure that each line is a comment or variable
# find lines that don't start with a comment
# if this line has a comment in it
# then move the comment to a new line below
lss = []
for i in range(len(alist)):
# find lines that don't start with a comment
if alist[i][0] != "\\":
# if this line has a comment in it
pnt = alist[i].find("\\")
if pnt != -1:
# then move the comment to a new line below
lss.append(alist[i][:pnt].strip())
lss.append(alist[i][pnt:].strip())
else:
lss.append(alist[i])
else:
lss.append(alist[i])
alist = lss[:]
if debug:
st1 = "\n".join(alist)
mylib1.write_str2file("nocom5.txt", st1.encode("latin-1"))
# need to make sure that each line has only one variable - as in WindowGlassSpectralData,
lss = []
for element in alist:
# if the line is not a comment
if element[0] != "\\":
# test for more than one var
llist = element.split(",")
if llist[-1] == "":
tmp = llist.pop()
for elm in llist:
if elm[-1] == ";":
lss.append(elm.strip())
else:
lss.append((elm + ",").strip())
else:
lss.append(element)
ls_debug = alist[:] # needed for the next debug - 'nocom7.txt'
alist = lss[:]
if debug:
st1 = "\n".join(alist)
mylib1.write_str2file("nocom6.txt", st1.encode("latin-1"))
if debug:
# need to make sure that each line has only one variable - as in WindowGlassSpectralData,
# this is same as above.
# but the variables are put in without the ';' and ','
# so we can do a diff between 'nocom7.txt' and 'nocom8.txt'. Should be identical
lss_debug = []
for element in ls_debug:
# if the line is not a comment
if element[0] != "\\":
# test for more than one var
llist = element.split(",")
if llist[-1] == "":
tmp = llist.pop()
for elm in llist:
if elm[-1] == ";":
lss_debug.append(elm[:-1].strip())
else:
lss_debug.append((elm).strip())
else:
lss_debug.append(element)
ls_debug = lss_debug[:]
st1 = "\n".join(ls_debug)
mylib1.write_str2file("nocom7.txt", st1.encode("latin-1"))
# replace each var with '=====var======'
# join into a string,
# split using '=====var====='
for i in range(len(lss)):
# if the line is not a comment
if lss[i][0] != "\\":
lss[i] = "=====var====="
st2 = "\n".join(lss)
lss = st2.split("=====var=====\n")
lss.pop(0) # the above split generates an extra item at start
if debug:
fname = "nocom8.txt"
fhandle = open(fname, "wb")
k = 0
for i in range(len(blocklst)):
for j in range(len(blocklst[i])):
atxt = blocklst[i][j] + "\n"
fhandle.write(atxt)
atxt = lss[k]
fhandle.write(atxt.encode("latin-1"))
k = k + 1
fhandle.close()
# map the structure of the comments -(this is 'lss' now) to
# the structure of blocklst - blocklst is a nested list
# make lss a similar nested list
k = 0
lst = []
for i in range(len(blocklst)):
lst.append([])
for j in range(len(blocklst[i])):
lst[i].append(lss[k])
k = k + 1
if debug:
fname = "nocom9.txt"
fhandle = open(fname, "wb")
k = 0
for i in range(len(blocklst)):
for j in range(len(blocklst[i])):
atxt = blocklst[i][j] + "\n"
fhandle.write(atxt)
fhandle.write(lst[i][j].encode("latin-1"))
k = k + 1
fhandle.close()
# break up multiple line comment so that it is a list
for i in range(len(lst)):
for j in range(len(lst[i])):
lst[i][j] = lst[i][j].splitlines()
# remove the '\'
for k in range(len(lst[i][j])):
lst[i][j][k] = lst[i][j][k][1:]
commlst = lst
# copied with minor modifications from readidd2_2.py -- which has been erased ha !
clist = lst
lss = []
for i in range(0, len(clist)):
alist = []
for j in range(0, len(clist[i])):
itt = clist[i][j]
ddtt = {}
for element in itt:
if len(element.split()) == 0:
break
ddtt[element.split()[0].lower()] = []
for element in itt:
if len(element.split()) == 0:
break
# ddtt[element.split()[0].lower()].append(string.join(element.split()[1:]))
ddtt[element.split()[0].lower()].append(" ".join(element.split()[1:]))
alist.append(ddtt)
lss.append(alist)
commdct = lss
# add group information to commlst and commdct
# glist = iddgroups.idd2grouplist(fname)
# commlst = group2commlst(commlst, glist)
# commdct = group2commdct(commdct, glist)
return blocklst, commlst, commdct
# give blocklst a better name :-(
[docs]def getobjectref(blocklst, commdct):
"""
makes a dictionary of object-lists
each item in the dictionary points to a list of tuples
the tuple is (objectname, fieldindex)
"""
objlst_dct = {}
for eli in commdct:
for elj in eli:
if "object-list" in elj:
objlist = elj["object-list"][0]
objlst_dct[objlist] = []
for objlist in list(objlst_dct.keys()):
for i in range(len(commdct)):
for j in range(len(commdct[i])):
if "reference" in commdct[i][j]:
for ref in commdct[i][j]["reference"]:
if ref == objlist:
objlst_dct[objlist].append((blocklst[i][0], j))
return objlst_dct