TreeView
今回はLayer構造をTreeViewで作成してみる。
Qt Designer
コード
def __setupUI(self):
# Layout
widget = self.ui.centralWidget()
h_lo = self.ui.findChild(QHBoxLayout, 'h_lo')
# ListView
a_tv = self.ui.findChild(QTreeView, 'a_tv')
a_tv.clicked.connect(self.treeClicked)
self.getLayerList()
h_lo.addWidget(a_tv)
widget.setLayout(h_lo)
self.setCentralWidget(widget)
self.getLayerNameList()
self.logger.debug("Setup UI")
def getLayerList(self):
mgr = rt.LayerManager
self.layer_list:list = []
for i in range(mgr.count):
layer = mgr.getLayer(i)
if layer != None:
self.layer_list.append(layer)
self.logger.debug(self.layer_list)
def getLayerNameList(self):
model_list = QStandardItemModel()
root = model_list.invisibleRootItem()
for i in range(len(self.layer_list)):
layer = self.layer_list[i]
if layer != None:
item = QStandardItem(layer.name)
if layer.getParent() == None:
root.appendRow(item)
else:
parent = model_list.findItems(layer.getParent().name, Qt.MatchExactly)
parent[0].appendRow(item)
result, child_node = layer.nodes(pymxs.byref(None))
if len(child_node) > 0:
for node in child_node:
if node != None:
child = QStandardItem(node.name)
item.appendRow(child)
a_tv = self.findChild(QTreeView, 'a_tv')
model_list.setHeaderData(0, Qt.Horizontal, "Name", Qt.DisplayRole)
self.logger.debug(model_list.headerData(0, Qt.Horizontal, Qt.DisplayRole))
a_tv.setModel(model_list)
def treeClicked(self, index):
tv:QTreeView = self.sender()
r = index.row()
item = tv.model().index(r, 0, index.parent())
self.showMessage(item.data())
__setupUI関数は、ListViewの時とほぼ同じ。
getLayerList関数でレイヤーのリストを取得する。
3dsMaxのレイヤーはちょっと特殊なデータの持ち方をしている。
以下、レイヤーをName, Parent, Nodesで表示してみる。
Name: 0
Parent: None
Nodes: (True, [])
Name: Layer001
Parent: None
Nodes: (True, [])
Name: Layer002
Parent: <MixinInterface:LayerProperties>
Nodes: (True, [<Sphere<$Sphere:Sphere001 @ [0.731744,0.983925,0.000000]>>])
Name: Layer003
Parent: None
Nodes: (True, [])
Name: Layer004
Parent: <MixinInterface:LayerProperties>
Nodes: (True, [<Teapot<$Teapot:Teapot001 @ [-32.672844,26.833195,0.000000]>>, <Box<$Box:Box001 @ [28.900925,-33.267628,0.000000]>>])
レイヤーのリストはフォルダのみを保持していて、フォルダの階層は親のフォルダがあるかで表現している。
フォルダ内にある各オブジェクトはノードリストとして保持している。
これで、レイヤーの階層データを構成している。
通常の親子関係は親の中に子を保持する。
子がフォルダなのかオブジェクトなのかは関係ない。
子がフォルダなのか、オブジェクトなのかは、取得するときに型をみる。
getLayerNameList関数でTreeViewに表示する文字列の階層構造を取得する。
階層構造はQStandardItemModelを使用して、これをRootとして各レイヤーのQStandardItemを作成。
レイヤーデータがParentを持つかどうかで、appedRowするItemを決めている。
Nodesに関しては、Nodesを持っている場合は、もっているItemを親として各ノードをappendRowする。
これで3dsMaxのレイヤーと同じ表示になる階層構造を作成して、TreeViewにモデルをセットする。
他の情報を別カラムで表示するようにするには、独自のModelを作成する必要があり、ちょっとめんどくさい。
これについては、次回のTableViewで記述する。