import poser, Numeric import os, tkFileDialog, gzip from Tkinter import * scene = poser.Scene() """ This script will do batch import of .obj and/or .obz files. """ def import_objs(centered,floor,usefigsize,useoffset,weldverts,pnorms,flipn,flipu,flipv,figsize,offX,offY,offZ): """ """ if not usefigsize: figsize = -1 if not useoffset: offZ = 0.0 offY = 0.0 offX = 0.0 imExObject = scene.ImExporter() options = imExObject.ImportOptions("obj", None) options[poser.kImOptCodeMAKEPOLYNORMSCONSISTENT] = pnorms options[poser.kImOptCodeOFFSETZ] = offZ options[poser.kImOptCodeOFFSETY] = offY options[poser.kImOptCodeOFFSETX] = offX options[poser.kImOptCodeFLIPUTEXTCOORDS] = flipu options[poser.kImOptCodeWELDIDENTICALVERTS] = weldverts options[poser.kImOptCodeCENTERED] = centered options[poser.kImOptCodePERCENTFIGSIZE] = figsize options[poser.kImOptCodeFLIPVTEXTCOORDS] = flipv options[poser.kImOptCodeFLIPNORMS] = flipn options[poser.kImOptCodePLACEONFLOOR] = floor #options[poser.kImOptCodeAUTOSCALE]=0 # ??? Not sure what this does, but Ockham uses it with .obj in Loader.... init = "Untitled.obj" types = [(".obj files", "*.obj *.OBJ *.obz *.OBZ")] indir = os.path.dirname(poser.AppLocation()) paths = tkFileDialog.askopenfilenames(initialdir=indir,initialfile=init,filetypes=types) if paths: for path in paths: path,file_added = gzip_data(path) # Unzip a copy for .obz. Read the copy and delete it after import. if path: imExObject.Import('obj', 'File Format Wavefront', path, options) if file_added: os.remove(path) def gzip_data(dataPath,replace=0,newext=".obj"): """ Compress or decompress file, with option to replace. """ try: compressed = check_gzip(dataPath) if compressed: f = gzip.GzipFile(dataPath) else: return dataPath,0 g = f.read() f.close() dataPath = os.path.splitext(dataPath)[0] dataPath += newext if not replace: dataPath = protect_naming(dataPath) if compressed: f = open(dataPath,"w") else: f = gzip.GzipFile(dataPath,"wb") f.write(g) f.close() return dataPath,1 except: print "gzip_data() error: could not process selected file." return "",0 def check_gzip(dataPath): f = open(dataPath,"rb") magic = f.read(2) f.close() if magic == '\037\213': return 1 else: return 0 def protect_naming(path): folder = os.path.dirname(path) filename = os.path.basename(path) name,ext = filename.split(".") if os.path.exists(path): num = 0 newname = "%s_%s.%s" %(name,num,ext) while os.path.exists(os.path.join(folder,newname)): num += 1 newname = "%s_%s.%s" %(name,num,ext) return os.path.join(folder,newname) else: return path root = Tk() class App: def __init__(self, master): self.master = master master.title("Obj Alternate Import-Export") self.center = IntVar() self.center.set(0) self.floor = IntVar() self.floor.set(0) self.usefigsz = IntVar() self.usefigsz.set(0) self.useoff = IntVar() self.useoff.set(0) self.weld = IntVar() self.weld.set(0) self.polynorms = IntVar() self.polynorms.set(1) self.flipnorms = IntVar() self.flipnorms.set(0) self.flipu = IntVar() self.flipu.set(0) self.flipv = IntVar() self.flipv.set(0) self.masterFrame = Frame(self.master) self.masterFrame.grid(row=0,column=0) self.mixFrame = Frame(self.masterFrame,borderwidth=2,relief=RIDGE) self.mixFrame.grid(row=1,column=3) self.buttonFrame = Frame(self.mixFrame,borderwidth=2) self.buttonFrame.grid(row=2,column=0) self.quitFrame = Frame(self.mixFrame,borderwidth=3) self.quitFrame.grid(row=3,column=0) self.checkFrame = Frame(self.mixFrame,borderwidth=2) self.checkFrame.grid(row=1,column=0) self.figszFrame = Frame(self.checkFrame) self.figszFrame.grid(row=2,column=1, sticky = W) self.offFrame = Frame(self.checkFrame) self.offFrame.grid(row=3,column=1) # --- Checkboxes --- # Note to self: anchor works with pack. For grid, use sticky. self.centerCk = Checkbutton(self.checkFrame,text="Centered",variable=self.center) self.centerCk.grid(row = 0, column = 0, sticky = W) self.floorCk = Checkbutton(self.checkFrame,text="Place on floor", variable=self.floor) self.floorCk.grid(row = 1, column = 0, sticky = W) self.figszCk = Checkbutton(self.checkFrame,text="Percent standard figure size", variable=self.usefigsz) self.figszCk.grid(row = 2, column = 0, sticky = W) self.offCk = Checkbutton(self.checkFrame,text="Offset (X,Y,Z)", variable=self.useoff) self.offCk.grid(row = 3, column = 0, sticky = W) self.weldCk = Checkbutton(self.checkFrame,text="Weld identical vertices", variable=self.weld) self.weldCk.grid(row = 4, column = 0, sticky = W) self.pnormCk = Checkbutton(self.checkFrame,text="Make polygon normals consistent", variable=self.polynorms) self.pnormCk.grid(row = 5, column = 0, sticky = W) self.fnormCk = Checkbutton(self.checkFrame,text="Flip normals", variable=self.flipnorms) self.fnormCk.grid(row = 6, column = 0, sticky = W) self.flipuCk = Checkbutton(self.checkFrame,text="Flip U Texture Coordinates", variable=self.flipu) self.flipuCk.grid(row = 7, column = 0, sticky = W) self.flipvCk = Checkbutton(self.checkFrame,text="Flip V Texture Coordinates", variable=self.flipv) self.flipvCk.grid(row = 8, column = 0, sticky = W) # --- Entries --- self.figszE = Entry(self.figszFrame,width=5) self.figszE.insert(0,"0.0") self.figszE.grid(row=0,column=0, sticky = W) self.offxE = Entry(self.offFrame,width=5) self.offxE.insert(0,"0.0") self.offxE.grid(row=0,column=0) self.offyE = Entry(self.offFrame,width=5) self.offyE.insert(0,"0.0") self.offyE.grid(row=0,column=1) self.offzE = Entry(self.offFrame,width=5) self.offzE.insert(0,"0.0") self.offzE.grid(row=0,column=2) # --- Buttons --- self.buttonRun = Button(self.quitFrame, text="Select File(s)", command=self.handleRun) self.buttonRun.grid(row=1, column=1) self.buttonQuit = Button(self.quitFrame, text="Cancel", command=self.die) self.buttonQuit.grid(row=1, column=2) def die(self): """Ends the script""" root.destroy() root.quit() def handleRun(self): centered = self.center.get() floor = self.floor.get() usefigsize = self.usefigsz.get() useoffset = self.useoff.get() weldverts = self.weld.get() pnorms = self.polynorms.get() flipn = self.flipnorms.get() flipu = self.flipu.get() flipv = self.flipv.get() try: figsize = float(self.figszE.get()) except ValueError: figsize = 100.0 try: offX = float(self.offxE.get()) except ValueError: offX = 0.0 try: offY = float(self.offyE.get()) except ValueError: offY = 0.0 try: offZ = float(self.offzE.get()) except ValueError: offZ = 0.0 import_objs(centered,floor,usefigsize,useoffset,weldverts,pnorms,flipn,flipu,flipv,figsize,offX,offY,offZ) self.die() app = App(root) root.mainloop()