The latest version of this document can be found at www.broad.ology.org.uk/amiga/proaction/ExportAs.html
1: #!python 2: # 3: #************************************************************ 4: #** 5: #** Created by: CodeBench 0.27 (07.09.2012) 6: #** 7: #** Project: SketchBlock 8: #** 9: #** File: ExportAs.py 10: #** 11: #** Date: 12-09-2012 01:26:36 12: #** 13: #************************************************************ 14: # 15: #*/ 16: 17: # Export Files to any format via PIL 18: 19: import sys 20: import os 21: import arexx 22: import tempfile 23: 24: try: 25: from PIL import Image 26: except ImportError: 27: havepil = False 28: formats = ['ILBM'] 29: else: 30: havepil = True 31: Image.init() 32: formats = Image.SAVE.keys() 33: formats.sort() 34: try: 35: formats.remove('BUFR') 36: except: 37: pass 38: try: 39: formats.remove('FITS') 40: except: 41: pass 42: try: 43: formats.remove('GRIB') 44: except: 45: pass 46: try: 47: formats.remove('HDF5') 48: except: 49: pass 50: try: 51: formats.remove('WMF') 52: except: 53: pass 54: 55: 56: def saveJPEG(im, savepath): 57: im.save(savepath, format="JPEG", quality=95,optimise=1) 58: 59: def saveBMP(im, savepath): 60: im2 = im.convert('RGB') 61: im2.save(savepath, format="BMP") 62: del im2 63: 64: def saveEPS(im, savepath): 65: im2 = im.convert('RGB') 66: im2.save(savepath, format="EPS") 67: del im2 68: 69: def saveMSP(im, savepath): 70: im2 = im.convert('1') 71: im2.save(savepath, format="MSP") 72: del im2 73: 74: def savePALM(im, savepath): 75: im2 = im.convert('P') 76: im2.save(savepath, format="PALM") 77: del im2 78: 79: def savePCX(im, savepath): 80: im2 = im.convert('RGB') 81: im2.save(savepath, format="PCX") 82: del im2 83: 84: def savePDF(im, savepath): 85: im2 = im.convert('RGB') 86: im2.save(savepath, format="PDF") 87: del im2 88: 89: def saveXBM(im, savepath): 90: im2 = im.convert('1') 91: im2.save(savepath, format="XBM") 92: del im2 93: 94: # Makes a ChooserNode list from a list of strings 95: 96: def MakeCNList(guikey, *strings): 97: 98: # Create our list object. 99: 100: (rc,rc2,cnlist) = arexx.dorexx("PROACTION","NEWGUIOBJECT GUIID " + guikey + " OBJECTTYPE "GUIOBJ_List"") 101: concstrings = [] 102: if rc == 0: 103: for string in strings: 104: if not isinstance(string,list): 105: concstrings.append(string) 106: else: 107: concstrings.extend(string) 108: for string in concstrings: 109: # Create a node for each string. 110: 111: cntags = "" 112: cntags += "CNA_Text," + str(string) + "," 113: cntags += "TAG_DONE" 114: (rc,rc2,cn) = arexx.dorexx("PROACTION","ALLOCCHOOSERNODE GUIID " + guikey + " TAGSTRING "" + cntags + """) 115: # Add to list. 116: if rc == 0: 117: arexx.dorexx("PROACTION", "ADDTAIL GUIID " + guikey + " LISTID " + cnlist + " NODEID " + cn ) 118: return cnlist 119: 120: def FreeCNList(guikey, cnlist): 121: 122: # Remove eac node in turn and free. 123: 124: (rc, rc2, cn) = arexx.dorexx("PROACTION","REMTAIL GUIID " + guikey + " LISTID " + cnlist) 125: while rc == 0: 126: arexx.dorexx("PROACTION","FREECHOOSERNODE GUIID " + guikey + " NODEID " + cn) 127: (rc, rc2, cn) = arexx.dorexx("PROACTION","REMTAIL GUIID " + guikey + " LISTID " + cnlist) 128: 129: 130: def HandleInput(pyport,guikey): 131: 132: global save_gid 133: global cancel_gid 134: global getfile_gid 135: 136: result = None 137: die = 0 138: while die == 0: 139: pyport.wait() 140: msg = pyport.getmsg() 141: if msg: 142: cmd = msg.msg 143: msg.reply() 144: if cmd == "QUIT": 145: die = 1 146: break 147: elif cmd[:5] == "CLOSE": 148: die = 1 149: break 150: elif cmd[:8] == "GADGETUP": 151: # format is 152: # GADGETUP GUIID guikey GADGETID gid CODE code 153: (dummy,dummy,lguikey,dummy,gid,dummy,code) = cmd.split() 154: if gid == save_gid: 155: result = save_gid 156: die = 1 157: break 158: elif gid == cancel_gid: 159: die = 1 160: break 161: elif gid == getfile_gid: 162: (rc,rc2,chosen) = arexx.dorexx("PROACTION","REQUESTFILE GUIID " + guikey + " OBJECTID " + getfile_gid) 163: 164: 165: return result 166: 167: def saveFORMAT(savename,savepath): 168: if savename == 'ILBM': 169: (rc,rc2,dummy) = arexx.dorexx("SKETCHBLOCK","EXPORT FILE "" + savepath + """) 170: else: 171: (handle, temppath ) = tempfile.mkstemp() 172: if handle: 173: os.close(handle) 174: (rc,rc2,dummy) = arexx.dorexx("SKETCHBLOCK","EXPORT FILE "" + temppath + """) 175: im = Image.open(temppath) 176: if im: 177: if savename=="JPEG": 178: saveJPEG(im,savepath) 179: elif savename=="BMP": 180: saveBMP(im,savepath) 181: elif savename=="EPS": 182: saveEPS(im,savepath) 183: elif savename=="MSP": 184: saveMSP(im,savepath) 185: elif savename=="PALM": 186: savePALM(im,savepath) 187: elif savename=="PCX": 188: savePCX(im,savepath) 189: elif savename=="PDF": 190: savePDF(im,savepath) 191: elif savename=="XBM": 192: saveXBM(im,savepath) 193: else: 194: im.save(savepath, format=savename) 195: del im 196: os.unlink(temppath) 197: 198: # DoGUI does all the work for the GUI 199: 200: def DoGUI(pubscreen): 201: 202: global save_gid 203: global cancel_gid 204: global getfile_gid 205: 206: # Setup The ARexx Port for our script 207: # 208: pyport = arexx.Port("EXPORTAS") 209: if pyport: 210: 211: # First we'll build our window.class tagslist 212: # Python can't use send StemVars at the moment so we'll 213: # use the TAGSTRING tecnique throughout. 214: 215: wintags = "" 216: wintags += "WA_Width,100," 217: wintags += "WA_Height,100," 218: wintags += "WA_DragBar,1," 219: wintags += "WA_DepthGadget,1," 220: wintags += "WA_SizeGadget,1," 221: wintags += "WA_CloseGadget,1," 222: wintags += "WA_Title,Export As ...," 223: wintags += "WA_PubScreenFallBack,1," 224: wintags += "WA_PubScreenName," + pubscreen + "," 225: wintags += "WINDOW_Position,WPOS_CENTERSCREEN," 226: wintags += "WA_Activate,1," 227: wintags += "TAG_DONE" 228: 229: layouttags = "" 230: layouttags += "LAYOUT_Orientation,LAYOUT_ORIENT_VERT," 231: layouttags += "TAG_DONE" 232: 233: 234: savelayouttags = "" 235: savelayouttags += "LAYOUT_Orientation,LAYOUT_ORIENT_HORIZ," 236: savelayouttags += "TAG_DONE" 237: 238: getFileTags = "" 239: getFileTags += "GETFILE_TitleText,Select Destination," 240: getFileTags += "GETFILE_DoSaveMode,1," 241: getFileTags += "GA_RelVerify,1," 242: getFileTags += "GETFILE_ReadOnly,1," 243: getFileTags += "GETFILE_DoMultiSelect,0," 244: getFileTags += "TAG_DONE" 245: 246: (rc,rc2,guikey) = arexx.dorexx("PROACTION","CREATEGUI PORTNAME "EXPORTAS" TAGSTRING "" + wintags + """) 247: 248: if rc == 0: 249: (rc,rc2,current_layout_gid) = arexx.dorexx("PROACTION","ADDLAYOUT GUIID " + guikey + " TAGSTRING "" + layouttags + """) 250: 251: cnlist = MakeCNList(guikey,formats) 252: if (cnlist != None): 253: (rc,rc2,savetype_gid) = arexx.dorexx("PROACTION","ADDGADGET GUIID " + guikey + " GADGETCLASS "chooser.gadget" TAGSTRING "CHOOSER_Labels," + cnlist + ",CHOOSER_MaxLabels," + str(len(formats)) + ",GA_Disabled,0,TAG_DONE"") 254: 255: (rc,rc2,getfile_gid) = arexx.dorexx("PROACTION","ADDGADGET GUIID " + guikey + " GADGETCLASS "getfile.gadget" TAGSTRING "" + getFileTags + """) 256: 257: (rc,rc2,save_layout_gid) = arexx.dorexx("PROACTION","ADDLAYOUT GUIID " + guikey + " TAGSTRING "" + savelayouttags + """) 258: 259: (rc,rc2,save_gid) = arexx.dorexx("PROACTION","ADDGADGET GUIID " + guikey + " GADGETCLASS "button.gadget" TAGSTRING "GA_Text,Export,GA_RelVerify,1,TAG_DONE"") 260: (rc,rc2,dummy) = arexx.dorexx("PROACTION","SETATTRS GUIID " + guikey + " OBJECTID " + save_layout_gid + " TAGSTRING "LAYOUT_ModifyChild," + save_gid + ",CHILD_WeightedWidth,0,TAG_DONE"") 261: (rc,rc2,cancel_gid) = arexx.dorexx("PROACTION","ADDGADGET GUIID " + guikey + " GADGETCLASS "button.gadget" TAGSTRING "GA_Text,Cancel,GA_RelVerify,1,TAG_DONE"") 262: (rc,rc2,dummy) = arexx.dorexx("PROACTION","SETATTRS GUIID " + guikey + " OBJECTID " + save_layout_gid + " TAGSTRING "LAYOUT_ModifyChild," + cancel_gid + ",CHILD_WeightedWidth,0,TAG_DONE"") 263: 264: # End of Save / Cancel layout. 265: (rc,rc2,current_layout_gid) = arexx.dorexx("PROACTION","ENDLAYOUT GUIID " + guikey ) 266: 267: (rc,rc2,dummy) = arexx.dorexx("PROACTION","SETATTRS GUIID " + guikey + " OBJECTID " + current_layout_gid + " TAGSTRING "LAYOUT_ModifyChild," + save_layout_gid + ",CHILD_WeightedHeight,0,TAG_DONE"") 268: 269: # End of top level layout. 270: (rc,rc2,current_layout_gid) = arexx.dorexx("PROACTION","ENDLAYOUT GUIID " + guikey ) 271: arexx.dorexx("SKETCHBLOCK","SETAPPLICATIONBUSY") 272: 273: (rc,rc2,result) = arexx.dorexx("PROACTION","OPENGUIWINDOW GUIID " + guikey) 274: 275: if HandleInput(pyport,guikey) == save_gid: 276: # Do Save 277: # Get attributes 278: (rc,rc2,savetype) = arexx.dorexx("PROACTION","GETATTR GUIID " + guikey + " OBJECTID " + savetype_gid + " TAGNAME "CHOOSER_Selected"") 279: savename = formats[int(savetype)] 280: file = "" 281: drawer = "" 282: (rc,rc2,file) = arexx.dorexx("PROACTION","GETATTR GUIID " + guikey + " OBJECTID " + getfile_gid + " TAGNAME "GETFILE_File"") 283: (rc,rc2,drawer) = arexx.dorexx("PROACTION","GETATTR GUIID " + guikey + " OBJECTID " + getfile_gid + " TAGNAME "GETFILE_Drawer"") 284: if file == "": 285: (rc,rc2,chosen) = arexx.dorexx("PROACTION","REQUESTFILE GUIID " + guikey + " OBJECTID " + getfile_gid) 286: if chosen == "1": 287: (rc,rc2,file) = arexx.dorexx("PROACTION","GETATTR GUIID " + guikey + " OBJECTID " + getfile_gid + " TAGNAME "GETFILE_File"") 288: (rc,rc2,drawer) = arexx.dorexx("PROACTION","GETATTR GUIID " + guikey + " OBJECTID " + getfile_gid + " TAGNAME "GETFILE_Drawer"") 289: if file != "": 290: savepath = os.path.join(drawer,file) 291: 292: saveFORMAT(savename,savepath) 293: 294: arexx.dorexx("PROACTION","CLOSEGUIWINDOW GUIID " + guikey) 295: arexx.dorexx("SKETCHBLOCK","UNSETAPPLICATIONBUSY") 296: if(cnlist != None): 297: FreeCNList(guikey,cnlist) 298: 299: arexx.dorexx("PROACTION","DESTROYGUI GUIID " + guikey) 300: else: 301: os.system('RequestChoice "SaveAsBrush.py" "Couldn't Create ARexx Port" "OK"') 302: exit() 303: 304: # First we need to check if ProAction is runing and start it if not. 305: # The python ARexx module lacks a ShowPorts function 306: # Borrow it from ARexx 307: if len(sys.argv) == 3: 308: saveFORMAT(sys.argv[1],sys.argv[2]) 309: exit() 310: 311: (rc,rc2,ports) = arexx.dorexx("REXX","return show('P')") 312: 313: if rc == 0: 314: if -1 == ports.find("PROACTION"): 315: # No ProAction start it 316: os.system("RUN >"T:proactionpid" APPDIR:PROACTION") 317: os.system("C:WaitForPort PROACTION") 318: # Now check again 319: (rc,rc2,ports) = arexx.dorexx("REXX","return show('P')") 320: if rc == 0: 321: if -1 == ports.find("PROACTION"): 322: # Still not there :-( 323: os.system('RequestChoice "SaveAsBrush.py" "Unable To Start ProAction GUIServer" "OK"') 324: exit() 325: else: 326: os.system('RequestChoice "SaveAsBrush.py" "Couldn't Find ARexx!" "OK"') 327: exit(); 328: 329: # Okay we should be good to go now 330: 331: # Before calling DoGUI() we need to get the sketcblock public screen 332: 333: (rc,rc2,pubscreen) = arexx.dorexx("SKETCHBLOCK","GETAPPLICATIONINFO ATTR SCREENNAME") 334: if rc == 0: 335: DoGUI(pubscreen) 336: 337: