1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import Tkinter, os
16 from Pmv.mvCommand import MVCommand
17 from ViewerFramework.VFCommand import CommandGUI
18
19 from mglutil.gui.InputForm.Tk.gui import InputFormDescr, InputForm
20
21 from mglutil.util.callback import CallBackFunction
22
23 from mglutil.gui.BasicWidgets.Tk.customizedWidgets import ListChooser
24
25 import Pmw
26
28
29 PovrayIncDir = '/mgl/apps/src/povray/povray31/include'
30
32 self.form = None
33 self.fileWritten = 0
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
63 self.form.destroy()
64 self.form = None
65
66
68
69 e1 = self.form.descr.entryByName['pigment']['widget']
70 prop = e1.get()
71 g = self.form.descr.entryByName['selectedGeometries']['widget']
72 geom = g.get()
73 if len(geom) and len(prop):
74
75 self.properties[geom[0][0]]['pigment'] = prop
76
77
79 e1 = self.form.descr.entryByName['finish']['widget']
80
81 prop = e1.get()
82 g = self.form.descr.entryByName['selectedGeometries']['widget']
83 geom = g.get()
84 if len(geom) and len(prop):
85
86 self.properties[geom[0][0]]['finish'] = prop
87
88
90 self.fileWritten = 0
91
92
93
94
95
96 w1 = self.form.descr.entryByName['pigment']['widget']
97 w2 = self.form.descr.entryByName['finish']['widget']
98 g = self.form.descr.entryByName['selectedGeometries']['widget']
99 w1.setentry(self.properties[g.get()[0]]['pigment'])
100 w2.setentry(self.properties[g.get()[0]]['finish'])
101
103 if not self.fileWritten:
104 self.writeFile()
105
106 fn = self.filename
107 c = self.vf.GUI.VIEWER.cameras[0]
108
109
110
111
112 bin = self.form.descr.entryByName['povrayBin']['widget'].get()
113 args = self.form.descr.entryByName['povrayArgs']['widget'].get()
114 s = float(self.form.descr.entryByName['scaleImage']['widget'].get())
115 outf = self.form.descr.entryByName['imageFile']['widget'].get()
116 cmd = '%s +L%s +W%d +H%d %s -I%s' % (bin, self.PovrayIncDir,
117 int(s*c.width),
118 int(s*c.height), args,
119 self.filename)
120 if outf!='':
121 cmd = '%s +O%s'%(cmd, outf)
122 print cmd
123
124 import thread
125 def renderIt(c, cmd):
126 os.system(cmd)
127
128 thread.start_new_thread( renderIt, (c,cmd) )
129
130
132 from DejaVu.povray3 import PovRay
133 p = PovRay()
134 vi = self.vf.GUI.VIEWER
135
136
137 wbg = self.form.descr.entryByName['wbg']['wcfg']['variable'].get()
138 if wbg==1:
139 col = vi.cameras[0].backgroundColor
140 vi.cameras[0].Set(color=(1.,1.,1.,1.), tagModified=False)
141
142
143 sl = float(self.form.descr.entryByName['scaleLight']['widget'].get())
144 br = float(self.form.descr.entryByName['bondRadius']['widget'].get())
145 p.addCamera(vi.cameras[0], sl)
146 if wbg==1: vi.cameras[0].Set(color=col, tagModified=False)
147
148
149 g = self.form.descr.entryByName['selectedGeometries']['widget']
150
151 geoms = g.get()
152 for ge in geoms:
153 p.addGeom(self.geomList[ge], self.properties[ge], br)
154
155
156
157 fw = self.form.descr.entryByName['fileName']['widget']
158 fn = fw.get()
159 if fn =='':
160 fn = self.vf.askFileSave(idir='.', ifile=None,
161 types=[('Povray', '*.pov'), ('all files', '*.*')],
162 title='Save Povray scene')
163
164 fw.setentry(fn)
165
166 if fn:
167 self.filename=fn
168 p.write(fn)
169 self.fileWritten = 1
170
171
173
174 if self.form: return
175 self.fileWritten = 0
176
177 inclist = os.listdir(self.PovrayIncDir)
178 inclist.sort()
179
180
181 self.geomList = {}
182 self.properties = {}
183 for m in self.vf.Mols:
184 for g in m.geomContainer.geoms.values():
185 if g.visible and g.__class__.__name__ != 'Geom':
186 name = '%s_%s'%(m.name,g.name)
187 self.geomList[name] = g
188 self.properties[name] = {'pigment':'',
189 'finish':'specular 1 roughness 0.001 ambient 0.3'}
190
191 for g in self.vf.GUI.VIEWER.rootObject.children:
192 if g.visible and g.__class__.__name__ != 'Geom':
193 name = g.name
194 self.geomList[name] = g
195 self.properties[name] = {'pigment':'',
196 'finish':'specular 1 roughness 0.001 ambient 0.3'}
197
198 idf = InputFormDescr(title ="PovRay")
199 incEntries = map(lambda x: (x,None),inclist)
200 idf.append({'name':'includes',
201 'widgetType':ListChooser,
202 'wcfg':{'entries': incEntries,
203 'title':'Select include files',
204 'mode':'extended',
205 'lbwcfg':{'height':5,'exportselection':0}},
206 'gridcfg':{'rowspan':4,'column':0,'row':0},
207 } )
208
209
210
211
212
213
214
215
216 geomsEntries = map(lambda x: (x,None),self.geomList.keys())
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249 idf.append({'name':'selectedGeometries',
250 'widgetType':ListChooser,
251 'wcfg':{'title':'Selected geometries',
252 'entries': geomsEntries,
253 'mode':'single',
254 'lbwcfg':{'height':5,'exportselection':0}},
255 'gridcfg':{'rowspan':4, 'column':3, 'row':0}})
256
257
258
259
260
261 idf.append({'widgetType':Pmw.EntryField,
262 'name':'pigment',
263 'wcfg':{'labelpos':'w',
264 'label_text':'Pigment ',
265 'validate':None,
266 'entry_width':40},
267 'gridcfg':{'columnspan':2, 'column':0,
268 'row':4, 'sticky':'w'}})
269
270
271
272
273
274 idf.append({'widgetType':Pmw.EntryField,
275 'name':'finish',
276 'wcfg':{'labelpos':'w',
277 'label_text':'Finish ',
278 'validate':None,
279 'entry_width':40},
280 'gridcfg':{'columnspan':2, 'column':0,
281 'row':5, 'sticky':'w'}})
282
283
284
285
286
287
288 idf.append({'name':'scaleLight',
289 'widgetType':Pmw.EntryField,
290 'type':float,
291 'wcfg':{'labelpos':'w',
292 'label_text':'Light scale factor',
293 'validate':'real',
294 'value':2.0,
295 'entry_width':5},
296 'gridcfg':{'column':3, 'row':4, 'sticky':'e'}})
297
298
299
300
301
302
303 idf.append({'name':'scaleImage',
304 'widgetType':Pmw.EntryField,
305 'type':float,
306 'wcfg':{'labelpos':'w',
307 'label_text':'scale Image',
308 'entry_width':5,
309 'validate':'real',
310 'value':1.0},
311 'gridcfg':{'column':3, 'row':5, 'sticky':'e'}})
312
313
314
315
316
317 idf.append({'name':'bondRadius',
318 'widgetType':Pmw.EntryField,
319 'type':float,
320 'wcfg':{'labelpos':'w',
321 'label_text':'bond Radius',
322 'entry_width':5,
323 'validate':'real',
324 'value': 0.15},
325 'gridcfg':{'column':3, 'row':6, 'sticky':'e'}})
326
327
328
329
330
331
332 idf.append({'name':'fileName',
333 'widgetType':Pmw.EntryField,
334 'wcfg':{'labelpos':'w',
335 'label_text':'File Name',
336 'entry_width':40,
337 'value':'test.pov',},
338 'gridcfg':{'columnspan':2,'column':0,'row':6,'sticky':'w'}})
339
340
341
342
343
344
345 idf.append({'name':'povrayBin',
346 'widgetType':Pmw.EntryField,
347 'wcfg':{'labelpos':'w',
348 'label_text':'Povray binary',
349 'value':'povray',
350 'entry_width':40},
351 'gridcfg':{'columnspan':2,'column':0,
352 'row':7,'sticky':'w'}})
353
354 idf.append({'name':'wbg',
355 'widgetType':Tkinter.Checkbutton,
356 'defaultValue':1,
357 'wcfg':{'text':'White Background',
358 'variable': Tkinter.IntVar()},
359 'gridcfg':{'column':3, 'row':7,'sticky':'e'}})
360
361
362
363
364
365
366 idf.append({'name':'povrayArgs',
367 'widgetType':Pmw.EntryField,
368 'wcfg':{'labelpos':'w',
369 'label_text':'cmdline arguments',
370 'value':'+D0 +P +X -V +FN +QR',
371 'entry_width':40},
372 'gridcfg':{'columnspan':2,'column':0,
373 'row':8,'sticky':'w'}})
374
375
376
377
378
379 idf.append({'name':'imageFile',
380 'widgetType':Pmw.EntryField,
381 'wcfg':{'labelpos':'w',
382 'label_text':'image file',
383 'entry_width':40},
384 'gridcfg':{'columnspan':2,'column':0,
385 'row':9,'sticky':'w'}})
386
387 idf.append({'name':'WriteFile',
388 'widgetType':Tkinter.Button,
389 'wcfg':{'text':'WriteFile','command': self.writeFile},
390 'gridcfg':{'columnspan':1,'column':0,
391 'row':10,'sticky':'ew'}})
392
393 idf.append({'name':'Render',
394 'widgetType':Tkinter.Button,
395 'wcfg':{'text':'Render',
396 'command': CallBackFunction( self.runPovray,
397 (idf))},
398 'gridcfg':{'columnspan':2,'column':1,
399 'row':10,'sticky':'ew'}})
400
401 idf.append({'name':'Dismiss',
402 'widgetType':Tkinter.Button,
403 'wcfg':{'text':'Dismiss',
404 'command':self.dismissCB},
405 'gridcfg':{'column':3, 'row':10,'sticky':'ew'}})
406
407 self.form = self.vf.getUserInput(idf, modal = 0, blocking = 0)
408 lb = idf.entryByName['selectedGeometries']['widget'].lb
409 lb.bind("<ButtonRelease-1>", self.updateProps, '+')
410
411 e1 = idf.entryByName['pigment']['widget']
412 e1.bind("<Return>", self.bindPigment)
413
414 e2 = idf.entryByName['finish']['widget']
415 e2.bind("<Return>", self.bindFinish)
416
417 povrayGuiDescr = {'widgetType':'Menu', 'menuBarName':'menuRoot',
418 'menuButtonName':'File',
419 'menuEntryLabel':'Povray', 'index':0}
420
421 PovrayGUI = CommandGUI()
422 PovrayGUI.addMenuCommand('menuRoot', 'File', 'Povray', index = 0)
423
424 commandList = [
425 {'name':'povray','cmd': Povray(), 'gui': PovrayGUI},
426 ]
427
428
430 for dict in commandList:
431 viewer.addCommand(dict['cmd'], dict['name'], dict['gui'])
432