Changeset 2229 for trunk/GSASIIgrid.py


Ignore:
Timestamp:
Apr 28, 2016 1:40:56 PM (7 years ago)
Author:
vondreele
Message:

Add Atom Rotate option

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIgrid.py

    r2228 r2229  
    6969    wxID_RELOADDRAWATOMS,wxID_ATOMSDISAGL,wxID_ATOMMOVE,wxID_MAKEMOLECULE,
    7070    wxID_ASSIGNATMS2RB,wxID_ATOMSPDISAGL, wxID_ISODISP,wxID_ADDHATOM,wxID_UPDATEHATOM,
    71     wxID_WAVEVARY,
    72 ] = [wx.NewId() for item in range(18)]
     71    wxID_WAVEVARY,wxID_ATOMSROTATE,
     72] = [wx.NewId() for item in range(19)]
    7373
    7474[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWATOMCOLOR, wxID_DRAWATOMRESETCOLOR,
     
    516516        parent = self.GetParent()
    517517        parent.Raise()
    518         self.EndModal(wx.ID_CANCEL)     
     518        self.EndModal(wx.ID_CANCEL)
     519       
     520################################################################################
     521class RotationDialog(wx.Dialog):
     522    ''' Get Rotate & translate matrix & vector
     523   
     524    '''
     525    def __init__(self,parent):
     526        wx.Dialog.__init__(self,parent,wx.ID_ANY,'Atom group rotation/translation',
     527            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     528        self.panel = wx.Panel(self)         #just a dummy - gets destroyed in Draw!
     529        self.Trans = np.eye(3)
     530        self.Vec = np.zeros(3)
     531        self.rotAngle = 0.
     532        self.rotVec = np.array([0.,0.,1.])
     533        self.Expand = ''
     534        self.Draw()
     535
     536    def Draw(self):
     537
     538        def OnMatValue(event):
     539            Obj = event.GetEventObject()
     540            ix,iy = Ind[Obj.GetId()]
     541            val = Obj.GetValue()
     542            if '/' in val:
     543                vals = val.split('/')
     544                self.Trans[iy,ix] = float(vals[0])/float(vals[1])
     545            else:   
     546                self.Trans[iy,ix] = float(Obj.GetValue())
     547            Obj.SetValue('%5.3f'%(self.Trans[iy,ix]))
     548           
     549           
     550        def OnVecValue(event):
     551            Obj = event.GetEventObject()
     552            iy = Ind[Obj.GetId()]
     553            val = Obj.GetValue()
     554            if '/' in val:
     555                vals = val.split('/')
     556                self.Vec[iy] = float(vals[0])/float(vals[1])
     557            else:   
     558                self.Vec[iy] = float(Obj.GetValue())
     559            Obj.SetValue('%5.3f'%(self.Vec[iy]))
     560           
     561        def OnExpand(event):
     562            self.Expand = expand.GetValue()
     563           
     564        def OnRotAngle(event):
     565            self.rotAngle = float(rotangle.GetValue())
     566            rotangle.SetValue('%5.3f'%(self.rotAngle))
     567            Q = G2mth.AVdeg2Q(self.rotAngle,self.rotVec)
     568            self.Trans = G2mth.Q2Mat(Q)
     569            self.Draw()
     570           
     571        def OnRotVec(event):
     572            vals = rotvec.GetValue()
     573            vals = vals.split()
     574            self.rotVec = np.array([float(val) for val in vals])
     575            rotvec.SetValue('%5.3f %5.3f %5.3f'%(self.rotVec[0],self.rotVec[1],self.rotVec[2]))
     576            Q = G2mth.AVdeg2Q(self.rotAngle,self.rotVec)
     577            self.Trans = G2mth.Q2Mat(Q)
     578            self.Draw()
     579           
     580        self.panel.Destroy()
     581        self.panel = wx.Panel(self)
     582        Ind = {}
     583        mainSizer = wx.BoxSizer(wx.VERTICAL)
     584        MatSizer = wx.BoxSizer(wx.HORIZONTAL)
     585        transSizer = wx.BoxSizer(wx.VERTICAL)
     586        transSizer.Add(wx.StaticText(self.panel,label=" XYZ Transformation matrix && vector: "+ \
     587            "\n B*M*A*(X-V)+V = X'\n A,B: Cartesian transformation matrices"))
     588        Trmat = wx.FlexGridSizer(3,5,0,0)
     589        for iy,line in enumerate(self.Trans):
     590            for ix,val in enumerate(line):
     591                item = wx.TextCtrl(self.panel,value='%5.3f'%(val),
     592                    size=(50,25),style=wx.TE_PROCESS_ENTER)
     593                Ind[item.GetId()] = [ix,iy]
     594                item.Bind(wx.EVT_TEXT_ENTER,OnMatValue)
     595                item.Bind(wx.EVT_KILL_FOCUS,OnMatValue)
     596                Trmat.Add(item)
     597            Trmat.Add((25,0),0)
     598            vec = wx.TextCtrl(self.panel,value='%5.3f'%(self.Vec[iy]),
     599                    size=(50,25),style=wx.TE_PROCESS_ENTER)
     600            Ind[vec.GetId()] = [iy]       
     601            vec.Bind(wx.EVT_TEXT_ENTER,OnVecValue)
     602            vec.Bind(wx.EVT_KILL_FOCUS,OnVecValue)
     603            Trmat.Add(vec)
     604        transSizer.Add(Trmat)
     605        MatSizer.Add((10,0),0)
     606        MatSizer.Add(transSizer)
     607        mainSizer.Add(MatSizer)
     608        rotationBox = wx.BoxSizer(wx.HORIZONTAL)
     609        rotationBox.Add(wx.StaticText(self.panel,label=' Rotation angle: '),0,WACV)
     610        rotangle = wx.TextCtrl(self.panel,value='%5.3f'%(self.rotAngle),
     611            size=(50,25),style=wx.TE_PROCESS_ENTER)
     612        rotangle.Bind(wx.EVT_TEXT_ENTER,OnRotAngle)
     613        rotangle.Bind(wx.EVT_KILL_FOCUS,OnRotAngle)
     614        rotationBox.Add(rotangle,0,WACV)
     615        rotationBox.Add(wx.StaticText(self.panel,label=' about vector: '),0,WACV)
     616        rotvec = wx.TextCtrl(self.panel,value='%5.3f %5.3f %5.3f'%(self.rotVec[0],self.rotVec[1],self.rotVec[2]),
     617            size=(100,25),style=wx.TE_PROCESS_ENTER)
     618        rotvec.Bind(wx.EVT_TEXT_ENTER,OnRotVec)
     619        rotvec.Bind(wx.EVT_KILL_FOCUS,OnRotVec)
     620        rotationBox.Add(rotvec,0,WACV)
     621        mainSizer.Add(rotationBox,0,WACV)
     622        expandChoice = ['','xy','xz','yz','xyz']
     623        expandBox = wx.BoxSizer(wx.HORIZONTAL)
     624        expandBox.Add(wx.StaticText(self.panel,label=' Expand -1 to +1 on: '),0,WACV)
     625        expand = wx.ComboBox(self.panel,value=self.Expand,choices=expandChoice,
     626            style=wx.CB_READONLY|wx.CB_DROPDOWN)
     627        expand.Bind(wx.EVT_COMBOBOX,OnExpand)
     628        expandBox.Add(expand,0,WACV)
     629        expandBox.Add(wx.StaticText(self.panel,label=' and find unique atoms '),0,WACV)       
     630        mainSizer.Add(expandBox)
     631               
     632        OkBtn = wx.Button(self.panel,-1,"Ok")
     633        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     634        cancelBtn = wx.Button(self.panel,-1,"Cancel")
     635        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     636        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     637        btnSizer.Add((20,20),1)
     638        btnSizer.Add(OkBtn)
     639        btnSizer.Add((20,20),1)
     640        btnSizer.Add(cancelBtn)
     641        btnSizer.Add((20,20),1)
     642       
     643        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     644        self.panel.SetSizer(mainSizer)
     645        self.panel.Fit()
     646        self.Fit()
     647
     648    def GetSelection(self):
     649        return self.Trans,self.Vec,self.Expand
     650
     651    def OnOk(self,event):
     652        parent = self.GetParent()
     653        parent.Raise()
     654        self.EndModal(wx.ID_OK)
     655
     656    def OnCancel(self,event):
     657        parent = self.GetParent()
     658        parent.Raise()
     659        self.EndModal(wx.ID_CANCEL)   
    519660       
    520661################################################################################
     
    17611902        self.AtomEdit.Append(id=wxID_ATOMSTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
    17621903            help='Select atoms to transform first')
     1904        self.AtomEdit.Append(id=wxID_ATOMSROTATE, kind=wx.ITEM_NORMAL,text='Rotate atoms',
     1905            help='Select atoms to rotate first')
    17631906        self.AtomEdit.Append(id=wxID_MAKEMOLECULE, kind=wx.ITEM_NORMAL,text='Assemble molecule',
    17641907            help='Assemble molecule from scatterd atom positions')
Note: See TracChangeset for help on using the changeset viewer.