Started spreadsheet module

This commit is contained in:
Yorik van Havre 2013-08-02 18:42:09 -03:00
parent 837ad096f2
commit 3a64a9db8a
6 changed files with 552 additions and 0 deletions

View File

@ -0,0 +1,31 @@
#***************************************************************************
#* *
#* Copyright (c) 2013 - Yorik van Havre <yorik@uncreated.net> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program 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 Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
# Get the Parameter Group of this module
ParGrp = App.ParamGet("System parameter:Modules").GetGroup("Spreadsheet")
# Set the needed information
ParGrp.SetString("HelpIndex","http://free-cad.sf.net")
# import types
#FreeCAD.addImportType("Spreadsheet data (*.csv)","importCSV")

View File

@ -0,0 +1,25 @@
#***************************************************************************
#* *
#* Copyright (c) 2013 - Yorik van Havre <yorik@uncreated.net> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program 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 Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import Spreadsheet_rc

View File

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

View File

@ -0,0 +1,144 @@
<?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="Part_Box.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="10.658514"
inkscape:cy="35.257738"
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 4,32.429811 55.090909,0"
id="path3794"
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 4,44.483064 55.636364,0"
id="path3796"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1,213 @@
#***************************************************************************
#* *
#* Copyright (c) 2013 - Yorik van Havre <yorik@uncreated.net> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program 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 Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import re, math
from PyQt4 import QtCore,QtGui
from DraftTools import translate
class Spreadsheet(object):
"A spreadsheet object"
def __init__(self):
self._cells = {}
# a list of safe functions to allow
safe_list = ['acos', 'asin', 'atan', 'atan2', 'ceil',
'cos', 'cosh', 'e', 'exp', 'fabs',
'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin',
'sinh', 'sqrt', 'tan', 'tanh']
self._tools = dict((k, getattr(math, k)) for k in safe_list)
# adding abs
self._tools["abs"] = abs
# removing all builtins from allowed functions
self._tools["__builtins__"] = None
self._relations = {}
self.cols = []
self.rows = []
def __repr__(self):
return "Spreadsheet object containing " + str(len(self._cells)) + " cells"
def allowedFunctions(self):
"returns a list of allowed functions in cells"
return self.tools.keys()
def __setattr__(self, key, value):
#print "setting key:",key," to value:",value
if self.isKey(key):
self._cells[key] = value
if value:
if self.isFunction(value):
self._updateDependencies(key,value)
c,r = splitKey(key)
if not c in self.cols:
self.cols.append(c)
self.cols.sort()
if not r in self.rows:
self.rows.append(r)
self.rows.sort()
else:
self.__dict__.__setitem__(key,value)
def __getattr__(self, key):
if key in self._cells:
if self.isFunction(self._cells[key]):
#print "result = ",self.getFunction(key)
return eval(self._format(key),self._tools,{"self":self})
else:
return self._cells[key]
else:
return None
def _format(self,key):
"formats all cellnames in the function a the given cell"
elts = re.split(r'(\W+)',self._cells[key][1:])
#print elts
result = ''
for e in elts:
if self.isKey(e):
result += "self."+e
else:
result += e
return result
def _updateDependencies(self,key,value):
"search for ancestors in the value and updates the table"
ancestors = []
for v in re.findall(r"[\w']+",value):
if self.isKey(v):
ancestors.append(v)
for a in ancestors:
if a in self._relations:
if not key in self._relations[a]:
self._relations[a].append(key)
else:
self._relations[a] = [key]
def isFunction(self,key):
"isFunction(cell): returns True if the given cell or value is a function"
if key in self._cells:
if str(self._cells[key])[0] == "=":
return True
elif str(key)[0] == "=":
return True
else:
return False
def isKey(self,value):
"isKey(val): returns True if the given value is a valid cell number"
al = False
nu = False
for v in value:
if not v.isalnum():
return False
elif not al:
if v.isalpha():
al = True
else:
return False
else:
if not nu:
# forbidden to set items at row 0
if v == "0":
return False
if v.isalpha():
if nu:
return False
elif v.isdigit():
nu = True
if not nu:
return False
return True
def splitKey(self,key):
"splitKey(cell): splits a key between column and row"
c = ''
r = ''
for ch in key:
if ch.isalpha():
c += ch
else:
r += ch
return c,r
def getFunction(self,key):
"getFunction(cell): returns the function contained in the given cell, instead of the value"
if key in self._cells:
return self._cells[key]
else:
return None
def getSize(self):
"getSize(): returns a tuple with number of columns and rows of this spreadsheet"
return (len(self.columns),len(self.rows))
def getCells(self,index):
"getCells(index): returns the cells from the given column of row number"
cells = {}
for k in self._cells.keys():
c,r = self.splitKey(k)
if index in [c,r]:
cells[k] = self._cells[k]
return cells
class SpreadsheetView(QtGui.QWidget):
"A spreadsheet viewer for FreeCAD"
def __init__(self):
QtGui.QWidget.__init__(self)
self.setWindowIcon(QtGui.QIcon(":/icons/Spreadsheet.svg"))
self.setWindowTitle(str(translate("Spreadsheet","Spreadsheet")))
self.setObjectName("Spreadsheet viewer")
self.verticalLayout = QtGui.QVBoxLayout(self)
self.table = QtGui.QTableWidget(30,26,self)
for i in range(26):
ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i]
self.table.setHorizontalHeaderItem(i, QtGui.QTableWidgetItem(ch))
self.verticalLayout.addWidget(self.table)
self.spreadsheet = None
QtCore.QObject.connect(self.table, QtCore.SIGNAL("cellChanged(int,int)"), self.changeCell)
def changeCell(self,r,c):
"changes the contens of a cell"
key = "abcdefghijklmnopqrstuvwxyz"[c]+str(r+1)
value = self.table.item(r,c).text()
print "Changing "+key+" to "+value
if self.spreadsheet:
setattr(self.spreadsheet,key,value)
def clear(self):
"clears the spreadsheet"
for r in range(self.table.columnCount):
for c in range(self.table.rowCount):
self.table.item(r,c).setText("")
def addSpreadsheetView(view):
"addSpreadsheetView(view): adds the given spreadsheet view to the FreeCAD MDI area"
import FreeCAD
if FreeCAD.GuiUp:
import FreeCADGui,Spreadsheet_rc
mdi = FreeCADGui.getMainWindow().findChild(QtGui.QMdiArea)
mdi.addSubWindow(view)

View File

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