from ansa import guitk
from ansa import base
from typing import List, Tuple, Dict, Union
deck = base.CurrentDeck()
PARTTYPETUPLE:Tuple[str] = ('ANSAPART', 'ANSAGROUP')
VIEWCOLNAMETUPLE:Tuple[str] = ('Module Id', 'Name', 'Status')
def setItemText(item:object, name:str, id:str='')->None:
'''
对输入的item设置名称和ID
'''
guitk.BCListViewItemSetText(item, VIEWCOLNAMETUPLE.index('Name'), name)
if id:
guitk.BCListViewItemSetText(item, VIEWCOLNAMETUPLE.index('Module Id'), id)
return None
def createItem(parentItem:object, part:base.Entity, isTop:bool=False)->object:
'''
功能:
为输入的part在parentItem下创建一个新的item
参数:
parentItem object 准备新创建item的父节点,为item或listView类型
part: Entity 一个part或group对象
isTop bool 判断需要创建节点是否为根节点的判断器
返回值:
返回生成的item对象
'''
if not isTop: item:object = guitk.BCListViewItemAddChild(parentItem)
else: item:object = guitk.BCListViewAddTopLevelItem(parentItem)
if part.ansa_type(deck)==PARTTYPETUPLE[0]:
partId: str = part.get_entity_values(deck, ['Module Id', ])['Module Id']
else:
partId: str = ''
setItemText(item, part._name.strip(), id=partId)
guitk.BCListViewItemSetUserData(item, part)
return item
def loadModelTree02()->None:
partIter:List[base.Entity] = base.CollectEntitiesI(deck, None, PARTTYPETUPLE)
hierToPartDict:Dict[str,List[base.Entity]] = dict()
for part in partIter:
tree:str = part.get_entity_values(deck, ['Hierarchy', ])['Hierarchy']
tree = tree.strip()
try: hierToPartDict[tree].append(part)
except KeyError: hierToPartDict[tree] = [part]
crtTreeBranch(leftModelView, '', hierToPartDict, isTop=True)
def crtTreeBranch(parent:object, name:str, hierToPartDict:Dict[str,List[base.Entity]], isTop:bool=False)->None:
children:List[base.Entity] = hierToPartDict.get(name, None)
if not children: return None
for child in children:
item = leftPartToItemDict.get(child, None)
if not item:
item = createItem(parent, child, isTop=isTop)
leftPartToItemDict[child] = item
if child.ansa_type(deck)==PARTTYPETUPLE[0]:continue
crtTreeBranch(item, f'{name}{child._name.strip()}/', hierToPartDict)
return None
if __name__ == '__main__':
leftPartToItemDict:Dict[str, List[object]] = dict()
mainWindow:object = guitk.BCWindowCreate('结构树构造', guitk.constants.BCOnExitDestroy)
mainBox:object = guitk.BCVBoxCreate(mainWindow)
leftModelView:object = guitk.BCListViewCreate(mainBox, 3, VIEWCOLNAMETUPLE, True)
guitk.BCListViewSetIsRootDecorated(leftModelView, True)
guitk.BCListViewSetFilterEnabled(leftModelView, True)
guitk.BCListViewSetSelectionMode(leftModelView, guitk.constants.BCMulti)
loadModelTree02()
guitk.BCShow(mainWindow)