# Created by Leo from: C:\Python23\Tom\leo\sfsding.leo # << sfsding_dislin_PIL declarations >> """Shape from Shading A method for determining the shape of a surface from its image "Shape from shading" (also known as photoclinometry) is a method for determining the shape of a surface from its image. For a surface of constant albedo, the brightness at a point (x,y) in the image is related to the gradients (p,q) by the following expression: i(x,y) = a R[p(x,y),q(x,y)] where R is the reflectance map, p = dz/dx and q = dz/dy are the partial derivatives of the surface in the x- and y-directions, and a is a constant that depends on the albedo, the gain of the imaging system and other factors. The above expression also assumes that any additive offsets, for example, because of atmospheric scattering, have been removed. A variety of methods have been developed for inverting the above equation (see Horn 1990). The next section describes a simple method that provides satisfactory results in many planetary imaging scenarios. It is based on some early ideas described by Horn (1977). . If the image is rotated so that the vector that points to the sun is in the x-z plane, it can be shown that i(x,y) ~ a [sin(s) p(x,y) + cos(s)] where s is the zenith angle of the sun. The constant scale factor a is difficult to determine directly without ground truth (that is, ground targets with known albedo and slope). However, because in most images the gradients are more-or-less uniformly distributed in all directions, the expected value of the gradient in the x-direction E[p] ~ 0 and so the average image brightness E[i] ~ a cos(s). This then allows us to estimate the scale factor a = E[i] / cos(s). The elevation map z(x,y) can be obtained iteratively, row-by-row as z(x,y) = z(x-1,y) + [i(x,y) - a cos(s)] / a sin(s) z(x) = z(x-1) + [i(x) - a cos(s)] / a sin(s) where z(0,y) are the boundary values. If the boundary values z(0,y) are unknown, we can minimize the mean-squared elevation difference between rows by subtracting the average row elevation from the elevations in the row.""" import os import Image import ImageChops import wx from wx.lib.imagebrowser import * from math import * import dislin import StringIO import image_view import wx.lib.colourselect as csel from wx.lib.stattext import GenStaticText as StaticText # -- end -- << sfsding_dislin_PIL declarations >> # << sfsding_dislin_PIL methods >> (1 of 8) def imgtyp(file_nm):#returns wx. image typ fl_fld = os.path.splitext(file_nm) ext = fl_fld[1] ext = string.lower(ext[1:]) if ext == 'bmp': image = wx.BITMAP_TYPE_BMP elif ext == 'gif': image = wx.BITMAP_TYPE_GIF elif ext == 'png': image = wx.BITMAP_TYPE_PNG elif ext == 'jpg': image = wx.BITMAP_TYPE_JPEG return image # << sfsding_dislin_PIL methods >> (2 of 8) def elevation_line(line_data, zenith_angle, scale_factor):#calculates elivation data output_line = [] z = 0. z2 = 0. avg = 0. hi = 0 lo = 255 for i in line_data: avg = avg + i avg = avg / len(line_data) z = avg + ( - scale_factor * cos(zenith_angle)) / (scale_factor * sin(zenith_angle)) for i in line_data: z2 = z + ( i - scale_factor * cos(zenith_angle)) / (scale_factor * sin(zenith_angle)) if z2 > hi: hi = int(z2) if z2 < lo: lo = int(z2) output_line.append(z2) return output_line, max(output_line),min(output_line) #hi, lo # << sfsding_dislin_PIL methods >> (3 of 8) class DislinCamera(wx.Frame): # << class DislinCamera methods >> (1 of 6) def __init__(self,parent): wx.Frame.__init__(self, None, -1, "Camera Settings",wx.DefaultPosition,wx.Size(100,100),style = wx.DEFAULT_FRAME_STYLE) self.parent = parent anglesizer = wx.BoxSizer(wx.VERTICAL) t = StaticText(self, -1, 'Camera Direction') anglesizer.Add(t, 0, wx.EXPAND) sampleList = [ 'ABS', 'USER','ANGLE'] self.camtyp = wx.ComboBox(self, -1, 'ANGLE', wx.DefaultPosition, wx.DefaultSize, sampleList, wx.CB_DROPDOWN ) self.Bind(wx.EVT_COMBOBOX, self.OnCombo, self.camtyp) anglesizer.Add(self.camtyp, 0, wx.EXPAND) self.camposX = wx.SpinCtrl(self, -1, "X Pos",wx.DefaultPosition, wx.DefaultSize) self.camposX.SetRange(0,360) self.camposX.SetValue(self.parent.RAngle) anglesizer.Add(self.camposX, 0, wx.EXPAND) #self.camposY = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.camposY = wx.SpinCtrl(self, -1, "Y Pos",wx.DefaultPosition, wx.DefaultSize) self.camposY.SetRange(0,360) self.camposY.SetValue(self.parent.UAngle) anglesizer.Add(self.camposY, 0, wx.EXPAND) #self.camposZ = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.camposZ = wx.SpinCtrl(self, -1, "Z Pos",wx.DefaultPosition, wx.DefaultSize) self.camposZ.SetRange(-5000,5000) self.camposZ.SetValue(self.parent.DAngle) anglesizer.Add(self.camposZ, 0, wx.EXPAND) focussizer = wx.BoxSizer(wx.VERTICAL) f = StaticText(self, -1, 'Focal Point') focussizer.Add(f, 0, wx.EXPAND) optionlist = ['ABS', 'USER','ANGLE'] self.foctyp = wx.ComboBox(self, -1, 'ABS', wx.DefaultPosition, wx.DefaultSize, sampleList, wx.CB_DROPDOWN ) self.Bind(wx.EVT_COMBOBOX, self.OnCombo2, self.foctyp) focussizer.Add(self.foctyp, 0, wx.EXPAND) #self.focposX = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.focposX = wx.SpinCtrl(self, -1, "X foc",wx.DefaultPosition, wx.DefaultSize) self.focposX.SetRange(-50000,50000) self.focposX.SetValue(self.parent.camfocusR) focussizer.Add(self.focposX, 0, wx.EXPAND) #self.focposY = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.focposY = wx.SpinCtrl(self, -1, "Y Foc",wx.DefaultPosition, wx.DefaultSize) self.focposY.SetRange(-50000,50000) self.focposY.SetValue(self.parent.camfocusU) focussizer.Add(self.focposY, 0, wx.EXPAND) #self.focposZ = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.focposZ = wx.SpinCtrl(self, -1, "Z Foc",wx.DefaultPosition, wx.DefaultSize) self.focposZ.SetRange(-50000,50000) self.focposZ.SetValue(self.parent.camfocusD) focussizer.Add(self.focposZ, 0, wx.EXPAND) #self.rotat = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.rotat = wx.SpinCtrl(self, -1, 'Rotation',wx.DefaultPosition, wx.DefaultSize) self.rotat.SetRange(0,360) self.rotat.SetValue(self.parent.camrotation) #self.angle = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.angle = wx.SpinCtrl(self, -1, 'Apiture',wx.DefaultPosition, wx.DefaultSize) self.angle.SetRange(0,360) self.angle.SetValue(self.parent.cameraapiture) self.mainsizer = wx.BoxSizer(wx.VERTICAL) midsizer = wx.BoxSizer(wx.HORIZONTAL) midsizer.Add(anglesizer, 1, wx.EXPAND) midsizer.Add(focussizer, 1, wx.EXPAND) self.mainsizer.Add(midsizer, 1, wx.EXPAND) self.mainsizer.Add(StaticText(self, -1, 'Camera Rotation'), 0, wx.EXPAND) self.mainsizer.Add(self.rotat, 0, wx.EXPAND) self.mainsizer.Add(StaticText(self, -1, 'Camera Apiture'), 0, wx.EXPAND) self.mainsizer.Add(self.angle, 0, wx.EXPAND) self.ok = wx.Button(self, -1, 'OK', wx.DefaultPosition) wx.EVT_BUTTON(self, self.ok.GetId(), self.OnOK) #self.bind(wx.EVT_BUTTON,self.OnOK,self.ok) self.cancel = wx.Button(self, -1, 'Cancel', wx.DefaultPosition) wx.EVT_BUTTON(self, self.cancel.GetId(), self.OnCancel) #self.bind(wx.EVT_BUTTON,self.OnCancel,self.cancel) buttonsizer = wx.BoxSizer(wx.HORIZONTAL) buttonsizer.Add(self.ok, 1, wx.EXPAND) buttonsizer.Add(self.cancel, 1, wx.EXPAND) self.mainsizer.Add(buttonsizer, 0, wx.EXPAND) self.SetSizer(self.mainsizer) self.SetAutoLayout(1) self.mainsizer.Fit(self) # << class DislinCamera methods >> (2 of 6) def OnSize(self,event): self.mainsizer.Fit(self) # << class DislinCamera methods >> (3 of 6) def OnCombo(self,event): if event.GetString() in ('ABS', 'USER'): self.camposX.SetRange(-50000,50000) self.camposY.SetRange(-50000,50000) self.camposZ.SetRange(-50000,50000) else: self.camposX.SetRange(0,360) self.camposY.SetRange(0,360) self.camposZ.SetRange(0,50000) # << class DislinCamera methods >> (4 of 6) def OnCombo2(self,event): if event.GetString() in ('ABS', 'USER'): self.focposX.SetRange(-50000,50000) self.focposY.SetRange(-50000,50000) self.focposZ.SetRange(-50000,50000) else: self.focposX.SetRange(0,360) self.focposY.SetRange(0,360) self.focposZ.SetRange(0,50000) # << class DislinCamera methods >> (5 of 6) def OnOK(self,event): self.parent.camtyp = self.camtyp.GetValue() self.parent.RAngle = self.camposX.GetValue() self.parent.UAngle = self.camposY.GetValue() self.parent.DAngle = self.camposZ.GetValue() self.parent.camfocustyp = self.foctyp.GetValue() self.parent.camfocusR = self.focposX.GetValue() self.parent.camfocusU = self.focposZ.GetValue() self.parent.camfocusD = self.focposZ.GetValue() self.parent.camrotation = self.rotat.GetValue() self.parent.cameraapiture = self.angle.GetValue() # << class DislinCamera methods >> (6 of 6) def OnCancel(self,event): self.Destroy() # -- end -- << class DislinCamera methods >> # << sfsding_dislin_PIL methods >> (4 of 8) class ColorWindow (wx.Frame): # << class ColorWindow methods >> (1 of 4) def __init__(self,parent): wx.Frame.__init__(self, None, -1, "Color Settings",wx.DefaultPosition,wx.Size(100,100),style = wx.DEFAULT_FRAME_STYLE) self.parent = parent self.colorbuttonlist = [] self.colorbuttonsizerlist = [] self.colorlist = [] self.savebutton = wx.Button(self, -1, 'S', wx.DefaultPosition,(20,20)) wx.EVT_BUTTON(self, self.savebutton.GetId(), self.OnSave) for i in range(len(self.parent.colorlist[0])): self.colorlist.append([int(self.parent.colorlist[0][i]*255),int(self.parent.colorlist[1][i]*255),int(self.parent.colorlist[2][i]*255)]) for i in range(len(self.colorlist)): self.colorbuttonlist.append(csel.ColourSelect(self, -1, '', wx.Color(self.colorlist[i][0],self.colorlist[i][1],self.colorlist[i][2]), (20,20))) wx.SafeYield for i in range(0,len( self.colorlist),16): self.colorbuttonsizerlist.append(wx.BoxSizer(wx.HORIZONTAL)) wx.SafeYield for j in range(16): try: self.colorbuttonsizerlist[-1].Add(self.colorbuttonlist[i+j], 1, wx.EXPAND) except: self.colorbuttonsizerlist[-1].Add(self.savebutton, 1, wx.EXPAND) # self.ok = wx.Button(self, -1, 'OK', wx.DefaultPosition) wx.EVT_BUTTON(self, self.ok.GetId(), self.OnOK) #self.bind(wx.EVT_BUTTON,self.OnOK,self.ok) self.cancel = wx.Button(self, -1, 'Cancel', wx.DefaultPosition) wx.EVT_BUTTON(self, self.cancel.GetId(), self.OnCancel) #self.bind(wx.EVT_BUTTON,self.OnCancel,self.cancel) mainsizer = wx.BoxSizer(wx.VERTICAL) for i in self.colorbuttonsizerlist: mainsizer.Add(i, 1, wx.EXPAND) buttonsizer = wx.BoxSizer(wx.HORIZONTAL) buttonsizer.Add(self.ok, 1, wx.EXPAND) buttonsizer.Add(self.cancel, 1, wx.EXPAND) mainsizer.Add(buttonsizer, 1, wx.EXPAND) self.SetSizer(mainsizer) self.SetAutoLayout(1) mainsizer.Fit(self) # << class ColorWindow methods >> (2 of 4) def OnOK(self,event): colorlist = [] rx,gx,bx = [],[],[] for i in self.colorbuttonlist: clol = i.GetColour() rx.append(clol.Red()/255.0) gx.append(clol.Green()/255.0) bx.append(clol.Blue()/255.0) colorlist.append(rx) colorlist.append(gx) colorlist.append(bx) self.parent.dislinpal = None self.parent.colorlist = colorlist # << class ColorWindow methods >> (3 of 4) def OnSave(self,event): colorlist = [] rx,gx,bx = [],[],[] for i in self.colorbuttonlist: clol = i.GetColour() rx.append(clol.Red()/255.0) gx.append(clol.Green()/255.0) bx.append(clol.Blue()/255.0) colorlist.append(rx) colorlist.append(gx) colorlist.append(bx) wildcard = "Pallette File (*.pal)|*.pal" dlg = wx.FileDialog(self, message="Save file", defaultDir=os.getcwd(), defaultFile='demv.pal', wildcard=wildcard, style=wx.SAVE ) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() pickle.dump(colorlist,file(path,'w+')) dlg.Destroy() # << class ColorWindow methods >> (4 of 4) def OnCancel(self,event): self.Destroy() # -- end -- << class ColorWindow methods >> # << sfsding_dislin_PIL methods >> (5 of 8) class DislinLight (wx.Panel): # << class DislinLight methods >> (1 of 2) def __init__(self,parent,id = -1): wx.Panel.__init__(self, parent, id,wx.DefaultPosition,wx.DefaultSize) self.parent = parent self.ison = wx.CheckBox(self, -1, ' On ', wx.DefaultPosition, wx.DefaultSize, wx.NO_BORDER) sampleList = [ 'ABS', 'USER','ANGLE'] self.lightpostyp = wx.ComboBox(self, -1,'ANGLE', wx.DefaultPosition, wx.DefaultSize, sampleList, wx.CB_DROPDOWN ) self.Bind(wx.EVT_COMBOBOX, self.OnCombo, self.lightpostyp) self.lightposX = wx.SpinCtrl(self, -1, "X Pos",wx.DefaultPosition, wx.DefaultSize) self.lightposX.SetRange(0,360) self.lightposX.SetValue(10) #self.lightposX = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.lightposY = wx.SpinCtrl(self, -1, "Y Pos",wx.DefaultPosition, wx.DefaultSize) self.lightposY.SetRange(0,360) self.lightposY.SetValue(25) #self.lightposY = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.lightposZ = wx.SpinCtrl(self, -1, "Z Pos",wx.DefaultPosition, wx.DefaultSize) self.lightposZ.SetRange(0,50000) self.lightposZ.SetValue(200) #self.lightposZ = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) optionlist = ['AMBIENT', 'DIFFUSE', 'SPECULAR', 'CONSTANT','LINEAR','QUADRATIC'] self.lightopttyp = wx.ComboBox(self, -1, 'AMBIENT', wx.DefaultPosition, wx.DefaultSize, optionlist, wx.CB_DROPDOWN) #self.lightoptparim = mnum.MaskedNumCtrl( self, integerWidth=5, fractionWidth=2 ) self.lightoptparim = wx.SpinCtrl(self, -1, "Light Parim/10",wx.DefaultPosition, wx.DefaultSize) self.lightoptparim.SetRange(0,360) self.lightoptparim.SetValue(10) self.mainsizer = wx.BoxSizer(wx.VERTICAL) midsizer = wx.BoxSizer(wx.HORIZONTAL) lightoptsizer = wx.BoxSizer(wx.VERTICAL) lightpossizer = wx.BoxSizer(wx.VERTICAL) lightpossizer.Add(StaticText(self, -1, 'Light Pos'), 0, wx.EXPAND) lightpossizer.Add(self.lightpostyp, 0, wx.EXPAND) lightpossizer.Add(self.lightposX, 0, wx.EXPAND) lightpossizer.Add(self.lightposY, 0, wx.EXPAND) lightpossizer.Add(self.lightposZ, 0, wx.EXPAND) midsizer.Add(lightpossizer, 1, wx.EXPAND) lightoptsizer.Add(StaticText(self, -1, 'Light Typ'), 0, wx.EXPAND) lightoptsizer.Add(self.lightopttyp, 0, wx.EXPAND) lightoptsizer.Add(StaticText(self, -1, 'Parim/100'), 0, wx.EXPAND) lightoptsizer.Add(self.lightoptparim, 0, wx.EXPAND) midsizer.Add(lightoptsizer, 1, wx.EXPAND) self.mainsizer.Add(midsizer, 1, wx.EXPAND) self.mainsizer.Add(self.ison, 0, wx.EXPAND) self.SetSizer(self.mainsizer) self.SetAutoLayout(1) self.mainsizer.Fit(self) # << class DislinLight methods >> (2 of 2) def OnCombo(self,event): if event.GetString() in ('ABS', 'USER'): self.lightposX.SetRange(0,50000) self.lightposY.SetRange(0,50000) self.lightposZ.SetRange(0,50000) else: self.lightposX.SetRange(0,360) self.lightposY.SetRange(0,360) self.lightposZ.SetRange(0,50000) # -- end -- << class DislinLight methods >> # << sfsding_dislin_PIL methods >> (6 of 8) class LightWindow (wx.Frame): # << class LightWindow methods >> (1 of 3) def __init__(self,parent,thelights = None): wx.Frame.__init__(self, None, -1, "Light Settings",wx.DefaultPosition,wx.DefaultSize,style = wx.DEFAULT_FRAME_STYLE) if thelights: self.thelights = thelights else: self.thelights = {1:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],2:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],3:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],4:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],5:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],6:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],7:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],8:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']]} TypeList2 = ['Nearest', 'Bilinear', 'Bicubic'] self.parent = parent self.lightlist = {} for i in self.thelights.keys(): self.lightlist[i] = DislinLight(self) wx.SafeYield sizer1 = wx.BoxSizer(wx.HORIZONTAL) sizer2 = wx.BoxSizer(wx.HORIZONTAL) for i in range(1,5): subsiz = wx.BoxSizer(wx.VERTICAL) subsiz.Add(StaticText(self, -1, 'Light ' + str(i)), 0, wx.EXPAND) subsiz.Add(self.lightlist[i], 0, wx.EXPAND) sizer1.Add(subsiz, 1, wx.EXPAND) for i in range(5,9): subsiz = wx.BoxSizer(wx.VERTICAL) subsiz.Add(StaticText(self, -1, 'Light ' + str(i)), 0, wx.EXPAND) subsiz.Add(self.lightlist[i], 0, wx.EXPAND) sizer2.Add(subsiz, 1, wx.EXPAND) self.ok = wx.Button(self, -1, 'OK', wx.DefaultPosition) wx.EVT_BUTTON(self, self.ok.GetId(), self.OnOK) #self.bind(wx.EVT_BUTTON,self.OnOK,self.ok) self.cancel = wx.Button(self, -1, 'Cancel', wx.DefaultPosition) wx.EVT_BUTTON(self, self.cancel.GetId(), self.OnCancel) #self.bind(wx.EVT_BUTTON,self.OnCancel,self.cancel) mainsizer = wx.BoxSizer(wx.VERTICAL) mainsizer.Add(sizer1, 1, wx.EXPAND) mainsizer.Add(sizer2, 1, wx.EXPAND) buttonsizer = wx.BoxSizer(wx.HORIZONTAL) buttonsizer.Add(self.ok, 1, wx.EXPAND) buttonsizer.Add(self.cancel, 1, wx.EXPAND) mainsizer.Add(buttonsizer, 1, wx.EXPAND) self.SetSizer(mainsizer) self.SetAutoLayout(1) mainsizer.Fit(self) for i in self.lightlist.keys(): if self.thelights[i][0] == 'ON': self.lightlist[1].ison.SetValue(True) else: self.lightlist[1].ison.SetValue(False) self.lightlist[i].lightposX.SetValue(self.thelights[i][1][0]) self.lightlist[i].lightposY.SetValue(self.thelights[i][1][1]) self.lightlist[i].lightposZ.SetValue(self.thelights[i][1][2]) self.lightlist[i].lightpostyp.SetValue(self.thelights[i][1][3]) self.lightlist[i].lightoptparim.SetValue(self.thelights[i][2][0]*100) self.lightlist[i].lightopttyp.SetValue(self.thelights[i][2][1]) # << class LightWindow methods >> (2 of 3) def OnOK(self,event): lightlist = [] lightdict = {} count = 0 for i in self.lightlist.keys(): if self.lightlist[i].ison.GetValue(): lightlist.append('ON') else: lightlist.append('OFF') count += 1 lightlist.append([long(self.lightlist[i].lightposX.GetValue()),long(self.lightlist[i].lightposY.GetValue()),long(self.lightlist[i].lightposZ.GetValue()),self.lightlist[i].lightpostyp.GetValue()]) lightlist.append([long(self.lightlist[i].lightoptparim.GetValue()/100),self.lightlist[i].lightopttyp.GetValue()]) lightdict[i] = lightlist lightlist = [] self.parent.lightflag = True if count == 8: self.parent.lightflag = False self.parent.thelights = lightdict # << class LightWindow methods >> (3 of 3) def OnCancel(self,event): self.parent.lightflag = False self.Destroy() # -- end -- << class LightWindow methods >> # << sfsding_dislin_PIL methods >> (7 of 8) class ViewerFrame(wx.Frame): # << class ViewerFrame methods >> (1 of 29) def __init__(self, parent, id, title): # First, call the base class' __init__ method to create the frame wx.Frame.__init__(self, parent, id, title,wx.DefaultPosition,wx.DefaultSize) self.Imagetest = Image.new.__init__('RGB',(853,603)) self.rotationangle = 0 self.raster_flag = True self.zenith_angle = 30 self.scale_factor = 2.5 self.displaychoice = 'shade' self.filterselect = Image.NEAREST self.new_line = [] self.hi = 255 self.lo = 0 self.colorlist = [] rx,gx,bx = [],[],[] dislin.metafl('VIRT') dislin.disini() #self.colorlist = dislin.getvlt() #print self.colorlist #r,g,b = 0.0,0.0,0.0 for i in range(255): col = dislin.getind(i) #print col, rx.append(col[0]) gx.append(col[1]) bx.append(col[2]) self.colorlist.append(rx) self.colorlist.append(gx) self.colorlist.append(bx) dislin.disfin() wx.SafeYield self.dislinpal = None self.lightflag = False self.thelights = {1:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],2:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],3:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],4:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],5:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],6:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],7:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']],8:['ON',[10,25,200,'ANGLE'],[0.2,'AMBIENT']]} TypeList2 = ['Nearest', 'Bilinear', 'Bicubic'] TypeList = ['shade', 'contour', 'grid'] self.globdir = os.path.join(os.getcwd(),'glob.png') self.splochdir = os.path.join(os.getcwd(),'sploch.png') self.mainmenu = wx.MenuBar() # Create menu bar. menu=wx.Menu()# Make a menu (will be the Open menu) exitID=wx.NewId() # Make a new ID for a menu entry. menu.Append(exitID, '&Open', 'Open Picture') # Name the ID by adding it to the menu. wx.EVT_MENU(self, exitID, self.Picture_Open) submenu = wx.Menu() exitID=wx.NewId()# submenu.Append(exitID, 'Small', 'Small Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteSmall) exitID=wx.NewId()# submenu.Append(exitID, 'VGA', 'VGA Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteVGA) exitID=wx.NewId()# submenu.Append(exitID, 'Rainbow', 'Rainbow Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteRainbow) exitID=wx.NewId()# submenu.Append(exitID, 'Spec', 'More violet rainbow Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteSpec) exitID=wx.NewId()# submenu.Append(exitID, 'Grey', 'Grey Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteGrey) exitID=wx.NewId()# submenu.Append(exitID, 'Rev Rainbow', 'Reverse Rainbow Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteRevRainbowl) exitID=wx.NewId()# submenu.Append(exitID,'Rev Spec', 'Reverse Spec Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteRevSpec) exitID=wx.NewId()# submenu.Append(exitID, 'Rev Grey', 'Reverse Grey Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteRevGrey) exitID=wx.NewId()# submenu.Append(exitID, 'Temp', 'Tempiture Pallette') wx.EVT_MENU(self, exitID, self.OnPalletteTemp) exitID=wx.NewId()# submenu.Append(exitID, 'Custom', 'Custom Pallette') wx.EVT_MENU(self, exitID, self.OnPallette)# the menu event exitID=wx.NewId()# Make a new ID for a menu entry. menu.AppendMenu(exitID, 'Pallette', submenu)# Name the ID by adding it to the menu. exitID=wx.NewId()# Make a new ID for a menu entry. menu.Append(exitID, '&Save', 'Save Projection') wx.EVT_MENU(self, exitID, self.Picture_Save) menu.Append(exitID, 'E&xit', 'Exit program') wx.EVT_MENU(self, exitID, self.Picture_Exit) self.mainmenu.Append (menu, '&File') # Add the File menu to the menu bar. self.SetMenuBar (self.mainmenu) # Attach the menu bar to the window. #Sizers self.sub_Picture_button_sizer = wx.BoxSizer(wx.VERTICAL) self.sub_Picture_button_text_sizer = wx.BoxSizer(wx.VERTICAL) self.Picture_button_sizer = wx.BoxSizer(wx.HORIZONTAL) self.Picture_sizer = wx.BoxSizer(wx.VERTICAL) self.AandS_sizer = wx.BoxSizer(wx.VERTICAL) self.AandS_lable_sizer = wx.BoxSizer(wx.VERTICAL) self.sub_Picture_button_text_sizer = wx.BoxSizer(wx.VERTICAL) self.camera_sizer = wx.BoxSizer(wx.VERTICAL) self.camera_text_sizer = wx.BoxSizer(wx.VERTICAL) self.ThreeD_button_sizer = wx.BoxSizer(wx.HORIZONTAL) self.ThreeD_sizer = wx.BoxSizer(wx.VERTICAL) #Controll ID's self.PictureWindowID = wx.NewId() self.ThreeD_slider_ID = wx.NewId() self.ThreeD_slider_IDa = wx.NewId() self.ThreeDWindowID = wx.NewId() self.Picture_Refresh_Button_ID = wx.NewId() self.Picture_slider_ID = wx.NewId() self.ThreeD_viewID = wx.NewId() self.ThreeD_Refresh_Button_ID = wx.NewId() self.RAngle_ID = wx.NewId() exitID=wx.NewId() self.UAngle_ID = wx.NewId() self.DAngle_ID = wx.NewId() #Controlls self.Splitter = wx.SplitterWindow(self, -1) self.Picture_view = wx.Panel(self.Splitter, -1, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) self.PictureWindow = wx.ScrolledWindow(self.Picture_view, self.PictureWindowID, wx.DefaultPosition, wx.DefaultSize, wx.SUNKEN_BORDER) self.ThreeD_view = wx.Panel(self.Splitter, self.ThreeD_viewID, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) #self.ThreeDWindow = wx.ScrolledWindow(self.ThreeD_view, self.ThreeDWindowID, wx.DefaultPosition, wx.DefaultSize, wx.SUNKEN_BORDER) self.ThreeD_Refresh_Button = wx.Button(self.ThreeD_view, self.ThreeD_Refresh_Button_ID, 'Refresh', wx.DefaultPosition) self.Picture_Refresh_Button = wx.Button(self.Picture_view, self.Picture_Refresh_Button_ID, 'Refresh', wx.DefaultPosition) self.choice2 = wx.Choice(self.Picture_view, 80, (80, 50), choices = TypeList2) self.Picture_slider = wx.TextCtrl(self.Picture_view, self.Picture_slider_ID, "0", size=(125, -1)) self.choice = wx.Choice(self.ThreeD_view, 40, (80, 50), choices = TypeList) #self.RAngle = wx.SpinCtrl(self.ThreeD_view, self.RAngle_ID, "", wx.Point(30, 50), wx.Size(80, -1)) self.ThreeD_slidera = wx.TextCtrl(self.ThreeD_view, self.ThreeD_slider_IDa, "30", size=(125, -1)) self.ThreeD_slider = wx.TextCtrl(self.ThreeD_view, self.ThreeD_slider_ID, "2.5", size=(125, -1)) #self.UAngle = wx.SpinCtrl(self.ThreeD_view, self.UAngle_ID, "", wx.Point(30, 50), wx.Size(80, -1)) #self.DAngle = wx.SpinCtrl(self.ThreeD_view, self.DAngle_ID, "", wx.Point(30, 50), wx.Size(80, -1)) #lables self.lightbutton = wx.Button(self.ThreeD_view, -1, 'Lighting', wx.DefaultPosition) wx.EVT_BUTTON(self, self.lightbutton.GetId(), self.Lighting_Button_Press) l1 = wx.StaticText(self.Picture_view, -1, "Rotation Angle",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) l2 = wx.StaticText(self.ThreeD_view, -1, "Scale",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) l4 = wx.StaticText(self.Picture_view, -1, "Method",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) l5 = wx.StaticText(self.ThreeD_view, -1, "Azimuth",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) l6 = wx.StaticText(self.ThreeD_view, -1, "Display",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) #self.ratext = wx.StaticText(self.ThreeD_view, -1, " R Angle") #self.uatext = wx.StaticText(self.ThreeD_view, -1, " Up Angle") #self.disttext = wx.StaticText(self.ThreeD_view, -1, " Distance") #self.RAngle_ID = wx.NewId() self.camtyp = 'ANGLE' self.RAngle = 190 #self.RAngle.SetRange(0,359) #self.RAngle.SetValue(RSpin) #wx.EVT_SPINCTRL(self, self.RAngle_ID, self.OnRSpin) #self.UAngle_ID = wx.NewId() self.UAngle = 25 #self.UAngle.SetRange(0,359) #self.UAngle.SetValue(USpin) #wx.EVT_SPINCTRL(self, self.UAngle_ID, self.OnUSpin) #self.DAngle_ID = wx.NewId() self.DAngle = 800 self.camfocustyp = 'ABS' self.camfocusR = 0 self.camfocusU = 0 self.camfocusD = 0 self.camrotation = 0 self.cameraapiture = 28 #self.DAngle.SetRange(0,5000) #self.DAngle.SetValue(DSpin) #wx.EVT_SPINCTRL(self, self.DAngle_ID, self.OnDSpin) #l7 = wx.StaticText(self.ThreeD_view, -1, "R Angle",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) #l8 = wx.StaticText(self.ThreeD_view, -1, "Up Angle",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) #l9 = wx.StaticText(self.ThreeD_view, -1, "Distance",wx.Point(30, 50), wx.Size(80, -1),wx.ALIGN_CENTRE ) #Controll Settings self.choice2.SetStringSelection('Nearest') self.Picture_slider.SetInsertionPoint(0) self.ThreeD_slidera.SetInsertionPoint(0) self.ThreeD_slider.SetInsertionPoint(0) self.choice.SetStringSelection('shade') self.camerabutton = wx.Button(self.ThreeD_view, -1, 'Camera', wx.DefaultPosition) wx.EVT_BUTTON(self, self.camerabutton.GetId(), self.OnCamera) self.Splitter.SetMinimumPaneSize(20) self.Splitter.SplitVertically(self.ThreeD_view, self.Picture_view) self.Splitter.SetSashPosition(300) #Class Events wx.EVT_TEXT(self, self.Picture_slider_ID, self.EvtText) wx.EVT_CHOICE(self, 40 , self.EvtChoice) wx.EVT_TEXT(self, self.ThreeD_slider_ID, self.EvtThreeDChar) wx.EVT_BUTTON(self, self.Picture_Refresh_Button_ID, self.Picture_Refresh_Button_Press) wx.EVT_TEXT(self, self.ThreeD_slider_IDa, self.EvtThreeDText) wx.EVT_BUTTON(self, self.ThreeD_Refresh_Button_ID, self.ThreeD_Refresh_Button_Press) wx.EVT_CHOICE(self, 80 , self.EvtChoice2) self.glob_thing = image_view.ImageView(self.ThreeD_view, -1) self.sub_Picture_button_text_sizer.Add(l1, 1, wx.EXPAND) self.sub_Picture_button_text_sizer.Add(l4, 1, wx.EXPAND) self.sub_Picture_button_sizer.Add(self.Picture_slider, 1, wx.EXPAND) self.sub_Picture_button_sizer.Add(self.choice2, 1, wx.EXPAND) self.Picture_button_sizer.Add(self.sub_Picture_button_text_sizer, 1, wx.EXPAND) self.Picture_button_sizer.Add(self.sub_Picture_button_sizer, 1, wx.EXPAND) self.Picture_button_sizer.Add(self.Picture_Refresh_Button, 1, wx.EXPAND) self.Picture_sizer.Add(self.Picture_button_sizer, 1, wx.EXPAND) self.Picture_sizer.Add(self.PictureWindow, 10, wx.EXPAND) self.Picture_view.SetSizer(self.Picture_sizer) self.Picture_view.SetAutoLayout(1) self.Picture_sizer.Fit(self.Picture_view) self.AandS_lable_sizer.Add(l5, 1, wx.EXPAND) self.AandS_lable_sizer.Add(l2, 1, wx.EXPAND) self.AandS_lable_sizer.Add(l6, 1, wx.EXPAND) self.AandS_sizer.Add(self.ThreeD_slidera, 1, wx.EXPAND) self.AandS_sizer.Add(self.ThreeD_slider, 1, wx.EXPAND) self.AandS_sizer.Add(self.choice, 1, wx.EXPAND) #self.camera_text_sizer.Add(l7, 1, wx.EXPAND) #self.camera_text_sizer.Add(l8, 1, wx.EXPAND) #self.camera_text_sizer.Add(l9, 1, wx.EXPAND) #self.camera_sizer.Add(self.RAngle, 1, wx.EXPAND) #self.camera_sizer.Add(self.UAngle, 1, wx.EXPAND) #self.camera_sizer.Add(self.DAngle, 1, wx.EXPAND) self.ThreeD_button_sizer.Add(self.ThreeD_Refresh_Button, 1, wx.EXPAND) self.ThreeD_button_sizer.Add(self.lightbutton, 1, wx.EXPAND) self.ThreeD_button_sizer.Add(self.camerabutton, 1, wx.EXPAND) self.ThreeD_button_sizer.Add(self.AandS_lable_sizer, 2, wx.EXPAND) self.ThreeD_button_sizer.Add(self.AandS_sizer, 1, wx.EXPAND) #self.ThreeD_button_sizer.Add(self.camera_text_sizer, 2, wx.EXPAND) #self.ThreeD_button_sizer.Add(self.camera_sizer, 1, wx.EXPAND) self.ThreeD_sizer.Add(self.ThreeD_button_sizer, 1, wx.EXPAND) self.ThreeD_sizer.Add(self.glob_thing, 10, wx.EXPAND) self.ThreeD_view.SetSizer(self.ThreeD_sizer) self.ThreeD_view.SetAutoLayout(1) self.ThreeD_sizer.Fit(self.ThreeD_view) self.imgfile = 'Unnamed' if len(sys.argv) > 1: self.imgfile = sys.argv[1] elif self.imgfile == 'Unnamed': self.imgfile = self.get_img() if self.imgfile == 'Unnamed': sys.exit() print self.imgfile self.PIL_bitmap = Image.open(str(self.imgfile)) self.PIL_bitmap = self.PIL_bitmap.convert("L") new_box = int(sqrt((self.PIL_bitmap.size[0]**2)+(self.PIL_bitmap.size[1]**2))) new_image = Image.new("L",(new_box,new_box)) up_left = (int((new_box - self.PIL_bitmap.size[0])/2),int((new_box - self.PIL_bitmap.size[1])/2)) new_image.paste(self.PIL_bitmap,up_left) self.PIL_bitmap = new_image self.PIL_bitmap.save(self.splochdir) self.view_bitmap = wx.Bitmap(self.splochdir,wx.BITMAP_TYPE_PNG) self.bitmapID = wx.NewId() self.bitmap2ID = wx.NewId() #self.glob_thing = wx.StaticBitmap(self.ThreeDWindow, self.bitmap2ID,self.view_bitmap, wx.Point(0,0), wx.Size(853, 603)) #view = ImageView(win, -1) #self.glob_thing.set_image(WXToPIL(self.view_bitmap)) #self.glob_thing.set_image(Image.open(None)) self.static_thing = wx.StaticBitmap(self.PictureWindow, self.bitmapID, self.view_bitmap, wx.DefaultPosition, wx.Size(self.view_bitmap.GetWidth(), self.view_bitmap.GetHeight())) #self.ThreeDWindow.SetScrollbars(1, 1, 853, 603) self.PictureWindow.SetScrollbars(1, 1, self.PIL_bitmap.size[0],self.PIL_bitmap.size[1]) # << class ViewerFrame methods >> (2 of 29) def get_img(self): #gets the image file name dlg = wx.FileDialog(self, 'Image File Name', 'C:\\Documents and Settings\\Owner\\My Documents\\My Pictures\\mars\\', '', 'BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif|PNG files (*.png)|*.png|And many more|*.*', wx.OPEN) is_open = dlg.ShowModal() if is_open == wx.ID_OK: return dlg.GetPath() elif is_open == wx.ID_CANCEL: return self.imgfile dlg.Destroy() wx.SafeYield() # << class ViewerFrame methods >> (3 of 29) def OnCloseWindow(self, event): # tell the window to kill itself self.Destroy() # << class ViewerFrame methods >> (4 of 29) def OnCamera(self, event): self.camwin = DislinCamera(self) self.camwin.Show() # << class ViewerFrame methods >> (5 of 29) def OnPallette(self, event): dislin.disini() r,g,b = 0.0,0.0,0.0 colorlist = [] for i in range(255): col = dislin.getind(i) colorlist.append((int(col[0]*255),int(col[1]*255),int(col[2]*255))) dislin.disfin() wx.SafeYield self.colorwin = ColorWindow(self) self.colorwin.Show() # << class ViewerFrame methods >> (6 of 29) def LoadPal(self,event): wildcard = "Pallette File (*.pal)|*.pal" dlg = wx.FileDialog(self, message="Save file", defaultDir=os.getcwd(), defaultFile='demv.pal', wildcard=wildcard, style=wx.OPEN ) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.colorlist = pickle.load(file(path)) dlg.Destroy() # << class ViewerFrame methods >> (7 of 29) def EvtChoice(self, event): self.displaychoice = event.GetString() # << class ViewerFrame methods >> (8 of 29) def OnPalletteSmall(self, event): self.dislinpal = 'SMALL' # << class ViewerFrame methods >> (9 of 29) def Lighting_Button_Press(self, event): self.LW = LightWindow(self,self.thelights) self.LW.Show() wx.SafeYield # << class ViewerFrame methods >> (10 of 29) def OnPalletteVGA(self, event): self.dislinpal = 'VGA' # << class ViewerFrame methods >> (11 of 29) def EvtChoice2(self, event): if event.GetString() == 'Bilinear': self.filterselect = Image.BILINEAR elif event.GetString() == 'Bicubit': self.filterselect = Image.BICUBIC else: self.filterselect = Image.NEAREST # << class ViewerFrame methods >> (12 of 29) def Picture_Open(self, event):#self.splochdir tempimgfile = self.get_img() if tempimgfile <> 'Unnamed': self.raster_flag = True self.imgfile = tempimgfile self.PIL_bitmap = Image.open(str(self.imgfile)).convert("L") new_box = int(sqrt((self.PIL_bitmap.size[0]**2)+(self.PIL_bitmap.size[1]**2))) new_image = Image.new("L",(new_box,new_box)) up_left = (int((new_box - self.PIL_bitmap.size[0])/2),int((new_box - self.PIL_bitmap.size[1])/2)) new_image.paste(self.PIL_bitmap,up_left) self.PIL_bitmap = new_image self.PIL_bitmap.save(self.splochdir) self.view_bitmap = wx.Bitmap(self.splochdir,wx.BITMAP_TYPE_PNG) self.static_thing = wx.StaticBitmap(self.PictureWindow, self.bitmapID, self.view_bitmap, wx.DefaultPosition, wx.Size(self.view_bitmap.GetWidth(), self.view_bitmap.GetHeight())) self.PictureWindow.SetScrollbars(1, 1, self.PIL_bitmap.size[0],self.PIL_bitmap.size[1],0,0) # << class ViewerFrame methods >> (13 of 29) def Picture_Save(self, event): dlg = wx.FileDialog(self, "Save Shading Map", ".", "","BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif|Jpeg files (*.jpg)|*.jpg|PNG files (*.png)|*.png|All files (*.*)|*.*", wx.SAVE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() newimage = self.glob_thing.get_image() #newimage.SaveFile(path,imgtyp(path)) #pilimage = Image.open(StringIO.StringIO(newimage)) #pilimage = image_view.WXToPIL(newimage, 'RGB') newimage.save(path) else: pass dlg.Destroy() # << class ViewerFrame methods >> (14 of 29) def EvtText(self, event): try: self.rotationangle = int(event.GetString()) except ValueError: self.rotationangle = 0 # << class ViewerFrame methods >> (15 of 29) def EvtThreeDText(self, event): self.raster_flag = True try: self.zenith_angle = int(event.GetString()) except ValueError: self.zenith_angle = 30 # << class ViewerFrame methods >> (16 of 29) def EvtThreeDChar(self, event): self.raster_flag = True try: self.scale_factor = float(event.GetString()) except ValueError: self.scale_factor = 2.5 # << class ViewerFrame methods >> (17 of 29) def Picture_Exit(self, event): self.Destroy() # << class ViewerFrame methods >> (18 of 29) def Picture_Refresh_Button_Press(self, event): self.raster_flag = True tempimg = self.PIL_bitmap.rotate(self.rotationangle,self.filterselect) self.PIL_bitmap = tempimg tempimg.save(self.splochdir) self.view_bitmap = wx.Bitmap(self.splochdir,wx.BITMAP_TYPE_PNG) self.static_thing.SetBitmap(self.view_bitmap) self.PictureWindow.SetScrollbars(1, 1, self.PIL_bitmap.size[0],self.PIL_bitmap.size[1]) # << class ViewerFrame methods >> (19 of 29) def ThreeD_Refresh_Button_Press(self, event): New_Bitmap2 = self.PIL_bitmap.rotate(-90) New_Bitmap = ImageChops.invert(New_Bitmap2) line_data = New_Bitmap.getdata() if self.raster_flag: self.raster_flag = False print 'rastering' self.new_line, self.hi, self.lo = elevation_line(line_data, self.zenith_angle, self.scale_factor) img_size = self.PIL_bitmap.size print 'done raster' if self.displaychoice == 'shade': self.dis_img(self.new_line,img_size[1],img_size[0], self.lo, self.hi) elif self.displaychoice == 'grid': self.dis_img2(self.new_line,img_size[1],img_size[0], self.lo, self.hi) elif self.displaychoice == 'contour': self.dis_img3(self.new_line,img_size[1],img_size[0], self.lo, self.hi) self.glob_thing.set_image(self.Imagetest) # << class ViewerFrame methods >> (20 of 29) def OnPalletteRainbow(self, event): self.dislinpal = 'RAIN' # << class ViewerFrame methods >> (21 of 29) def OnPalletteSpec(self, event): self.dislinpal = 'SPEC' # << class ViewerFrame methods >> (22 of 29) def OnPalletteGrey(self, event): self.dislinpal = 'GREY' # << class ViewerFrame methods >> (23 of 29) def OnPalletteRevRainbowl(self, event): self.dislinpal = 'RRAIN' # << class ViewerFrame methods >> (24 of 29) def OnPalletteRevSpec(self, event): self.dislinpal = 'RSPEC' # << class ViewerFrame methods >> (25 of 29) def OnPalletteRevGrey(self, event): self.dislinpal = 'RGREY' # << class ViewerFrame methods >> (26 of 29) def OnPalletteTemp(self, event): self.dislinpal = 'TEMP' # << class ViewerFrame methods >> (27 of 29) def dis_img(self,zmat,m, n, zlo, zhi): char = '' max_bytes = 0 xray = range (n) yray = range (m) dislin.metafl ('VIRT') dislin.setpag ('da4l') #dislin.setfil (self.globdir) dislin.disini () dislin.pagera () dislin.hwfont () if self.dislinpal: dislin.setvlt(self.dislinpal) elif self.colorlist != []: dislin.myvlt(self.colorlist[0],self.colorlist[1],self.colorlist[2],255) dislin.ax3len (1400, 1400,1400) dislin.autres(n, m) dislin.shdmod ('poly', 'contur') dislin.graf3 (0, n, 0, n/5, 0, m, 0, m/5, zlo, zhi, zlo, (zhi-zlo)/5) dislin.crvmat (zmat, n, m, 1, 1) dislin.title () char_buff = dislin.rbfpng(max_bytes) max_bytes = int(char_buff[1]) char_buff = dislin.rbfpng(max_bytes) char = char_buff[0] self.Imagetest = Image.open(StringIO.StringIO(char)) dislin.disfin () # << class ViewerFrame methods >> (28 of 29) def dis_img2(self, zmat,m, n, zl, zh): char = '' max_bytes = 0 newmat = [] for i in range(m): for j in range(n): newmat.append(zmat[(j*m)+i]) newmat.reverse() zmat = newmat if zl == zh: zl = 0 zh = 10 xray = range (m) yray = range (n) z_debth = 10 dislin.metafl ('VIRT') dislin.setpag ('da4l') dislin.setfil (self.globdir) dislin.disini () dislin.pagera () dislin.hwfont () if self.dislinpal: dislin.setvlt(self.dislinpal) elif self.colorlist != []: dislin.myvlt(self.colorlist[0],self.colorlist[1],self.colorlist[2],255) if self.lightflag: dislin.light('ON') for i in self.thelights.keys(): dislin.litmod(i,self.thelights[i][0]) dislin.litpos(i, self.thelights[i][1][0], self.thelights[i][1][1], self.thelights[i][1][2], self.thelights[i][1][3]) dislin.litopt(i, self.thelights[i][2][0], self.thelights[i][2][1]) dislin.name ('Latitude', 'Y') dislin.name ('Longitude', 'X') dislin.axis3d(n, m, int(zh-zl)) if self.camtyp == 'ANGLE': if self.DAngle < zh: self.DAngle == zh + 20 dislin.view3d(self.RAngle, self.UAngle, self.DAngle, self.camtyp) #print zh,zl dislin.vfoc3d(self.camfocusR,self.camfocusU, self.camfocusD, self.camfocustyp)#camera focus #print self.camfocusR,self.camfocusU, self.camfocusD, self.camfocustyp dislin.vup3d(self.camrotation) #camera rotation dislin.vang3d(self.cameraapiture)#view angle #dislin.view3d(RSpin, USpin, DSpin, 'ANGLE') dislin.color('BLUE') dislin.graf3d(0, n, 0, n/5, 0, m, 0, m/5, zl, zh, zl, (zh-zl)/5) dislin.surshd(xray, n, yray, m, zmat) # dislin.title () #dislin.shdmod('smooth', 'surface') #dislin.color('BLUE') #dislin.graf3d(0, m, 0, m/5, 0, n, 0, n/5, zl, zh, zl, (zh-zl)/5) #dislin.surshd(xray, m, yray,n, zmat) dislin.title() char_buff = dislin.rbfpng(max_bytes) max_bytes = int(char_buff[1]) char_buff = dislin.rbfpng(max_bytes) char = char_buff[0] self.Imagetest = Image.open(StringIO.StringIO(char)) dislin.disfin() # << class ViewerFrame methods >> (29 of 29) def dis_img3(self, zmat, n, m, zl, zh): char = '' max_bytes = 0 if zl == zh: zl = 0 zh = 10 xray = range (n) yray = range (m) dislin.metafl('VIRT') dislin.setpag('da4l') #dislin.setfil(self.globdir) dislin.disini() dislin.pagera() dislin.hwfont() if self.dislinpal: dislin.setvlt(self.dislinpal) elif self.colorlist != []: dislin.myvlt(self.colorlist[0],self.colorlist[1],self.colorlist[2],255) dislin.complx() if (n * (1400 / m))< 2000: dislin.axslen(n * (1400 / m), 1400) else: dislin.axslen(2000,m * (2000 / n)) dislin.graf(0, n, 0, n/5, 0, m, 0, m/5) dislin.height (25) for i in range (0, 9): zlev = (i * ((zh-zl)/8)) + zl dislin.labels ('FLOAT', 'CONTUR') dislin.setclr ((i+1) * 23) dislin.contur (xray, n, yray, m, zmat, zlev) char_buff = dislin.rbfpng(max_bytes) max_bytes = int(char_buff[1]) char_buff = dislin.rbfpng(max_bytes) char = char_buff[0] self.Imagetest = Image.open(StringIO.StringIO(char)) dislin.disfin() # -- end -- << class ViewerFrame methods >> # << sfsding_dislin_PIL methods >> (8 of 8) class MyApp(wx.App): # << class MyApp declarations >> # wx.Windows calls this method to initialize the application # -- end -- << class MyApp declarations >> # << class MyApp methods >> def OnInit(self): # Create an instance of our customized Frame class frame = ViewerFrame(None, -1, "Shape from Shading") frame.Show(True)# Tell wx.Windows that this is our main window self.SetTopWindow(frame) # Return a success flag return True # -- end -- << class MyApp methods >> # -- end -- << sfsding_dislin_PIL methods >> app = MyApp(0) # Create an instance of the application class app.MainLoop() # Tell it to start processing events