Source code for eppy.EPlusInterfaceFunctions.iddindex
# Copyright (c) 2016 Santosh Philip
# =======================================================================
# Distributed under the MIT License.
# (See accompanying file LICENSE or copy at
# http://opensource.org/licenses/MIT)
# =======================================================================
"""module for idd_index data structure and functions to work with it
- idd_index indexes idd_info so that it is easy to search through it.
- idd_info is the datastructure that holds the info in the Energy+.idd file"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
# possible data structure:
# idd_index = {
# ref2names:{
# MaterialName:[MATERIAL, MATERIAL:AIRGAP, ...]
# ZoneName:[ZONE,]
# },
# name2refs:{
# ZONE:[ZoneNames, OutFaceEnvNames, ...]
# SCHEDULE:DAY:HOURLY:[DayScheduleNames, ScheduleAndDayScheduleNames]
# },
# fieldsthatrefer:{
# WINDOW:[], # will be list of fields in the future
# DOOR:[], # once I figure how to not list all the repeating fields
# }
#
# }
# embedd (actually point to) some of this info in idd_info
# In [17]: construction.getfieldidd('Layer_2')
# Out[17]:
# {u'field': [u'Layer 2'],
# u'object-list': [u'MaterialName'],
# u'type': [u'object-list']}
# will now become:
# Out[17]:
# {u'field': [u'Layer 2'],
# u'object-list': [u'MaterialName'],
# 'referedobjkeys':[MATERIAL, MATERIAL:AIRGAP, ...]
# # MaterialName:[MATERIAL, MATERIAL:AIRGAP, ...] is the same list as in
# # ref2names above, not a new list. So we don't use too much memory
# u'type': [u'object-list']}
from eppy.bunch_subclass import getfieldidd_item
[docs]def makename2refdct(commdct):
"""make the name2refs dict in the idd_index"""
refdct = {}
for comm in commdct: # commdct is a list of dict
try:
idfobj = comm[0]["idfobj"].upper()
field1 = comm[1]
if "Name" in field1["field"]:
references = field1["reference"]
refdct[idfobj] = references
except (KeyError, IndexError) as e:
continue # not the expected pattern for reference
return refdct
[docs]def makeref2namesdct(name2refdct):
"""make the ref2namesdct in the idd_index"""
ref2namesdct = {}
for key, values in name2refdct.items():
for value in values:
ref2namesdct.setdefault(value, set()).add(key)
return ref2namesdct
[docs]def ref2names2commdct(ref2names, commdct):
"""embed ref2names into commdct"""
for comm in commdct:
for cdct in comm:
try:
refs = cdct["object-list"][0]
validobjects = ref2names[refs]
cdct.update({"validobjects": validobjects})
except KeyError as e:
continue
return commdct