#! python # -*- coding: utf-8 -*- # (c) 2010 Werner Mayer LGPL # FreeCAD Python script to work with the FCStd file format. import os,sys,string import xml.sax import xml.sax.handler import xml.sax.xmlreader import zipfile # SAX handler to parse the Document.xml class DocumentHandler(xml.sax.handler.ContentHandler): def __init__(self, dirname): self.files = [] self.dirname = dirname def startElement(self, name, attributes): item=attributes.get("file") if item != None: self.files.append(os.path.join(self.dirname,str(item))) def characters(self, data): return def endElement(self, name): return def extractDocument(filename, outpath): zfile=zipfile.ZipFile(filename) files=zfile.namelist() for i in files: data=zfile.read(i) dirs=i.split("/") if len(dirs) > 1: dirs.pop() curpath=outpath for j in dirs: curpath=curpath+"/"+j os.mkdir(curpath) output=open(outpath+"/"+i,'wb') output.write(data) output.close() def createDocument(filename, outpath): files=getFilesList(filename) compress=zipfile.ZipFile(outpath,'w',zipfile.ZIP_DEFLATED) for i in files: dirs=os.path.split(i) #print i, dirs[-1] compress.write(i,dirs[-1],zipfile.ZIP_DEFLATED) compress.close() def getFilesList(filename): dirname=os.path.dirname(filename) handler=DocumentHandler(dirname) parser=xml.sax.make_parser() parser.setContentHandler(handler) parser.parse(filename) files=[] files.append(filename) files.extend(iter(handler.files)) dirname=os.path.join(dirname,"GuiDocument.xml") if os.path.exists(dirname): files.append(dirname) return files