Source code for PyMca5.Object3D.ObjectTree
#/*##########################################################################
# Copyright (C) 2004-2014 V.A. Sole, European Synchrotron Radiation Facility
#
# This file is part of the PyMca X-ray Fluorescence Toolkit developed at
# the ESRF by the Software group.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This file is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
# details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Please contact the ESRF industrial unit (industry@esrf.fr) if this license
# is a problem for you.
#
#############################################################################*/
__author__ = "V.A. Sole - ESRF Data Analysis"
__contact__ = "sole@esrf.fr"
__license__ = "LGPL2+"
__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
"""
Provides the class 'ObjectTree'.
"""
[docs]class ObjectTree(object):
"""
Implements a simple tree of objects with a _name attribute.
Number of children is illimited.
Recursive structure
"""
def __init__(self, item, name=None):
"""
Init an empty tree.
PARAMETERS :
item : the object of the tree
name : the name of the object.
If ignored it will be set to object.name()
or to Unnamed.
"""
self.root = [item]
if name is None:
if hasattr(item, "name"):
name = item.name()
else:
name = "Unnamed"
self.__name = name
[docs] def name(self):
"""
Return its name.
"""
#if type(self.root[0]) == type(''):
# return self.root[0]
#return self.root[0]._name
return self.__name
[docs] def addChild(self, item, name=None):
"""
Add a child to the current tree or sub-tree.
PARAMETERS :
item : the item of the child tree
RETURNS :
the child
"""
child = ObjectTree(item, name=name)
self.root.append(child)
return child
[docs] def addChildTree(self, childTree):
"""
Add a child tree to the tree.
PARAMETERS :
childTree : the child tree to add
"""
self.root.append(childTree)
[docs] def childList(self):
"""
Compute the list of children.
"""
return self.root[1:]
[docs] def childNumber(self):
"""
Compute the number of children.
"""
return len(self.root) - 1
[docs] def delDirectChild(self, name):
"""
Remove a direct child.
PARAMETERS :
name : the name of the child to remove
RETURNS :
1 if deleted, else 0
"""
nbChild = self.childNumber()+1
for i in range(1,nbChild):
if self.root[i].name() == str(name):
del self.root[i]
return 1
return 0
[docs] def delChild(self, name):
"""
Remove a child in the tree.
PARAMETERS :
name : the name of the child to remove
RETURNS :
1 if deleted, else 0
"""
nbChild = self.childNumber()+1
for i in range(1,nbChild):
if self.root[i].name() == str(name):
del self.root[i]
return 1
for child in self.childList():
child.delChild(name)
[docs] def erase(self):
"""
Full erase of the tree.
Only the name stays.
"""
del self.root[1:]
[docs] def getList(self):
"""
Compute a plane list of the elements.
RETURNS :
this list of names.
"""
result = [self.name()]
childList = self.childList()
for child in childList:
result += child.getList()
return result
[docs] def find(self, childName):
"""
Find a child - or sub-child, given its name.
PARAMETERS :
childName : the name of the child to find
RETURNS :
the child, or 'None' if not found
"""
if self.name() == str(childName):
return self
for child in self.childList():
f = child.find(childName)
if f!=None:
return f
return None
[docs] def parent(self, childName):
"""
Return the parent of the child in the tree.
PARAMETERS :
childName : the name of the child to find the parent
RETURNS :
the parent, or 'None' if not found
"""
nbChild = self.childNumber()+1
for i in range(1,nbChild):
if self.root[i].name() == str(childName):
return self
for child in self.childList():
parent = child.parent(childName)
if parent!=None:
return parent
return None
[docs] def getLine(self, childName):
"""
Extract the line of parents from root to child.
PARAMETERS :
childName : the name of the child to extract the line
RETURNS :
a list of name, from root to child, or [] if not found
"""
name = self.name()
if name == str(childName):
return [name]
for child in self.childList():
line = child.getLine(childName)
if line!=[]:
return [name] + line
return []
def __str__(self):
"""
Return a printable string representing the tree.
This is only a convinience mask for 'self.str2()'.
"""
return "*" + self.str2(1)
[docs] def str2(self, indent):
"""
Return a printable string representing the tree.
PARAMETERS :
indent : the number of space to indent the tree string
"""
result = "-> " + self.name() + "\n"
newIndent = indent+3
for subTree in self.childList():
result += newIndent * " " + subTree.str2(newIndent)
return result
[docs] def html(self, fileName, openMode="w"):
"""
Similar to str, but in a HTML file .
"""
ffile = open(fileName, openMode)
self.htmlTable(ffile)
ffile.close()
[docs] def htmlTable(self, ffile):
"""
Create table here.
"""
ffile.write("<table width=100%>\n")
name = self.name()
nb = self.childNumber()
if nb <= 0:
ffile.write("<tr><td bgcolor=skyblue><center><b>%s</b></center></td></tr>\n" %name)
else:
ffile.write("<tr><td colspan=%d bgcolor=skyblue><center><b>%s</b></center></td></tr>\n" %(nb, name))
for child in self.childList():
ffile.write("<td valign=top>\n")
child.htmlTable(ffile)
ffile.write("</td>\n")
ffile.write("</table>\n")
if __name__ == "__main__":
import Object3DQt as qt
import Object3DBase
app = qt.QApplication([])
o0 = Object3DBase.Object3D("DummyObject0")
o1 = Object3DBase.Object3D("DummyObject1")
o01 = Object3DBase.Object3D("DummyObject01")
w = ObjectTree('__Scene__', name='root')
t0=w.addChild(o0)
t1=w.addChild(o1)
if 0:
t0.addChild(o01)
else:
#append DummyObject01 to DummyObject0'
tree = w.find("DummyObject0")
tree.addChild(o01)
print(w)
print("LIST")
print(w.getList())
print("Now I am going to paste DummyObject0 into DummyObject1")
t0 = w.find("DummyObject0")
w.delChild("DummyObject0")
t1=w.find("DummyObject1")
t1.addChildTree(t0)
print(w)
print("LIST")
print(w.getList())