2019-11-14
05:47 PM
- last edited on
2022-09-29
09:58 AM
by
Daniel Kassai
import os
import sys
import re
import xlrd
excelFileName = "LayoutBook.xls"
excelFilePath = os.path.join (os.path.dirname (sys.argv[0]), excelFileName)
if os.path.isfile (excelFilePath) is False:
sys.exit ("File does not exists: {}".format (excelFilePath))
xl_workbook = xlrd.open_workbook(excelFilePath)
xl_sheet = xl_workbook.sheet_by_index(0)
layoutTree = GetNavigatorTree (API_LayoutMap)
subSetTree = [(list(layoutTree)[0], 0)]
def GetItemsFromTree (tree, typeSet = None):
l = []
for k in tree.keys():
if typeSet is None or k.itemType in typeSet:
l.append (k)
l.extend (GetItemsFromTree (tree, typeSet))
return l
masters = GetItemsFromTree (layoutTree, {API_MasterLayoutNavItem})
def GetChildrenFromTree (tree, subSetTree):
if not subSetTree:
return list(tree.keys())
for k in tree.keys():
if k.name == subSetTree[0][0].name and k.uiId == subSetTree[0][0].uiId:
return GetChildrenFromTree (tree, subSetTree[1:])
return []
def FindItemByName (items, name):
for item in items:
if item.name == name:
return item
PrintError('Bad Name: {}'.format(name))
return None
def FindItemByIDName (items, ID, name):
for item in items:
if item.name == name and item.uiId == ID:
return item
return None
def CreateSubSetItem (ID, name, parent):
newSubSet = APIObject ()
newSubSet.uiId = ID
newSubSet.customUiId = True
newSubSet.name = name
newSubSet.customName = True
newSubSet.itemType = API_SubSetNavItem
newSubSet.mapId = API_LayoutMap
CreateNavigatorItem (newSubSet, parent)
return newSubSet
def CreateOrChangeLayoutItem (ID, name, masterName, parent, oldItem = None):
newLayout = APIObject () if oldItem is None else oldItem
newLayout.uiId = ID
newLayout.customUiId = True
newLayout.name = name
newLayout.customName = True
newLayout.itemType = API_LayoutNavItem
newLayout.mapId = API_LayoutMap
newLayout.db = APIObject ()
newLayout.db.typeID = APIWind_LayoutID
masterLayoutItem = FindItemByName (masters, masterName)
newLayout.db.masterLayoutUnId = masterLayoutItem.db.databaseUnId
if oldItem is None:
parentChildren = GetChildrenFromTree (layoutTree, subSetTree)
if not parentChildren:
CreateNavigatorItem (newLayout, parent)
else:
CreateNavigatorItem (newLayout, parent, parentChildren[-1])
else:
ChangeNavigatorItem (newLayout)
return newLayout
def GetParent (actIndex):
global subSetTree
for i in reversed(range(1,len(subSetTree))):
if subSetTree[1] >= actIndex:
del subSetTree
return subSetTree[-1][0]
newSubSetNumber, newLayoutNumber = 0, 0
for row_idx in range(1, xl_sheet.nrows):
for column_idx in range(1, xl_sheet.ncols):
idCell = xl_sheet.cell(row_idx, column_idx)
if idCell.value != '':
ID = idCell.value.strip()
NAME = xl_sheet.cell(row_idx, column_idx + 1).value.strip()
MASTER_NAME = xl_sheet.cell(row_idx, column_idx + 3).value.strip()
PARENT = GetParent(column_idx)
oldItem = FindItemByIDName (GetChildrenFromTree (layoutTree, subSetTree), ID, NAME)
if MASTER_NAME == '':
newSubSetNumber += 1
if oldItem is None:
subSetTree.append((CreateSubSetItem (ID, NAME, PARENT), column_idx))
else:
subSetTree.append((oldItem, column_idx))
else:
newLayoutNumber += 1
CreateOrChangeLayoutItem (ID, NAME, MASTER_NAME, PARENT, oldItem)
layoutTree = GetNavigatorTree (API_LayoutMap)
break
print("Created {} subsets and {} layouts based on {}".format(newSubSetNumber, newLayoutNumber, excelFileName))
2019-11-14 08:29 PM