Spreadsheet: Added a spreadsheet controller object

This commit is contained in:
Yorik van Havre 2013-08-09 19:36:25 -03:00
parent 9357683aef
commit 8e928dc265
5 changed files with 456 additions and 16 deletions

View File

@ -54,7 +54,7 @@ class SpreadsheetWorkbench(Workbench):
def Initialize(self):
import Spreadsheet,Spreadsheet_rc
from DraftTools import translate
commands = ["Spreadsheet_Create"]
commands = ["Spreadsheet_Create","Spreadsheet_Controller"]
self.appendToolbar(str(translate("Spreadsheet","Spreadsheet tools")),commands)
self.appendMenu(str(translate("Spreadsheet","&Spreadsheet")),commands)
FreeCADGui.addIconPath(":/icons")

View File

@ -1,5 +1,6 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>icons/Spreadsheet.svg</file>
<file>icons/SpreadsheetController.svg</file>
</qresource>
</RCC>

View File

@ -0,0 +1,163 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2860"
sodipodi:version="0.32"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Spreadsheet.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs2862">
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3692"
cx="45.883327"
cy="28.869568"
fx="45.883327"
fy="28.869568"
r="19.467436"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3703"
gradientUnits="userSpaceOnUse"
cx="135.38333"
cy="97.369568"
fx="135.38333"
fy="97.369568"
r="19.467436"
gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3705"
gradientUnits="userSpaceOnUse"
cx="148.88333"
cy="81.869568"
fx="148.88333"
fy="81.869568"
r="19.467436"
gradientTransform="matrix(1.3852588,-0.05136783,0.03705629,0.9993132,-60.392403,7.7040438)" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective2868" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.5"
inkscape:cx="41.681621"
inkscape:cy="31.877347"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata2865">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3002"
width="56.18182"
height="46.545456"
x="4"
y="9.272728" />
<rect
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect3002-9"
width="56.18182"
height="46.545456"
x="4"
y="9.272728" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 4,20.545455 55.636364,0"
id="path3790"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 20.909091,9.6363636 20.909091,56"
id="path3792"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 2.6293007,32.429811 17.3343733,0"
id="path3794"
inkscape:connector-curvature="0" />
<rect
style="color:#000000;fill:#ff0000;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-opacity:0.41145834"
id="rect3771"
width="39.090908"
height="23.90909"
x="21"
y="20.636364" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 4,44.483064 55.636364,0"
id="path3796"
inkscape:connector-curvature="0" />
<rect
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#d00000;stroke-width:6;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-linejoin:round"
id="rect3773"
width="39.545456"
height="24"
x="20.727272"
y="20.363636" />
<path
style="fill:none;stroke:#d00000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 22.010949,32.429811 37.710917,0"
id="path3794-0"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@ -194,7 +194,7 @@ class MathParser:
return float(strValue)
class Spreadsheet(object):
class Spreadsheet:
"""An object representing a spreadsheet. Can be used as a
FreeCAD object or as a standalone python object.
Cells of the spreadsheet can be got/set as arguments, as:
@ -203,14 +203,13 @@ class Spreadsheet(object):
print(myspreadsheet.a1)
myspreadsheet.a2 = "My text"
myspreadsheet.b1 = "=a1*3"
print(myspreadsheet.a3)
Functions usable in formulae are limited to the contents of
the math module."""
print(myspreadsheet.b1)
"""
def __init__(self,obj=None):
if obj:
obj.Proxy = self
obj.addProperty("App::PropertyLinkList","Controllers","Base","Cell controllers of this object")
self._cells = {} # this stores cell contents
self._relations = {} # this stores relations - currently not used
self.cols = [] # this stores filled columns
@ -221,7 +220,7 @@ class Spreadsheet(object):
return "Spreadsheet object containing " + str(len(self._cells)) + " cells"
def __setattr__(self, key, value):
if self.isKey(key.lower()):
if self.isKey(key):
key = key.lower()
if DEBUG: print "Setting key ",key," to value ",value
if (value == "") or (value == None):
@ -258,14 +257,19 @@ class Spreadsheet(object):
else:
return self._cells[key]
else:
return None
return self.__dict__.__getitem__(key)
def __getstate__(self):
self._cells["Type"] = self.Type
return self._cells
def __setstate__(self,state):
if state:
self._cells = state
# extracting Type
if "Type" in self._cells.keys():
self.Type = self._cells["Type"]
del self._cells["Type"]
# updating relation tables
self.rows = []
self.cols = []
@ -296,8 +300,8 @@ class Spreadsheet(object):
else:
self._relations[a] = [key]
def execute(self,obj=None):
pass
def execute(self,obj):
self.setControlledCells(obj)
def isFunction(self,key):
"isFunction(cell): returns True if the given cell or value is a function"
@ -396,7 +400,7 @@ class Spreadsheet(object):
result += str(self._cells[e])
else:
result += e
print "Evaluating ",result
if DEBUG: print "Evaluating ",result
try:
p = MathParser(result)
result = p.getValue()
@ -404,6 +408,21 @@ class Spreadsheet(object):
msg = ex.message
raise Exception(msg)
return result
def setControlledCells(self,obj):
"Fills the cells that are controlled by a controller"
if obj:
if hasattr(obj,"Controllers"):
for co in obj.Controllers:
co.Proxy.setCells(co,obj)
def getControlledCells(self,obj):
"returns a list of cells managed by controllers"
cells = []
if hasattr(obj,"Controllers"):
for c in obj.Controllers:
cells.extend(c.Proxy.getCells(c,obj))
return cells
class ViewProviderSpreadsheet(object):
@ -412,7 +431,10 @@ class ViewProviderSpreadsheet(object):
def getIcon(self):
import Spreadsheet_rc
return ":/icons/Spreadsheet.svg"
return ":/icons/Spreadsheet.svg"
def attach(self,vobj):
self.Object = vobj.Object
def setEdit(self,vobj,mode):
if hasattr(self,"editor"):
@ -424,6 +446,93 @@ class ViewProviderSpreadsheet(object):
def unsetEdit(self,vobj,mode):
return False
def claimChildren(self):
if hasattr(self,"Object"):
if hasattr(self.Object,"Controllers"):
return self.Object.Controllers
def __getstate__(self):
return None
def __setstate__(self,state):
return None
class SpreadsheetController:
"A spreadsheet cell controller object"
def __init__(self,obj):
obj.Proxy = self
self.Type = "SpreadsheetController"
obj.addProperty("App::PropertyLinkList","Objects","Base","The objects that are considered by this controller")
obj.addProperty("App::PropertyString","Prop","Base","The property to extract from each object")
obj.addProperty("App::PropertyString","BaseCell","Base","The starting cell of this controller")
obj.addProperty("App::PropertyEnumeration","Direction","Base","The cells direction of this controller")
obj.Direction = ["Horizontal","Vertical"]
def execute(self,obj):
pass
def __getstate__(self):
return self.Type
def __setstate__(self,state):
if state:
self.Type = state
def getCells(self,obj,spreadsheet):
"returns a list of cells controlled by this controller"
cells = []
if obj.Objects and obj.Prop and obj.BaseCell:
for i in range(len(obj.Objects)):
# get the correct cell key
c,r = spreadsheet.Proxy.splitKey(obj.BaseCell)
if obj.Direction == "Horizontal":
c = "abcdefghijklmnopqrstuvwxyz".index(c)
c += i
c = "abcdefghijklmnopqrstuvwxyz"[c]
else:
r = int(r) + i
cells.append(c+str(r))
return cells
def setCells(self,obj,spreadsheet):
"Fills the controlled cells of the given spreadsheet"
if obj.Objects and obj.Prop and obj.BaseCell:
for i in range(len(obj.Objects)):
# get the correct cell key
c,r = spreadsheet.Proxy.splitKey(obj.BaseCell)
if obj.Direction == "Horizontal":
c = "abcdefghijklmnopqrstuvwxyz".index(c)
c += i
c = "abcdefghijklmnopqrstuvwxyz"[c]
else:
r = int(r) + i
cell = c+str(r)
if DEBUG: print "auto setting cell ",cell
if spreadsheet.Proxy.isKey(cell):
# get the contents
args = obj.Prop.split(".")
value = obj.Objects[i]
for arg in args:
if hasattr(value,arg):
value = getattr(value,arg)
try:
setattr(spreadsheet.Proxy,cell,value)
if DEBUG: print "setting cell ",cell," to value ",value
except:
print "Error retrieving property "+obj.Prop+" from object "+obj.Objects[i].Name
class ViewProviderSpreadsheetController:
"A view provider for the spreadsheet cell controller"
def __init__(self,vobj):
vobj.Proxy = self
def getIcon(self):
import Spreadsheet_rc
return ":/icons/SpreadsheetController.svg"
class SpreadsheetView(QtGui.QWidget):
@ -471,11 +580,14 @@ class SpreadsheetView(QtGui.QWidget):
if self.spreadsheet.ViewObject:
if hasattr(self.spreadsheet.ViewObject.Proxy,"editor"):
del self.spreadsheet.ViewObject.Proxy.editor
FreeCADGui.ActiveDocument.resetEdit()
if FreeCADGui:
if FreeCADGui.ActiveDocument:
FreeCADGui.ActiveDocument.resetEdit()
def update(self):
"updates the cells with the contents of the spreadsheet"
if self.spreadsheet:
controlled = self.spreadsheet.Proxy.getControlledCells(self.spreadsheet)
for cell in self.spreadsheet.Proxy._cells.keys():
c,r = self.spreadsheet.Proxy.splitKey(cell)
c = "abcdefghijklmnopqrstuvwxyz".index(c)
@ -490,6 +602,10 @@ class SpreadsheetView(QtGui.QWidget):
self.table.item(r,c).setText(str(content))
else:
self.table.setItem(r,c,QtGui.QTableWidgetItem(str(content)))
if cell in controlled:
brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
brush.setStyle(QtCore.Qt.Dense6Pattern)
self.table.item(r,c).setBackground(brush)
def changeCell(self,r,c,value=None):
"changes the contens of a cell"
@ -550,13 +666,38 @@ class _Command_Spreadsheet_Create:
def Activated(self):
from DraftTools import translate
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Spreadsheet")))
FreeCAD.ActiveDocument.openTransaction(str(translate("Spreadsheet","Create Spreadsheet")))
FreeCADGui.doCommand("import Spreadsheet")
FreeCADGui.doCommand("Spreadsheet.makeSpreadsheet()")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Command_Spreadsheet_Controller:
"the Spreadsheet_Controller FreeCAD command"
def GetResources(self):
return {'Pixmap' : 'SpreadsheetController',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Spreadsheet_Controller","Add controller"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Spreadsheet_Controller","Adds a cell controller to a selected spreadsheet")}
def IsActive(self):
if FreeCADGui.Selection.getSelection():
return True
else:
return False
def Activated(self):
import Draft
if Draft.getType(FreeCADGui.Selection.getSelection()[0]) == "Spreadsheet":
from DraftTools import translate
n = FreeCADGui.Selection.getSelection()[0].Name
FreeCAD.ActiveDocument.openTransaction(str(translate("Spreadsheet","Add controller")))
FreeCADGui.doCommand("import Spreadsheet")
FreeCADGui.doCommand("Spreadsheet.makeSpreadsheetController(FreeCAD.ActiveDocument."+n+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
def makeSpreadsheet():
"makeSpreadsheet(): adds a spreadsheet object to the active document"
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","Spreadsheet")
@ -566,6 +707,29 @@ def makeSpreadsheet():
return obj
def makeSpreadsheetController(spreadsheet,cell=None,objects=None,prop=None,direction=None):
"""makeSpreadsheetController(spreadsheet,[cell,objects,prop,direction]): adds a
controller to the given spreadsheet. Call can be a starting cell such as "A5",
objects can be a list of objects, prop can be a property such as "Shape.Volume",
and direction can be "Horizontal" or "Vertical"."""
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","CellController")
SpreadsheetController(obj)
if FreeCAD.GuiUp:
ViewProviderSpreadsheetController(obj.ViewObject)
conts = spreadsheet.Controllers
conts.append(obj)
spreadsheet.Controllers = conts
if objects:
obj.Objects = objects
if cell:
obj.BaseCell = cell
if prop:
obj.Prop = prop
if direction:
obj.Direction = direction
return obj
def addSpreadsheetView(view):
"addSpreadsheetView(view): adds the given spreadsheet view to the FreeCAD MDI area"
if FreeCAD.GuiUp:
@ -579,3 +743,4 @@ def addSpreadsheetView(view):
FreeCADGui.addCommand('Spreadsheet_Create',_Command_Spreadsheet_Create())
FreeCADGui.addCommand('Spreadsheet_Controller',_Command_Spreadsheet_Controller())

View File

@ -2,7 +2,7 @@
# Resource object code
#
# Created: Fri Aug 2 17:09:28 2013
# Created: Tue Aug 6 17:48:51 2013
# by: The Resource Compiler for PyQt (Qt v4.8.4)
#
# WARNING! All changes made in this file will be lost!
@ -10,6 +10,111 @@
from PyQt4 import QtCore
qt_resource_data = "\
\x00\x00\x06\x62\
\x00\
\x00\x18\x53\x78\x9c\xe5\x57\xdb\x6e\xdb\x46\x10\x7d\xf7\x57\xb0\
\xcc\x4b\x82\x8a\xe4\x5e\x78\xb7\xa4\x3c\x34\x48\x11\xa0\x45\x81\
\x26\x41\x1f\x83\x15\xb9\x94\x58\x53\x24\xb1\x5c\x59\x92\xbf\xbe\
\xb3\xbc\x53\xa2\x13\x3b\x45\x90\x06\x95\x60\x8b\x3b\x33\x7b\x99\
\x33\x67\x66\x96\xcb\xd7\xa7\x7d\xa6\xdd\x73\x51\xa5\x45\xbe\xd2\
\xb1\x89\x74\x8d\xe7\x51\x11\xa7\xf9\x76\xa5\x7f\xfc\xf0\xd6\xf0\
\x75\xad\x92\x2c\x8f\x59\x56\xe4\x7c\xa5\xe7\x85\xfe\x7a\x7d\xb3\
\xfc\xc9\x30\xb4\x5f\x04\x67\x92\xc7\xda\x31\x95\x3b\xed\x5d\x7e\
\x57\x45\xac\xe4\xda\xcb\x9d\x94\x65\x68\x59\xc7\xe3\xd1\x4c\x5b\
\xa1\x59\x88\xad\xf5\x4a\x33\x8c\xf5\xcd\xcd\xb2\xba\xdf\xde\x68\
\x9a\x06\xfb\xe6\x55\x18\x47\x2b\xbd\x9d\x50\x1e\x44\x56\x1b\xc6\
\x91\xc5\x33\xbe\xe7\xb9\xac\x2c\x6c\x62\x4b\x1f\xcc\xa3\xc1\x3c\
\x52\xbb\xa7\xf7\x3c\x2a\xf6\xfb\x22\xaf\xea\x99\x79\xf5\x62\x64\
\x2c\xe2\xa4\xb7\x56\xa7\x39\xd2\xda\x08\x07\x41\x60\x21\x62\x11\
\x62\x80\x85\x51\x9d\x73\xc9\x4e\xc6\x74\x2a\x9c\x71\x6e\x2a\x41\
\x08\x59\xa0\x1b\x2c\x9f\x66\x15\x9e\x32\x80\xe2\xd1\xc3\xd4\xda\
\xf1\xee\x00\x7f\x09\x7f\xfd\x84\x4e\x60\x56\xc5\x41\x44\x3c\x81\
\x99\xdc\xcc\xb9\xb4\xde\x7c\x78\xd3\x2b\x0d\x64\xc6\x32\x1e\x2d\
\xd3\xa1\x3f\xd9\x77\x12\x92\x9c\xed\x79\x55\xb2\x88\x57\x56\x27\
\xaf\xe7\x1f\xd3\x58\xee\x56\xba\x6b\x97\xa7\x7a\xbc\xe3\xe9\x76\
\x27\x47\x82\x34\x5e\xe9\xe0\x21\xf1\x5d\x54\x8f\xbb\x33\x84\x3d\
\x93\x90\x49\x49\x63\xda\x2e\x3c\x56\xd9\xbe\x69\x6b\x22\x08\x68\
\x30\x9d\x1d\x17\x91\x3a\xd2\x4a\x7f\x5f\x42\x74\xe3\x6a\xc7\xb9\
\x34\x3b\x24\xfb\x85\x8a\x83\x2c\x0f\xf2\x13\x3f\x49\x9e\x37\x2b\
\x82\x2f\x23\xc7\x6a\xb5\x9a\x66\x4e\x9c\x1a\x91\x1c\xeb\x6b\x90\
\x2c\x63\x9e\x54\x4a\xd3\xf8\xa3\x46\xe0\x10\xa9\x75\xa0\x15\x2c\
\x4e\x59\xf6\xab\xfa\x01\x2a\x36\x76\xa3\x53\x44\x45\x96\xf1\x08\
\x40\x61\xd9\x91\x9d\x2b\xbd\x33\xa8\x83\x19\xee\x04\x07\xf2\xbd\
\x80\x67\xce\x44\xb7\x06\xa5\x9e\xd7\xdb\xa9\x2d\xa7\x5b\x50\x37\
\x20\xbd\x3a\x3a\xad\x74\xdb\x31\x7d\x9f\x52\x32\x4c\x8a\xce\x2b\
\x9d\xf8\xa6\xef\x06\x8e\xeb\xf7\xd2\x64\xd6\x36\x99\xb5\x15\xe0\
\x7f\x60\xda\xae\x67\x53\xb7\x17\x6e\xdb\x13\x7c\xcc\x53\x09\x94\
\x3e\x54\x5c\xbc\x57\xb4\xf8\x23\xff\x58\x71\x5d\xb3\xbe\x1b\x22\
\x1e\xa2\x4f\x3c\xe4\x18\x37\x4c\x1d\x93\x02\x18\x74\x82\x5b\xe0\
\x99\xf4\x1a\xb7\x6b\xdb\x64\xd6\xf6\xb3\xb8\x7d\x10\x2c\xaf\x20\
\x2b\xf7\x2b\x7d\xcf\xa4\x48\x4f\x2f\x91\x19\x80\xa5\xb3\x40\x26\
\x21\x0e\xa2\x5e\xb0\x80\xf4\xb4\x5d\x42\x31\x72\x16\xc4\x44\x08\
\xbb\x1e\xf1\x17\x2a\x11\x7c\xcf\x71\xec\x85\x81\x89\x67\x06\x01\
\xc4\xf0\xd5\x00\xf8\x14\xac\x31\x4e\x33\x30\xae\x5b\xfd\xb2\x92\
\x45\xd9\xd9\xb6\xa9\x0a\x12\xb0\x09\xf4\x41\x5c\x24\x49\xc5\x21\
\x56\x68\x24\xab\xe4\x39\xe3\x8d\xb5\x01\xc1\x2c\x44\xf8\x22\x61\
\x49\x42\x36\xb7\xb5\xa8\x00\xb4\x53\x79\x0e\xf1\x6d\x7f\xc2\xcf\
\xec\xe6\xe3\x99\xdd\xf0\x17\x76\x4b\x18\x43\xe8\xd1\xdd\x96\xd6\
\xd4\xed\xef\x48\x4b\xe7\x6b\x68\x09\xd1\xf6\xaf\x68\xe9\xe3\xb9\
\x74\xbe\xb6\x4d\x66\x6d\x9f\x49\x4b\x0c\x5c\x77\x88\xe3\xfb\x8a\
\x8e\xc8\xc1\xd4\xf5\x7c\x0a\x24\x45\xca\x25\x97\x04\xf0\x08\x0d\
\x89\x62\x4a\x16\x86\x0b\x25\x3c\x20\x36\xa2\x0b\xcf\xf4\x90\x8d\
\x6c\xea\x8f\xa8\xd9\xc3\x5b\x42\x59\x2d\x01\x5f\x68\xc5\xdd\xfe\
\x7d\x3d\x97\x67\xd5\x7d\xa6\xa6\x34\xd6\xaf\x42\x74\x5f\x7e\x02\
\x9f\x91\x16\x6a\x94\xc0\x3f\x3c\x6b\x71\x6e\x2c\x30\x74\x57\xf8\
\x41\xb3\x36\x0f\xaa\x47\x7d\x66\x99\xf6\x04\x46\x21\xd2\x6d\x0a\
\xad\xa0\xb6\x23\x80\x4a\xfd\x99\xce\x81\xb0\x8f\x7c\x83\xce\xe0\
\xb7\xde\x2f\x2d\xd5\x2a\xea\xa7\xde\x53\xd5\xb6\xe2\xfb\x94\x1f\
\x87\x7e\xb2\x61\x7d\xfc\x4b\xb6\xe5\x35\xc5\x81\x69\x49\xfd\x69\
\x15\x9b\x42\xc4\x5c\x74\x2a\xb7\xfe\x4c\x54\x6d\x16\x34\x37\xb3\
\x9b\x0b\x67\x60\xd5\x5e\x8f\xe6\xf5\xd5\x8e\xc5\xc5\x11\x1a\xc1\
\xa5\xf2\xa1\x28\x80\x16\x8e\xe9\x5c\x2a\xea\xc6\x83\x4d\xd7\xc7\
\x2e\xc1\x57\x4a\xd8\x89\x02\x09\x3d\x8f\xda\xde\x95\xf2\x20\x04\
\xb0\xce\xc8\xd8\x99\x83\x3b\xf5\x4f\xb7\x42\xb5\x2b\x8e\x5b\xa1\
\x60\x91\xe2\xc0\x2f\x67\x42\xdf\x3f\xa8\xfb\x9e\x71\x68\x92\xa8\
\xbd\x65\x8c\x2c\xd4\x5c\x63\xb3\x29\x4e\xf3\x0b\x1c\xd3\x1c\xdc\
\x34\xda\x7b\x0b\x0e\xc8\x15\x18\xad\x45\x77\x93\x81\x32\x4c\x1f\
\x31\x39\x0d\x45\xf1\x52\x75\x7e\x5c\xb5\x67\xa7\x74\x9f\x3e\xf0\
\x58\x15\xb9\x96\x27\x7b\x2e\x59\xcc\x24\x1b\x38\xd1\x49\x80\x4d\
\x4e\x7f\xcf\x88\x93\xf0\xcf\x37\x6f\xfb\x82\x1a\x45\xe1\x5f\x85\
\xb8\x1b\x0a\xa5\x32\x60\x1b\xb8\xd6\xac\xf4\xbe\xc8\xab\xdb\x4b\
\x14\xaa\xdc\x66\x72\x9d\xee\x21\xd2\xea\xc6\xf9\x33\x5c\xfc\x80\
\x9d\xbd\x62\x62\xac\x92\x71\x58\xb4\x59\x56\xf0\xe6\x46\x39\x7b\
\x09\x8f\xa3\x7d\xaa\x26\x59\xef\x65\x9a\x65\xef\xd4\x26\xa3\xc2\
\xdf\x2e\x9a\xca\x8c\xaf\xeb\x3d\x9b\xc7\xce\x0b\xab\x75\xa3\xab\
\xdc\x23\x2f\x97\x56\x07\x43\x3d\xda\x0e\xf0\x4c\x28\xd3\x23\x9c\
\xb1\x0d\xcf\x56\xfa\x6f\x4a\xa9\x5d\x69\xb7\xa2\x38\x94\xfb\x22\
\xe6\xed\xf4\x1e\x56\xc8\xdb\xbe\x20\x35\xad\xa6\xed\x32\xa8\xfe\
\xdc\x26\xe0\x54\xd8\xa6\x63\x3d\x18\xb5\x9c\x7a\x28\x0e\x19\x0f\
\xf3\x22\x7f\x80\x34\x84\x9e\x24\x8a\xbb\x7a\xc8\xdb\xe7\x86\x6d\
\xa1\xdd\x0d\x55\x0b\x81\x13\x85\x9b\x83\x94\x63\xd9\xdf\x45\x9a\
\x87\x70\xc8\x3c\xee\xa4\x00\x2b\x17\x19\xd0\x45\x0e\xb3\x87\xbd\
\x5b\x41\xcc\x20\x77\x85\x60\xe7\xc9\x9e\x4a\xda\x34\xd3\x10\xdd\
\xee\x99\xb8\xe3\xa2\xd1\xdf\xa7\x55\xba\x49\x33\xb5\x44\xfd\x98\
\xf1\xdb\x38\xad\x4a\x80\x04\xde\x03\xd4\x31\x6e\x0b\xb8\x00\x27\
\x59\x71\xec\xf5\x3c\x67\xf0\x63\x6c\x58\x74\xb7\xad\xcf\x17\xb2\
\x08\xf2\xf0\x90\xc1\x5b\xdd\xb4\xfb\x01\x94\x14\xa1\xe1\x72\xda\
\xe6\x99\xe3\x9a\xd8\xc7\xfe\x20\xef\xb2\xcb\x76\x4d\xc7\x86\xef\
\xd0\x92\x54\x51\xe9\x07\xea\x82\x65\x12\x0f\xbe\xfe\xe8\x72\xf9\
\xa4\x78\xd5\xbe\x3e\x35\x58\xdd\xcc\xff\x6b\xbc\x8c\xe0\x9b\x46\
\xac\x64\x72\x77\x11\xb1\x21\x46\xff\x3e\x04\x35\xea\x8f\xc2\x3d\
\x17\x93\x69\x08\xfa\xc3\xab\xba\xab\xd9\x0b\x82\x1a\x17\x1d\xcd\
\x71\x4c\x97\xc2\xd7\x5e\xa0\x69\xbb\x07\x87\xe0\x96\x3c\x73\xb5\
\x88\x8a\x1c\x4e\x2a\x0b\x61\x40\x93\xbb\x67\xf2\x20\xb8\x6a\x05\
\x3f\x22\x14\xbf\x6b\x00\x44\x80\xe0\x8b\x17\x41\x83\x03\x75\x47\
\xb2\x11\x05\x46\x98\x90\xff\x36\x26\x5f\x91\xa1\x53\x7a\x10\x13\
\x6e\xbf\x90\x33\xde\x82\x12\xd3\x26\x81\x8f\xb1\x86\xe1\x25\x90\
\xda\xd4\xa3\x74\x9e\x27\xf6\xf3\x31\x79\x72\x53\x1a\xa1\x32\xdb\
\x73\xbe\x61\x29\x99\x96\x57\x78\x6b\xc5\xd8\x76\x7c\x6a\x5f\x97\
\x18\xcf\xc3\x97\x05\x86\x06\xa6\xa2\x11\xf2\xaf\x2a\x0c\xa1\x0d\
\xc3\xc6\x05\x86\xe0\x71\x85\x01\x0e\x36\x69\xf9\x83\x72\xc8\x5e\
\xd8\x36\xbc\xce\x53\x04\xaf\x20\x5f\x28\x31\xee\xb7\xa2\xce\xf3\
\xfa\x63\x3c\x83\x9c\xfb\x4d\xb9\xf5\xf5\x35\x6c\xbe\x45\xcf\x91\
\x92\xce\x90\xf2\xa2\xb9\xf5\xa4\xb4\x27\x74\x44\xa6\x57\x37\xb9\
\x0b\x56\x36\x35\xf2\x99\xac\x9c\xc3\xf6\xbb\x54\x36\x62\x22\x8c\
\x02\x3b\x18\x55\x36\x0a\x6f\xf4\x20\xc3\xde\x23\x85\xcd\x78\x6e\
\x0b\x5c\x5a\xdb\xf5\xcd\x52\xbd\x82\xac\x6f\xfe\x01\x67\xd0\x48\
\x57\
\x00\x00\x05\xda\
\x00\
\x00\x14\x77\x78\x9c\xe5\x57\x59\x8f\xdb\x36\x10\x7e\xdf\x5f\xa1\
@ -113,6 +218,11 @@ qt_resource_name = "\
\x00\x6f\xa6\x53\
\x00\x69\
\x00\x63\x00\x6f\x00\x6e\x00\x73\
\x00\x19\
\x02\x18\xed\xa7\
\x00\x53\
\x00\x70\x00\x72\x00\x65\x00\x61\x00\x64\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x43\x00\x6f\x00\x6e\x00\x74\x00\x72\x00\x6f\
\x00\x6c\x00\x6c\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0f\
\x0a\xa9\x40\xe7\
\x00\x53\
@ -121,8 +231,9 @@ qt_resource_name = "\
qt_resource_struct = "\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x10\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x48\x00\x01\x00\x00\x00\x01\x00\x00\x06\x66\
"
def qInitResources():