diff --git a/src/Mod/Spreadsheet/Init.py b/src/Mod/Spreadsheet/Init.py new file mode 100644 index 000000000..7fb5be7a1 --- /dev/null +++ b/src/Mod/Spreadsheet/Init.py @@ -0,0 +1,31 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2013 - Yorik van Havre * +#* * +#* 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") + diff --git a/src/Mod/Spreadsheet/InitGui.py b/src/Mod/Spreadsheet/InitGui.py new file mode 100644 index 000000000..0295849f8 --- /dev/null +++ b/src/Mod/Spreadsheet/InitGui.py @@ -0,0 +1,25 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2013 - Yorik van Havre * +#* * +#* 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 + + diff --git a/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc new file mode 100644 index 000000000..25f5d71c7 --- /dev/null +++ b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc @@ -0,0 +1,5 @@ + + + icons/Spreadsheet.svg + + diff --git a/src/Mod/Spreadsheet/Resources/icons/Spreadsheet.svg b/src/Mod/Spreadsheet/Resources/icons/Spreadsheet.svg new file mode 100644 index 000000000..9249d108a --- /dev/null +++ b/src/Mod/Spreadsheet/Resources/icons/Spreadsheet.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/src/Mod/Spreadsheet/Spreadsheet.py b/src/Mod/Spreadsheet/Spreadsheet.py new file mode 100644 index 000000000..2feff25ed --- /dev/null +++ b/src/Mod/Spreadsheet/Spreadsheet.py @@ -0,0 +1,213 @@ +#*************************************************************************** +#* * +#* Copyright (c) 2013 - Yorik van Havre * +#* * +#* 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) diff --git a/src/Mod/Spreadsheet/Spreadsheet_rc.py b/src/Mod/Spreadsheet/Spreadsheet_rc.py new file mode 100644 index 000000000..dc6f7456e --- /dev/null +++ b/src/Mod/Spreadsheet/Spreadsheet_rc.py @@ -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()