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: