From 8e928dc26562231ee3bd8f8a8b616c14045a6bdf Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 9 Aug 2013 19:36:25 -0300 Subject: [PATCH] Spreadsheet: Added a spreadsheet controller object --- src/Mod/Spreadsheet/InitGui.py | 2 +- src/Mod/Spreadsheet/Resources/Spreadsheet.qrc | 1 + .../Resources/icons/SpreadsheetController.svg | 163 +++++++++++++++ src/Mod/Spreadsheet/Spreadsheet.py | 191 ++++++++++++++++-- src/Mod/Spreadsheet/Spreadsheet_rc.py | 115 ++++++++++- 5 files changed, 456 insertions(+), 16 deletions(-) create mode 100644 src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg diff --git a/src/Mod/Spreadsheet/InitGui.py b/src/Mod/Spreadsheet/InitGui.py index e1fe47404..7bd9f8109 100644 --- a/src/Mod/Spreadsheet/InitGui.py +++ b/src/Mod/Spreadsheet/InitGui.py @@ -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") diff --git a/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc index 25f5d71c7..1ef25a0d4 100644 --- a/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc +++ b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc @@ -1,5 +1,6 @@ icons/Spreadsheet.svg + icons/SpreadsheetController.svg diff --git a/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg b/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg new file mode 100644 index 000000000..b0170884b --- /dev/null +++ b/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Spreadsheet/Spreadsheet.py b/src/Mod/Spreadsheet/Spreadsheet.py index e40444cea..43b38a6b4 100644 --- a/src/Mod/Spreadsheet/Spreadsheet.py +++ b/src/Mod/Spreadsheet/Spreadsheet.py @@ -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()) diff --git a/src/Mod/Spreadsheet/Spreadsheet_rc.py b/src/Mod/Spreadsheet/Spreadsheet_rc.py index dc6f7456e..fa794a071 100644 --- a/src/Mod/Spreadsheet/Spreadsheet_rc.py +++ b/src/Mod/Spreadsheet/Spreadsheet_rc.py @@ -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():