Changeset 683


Ignore:
Timestamp:
Jul 10, 2012 10:23:32 AM (9 years ago)
Author:
vondreele
Message:

fix dlg.Destroy as needed
continue restraints work

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r682 r683  
    12261226            parent.Raise()
    12271227            self.EndModal(wx.ID_OK)             
    1228             #self.Destroy()
    12291228           
    12301229        def OnCancel(self,event):
     
    12321231            parent.Raise()
    12331232            self.EndModal(wx.ID_CANCEL)             
    1234             #self.Destroy()
    12351233           
    12361234        def GetData(self):
     
    13411339            parent.Raise()
    13421340            self.EndModal(wx.ID_OK)             
    1343             #self.Destroy() -- do this later, after using GetData
    13441341           
    13451342        def OnCancel(self,event):
     
    13471344            parent.Raise()
    13481345            self.EndModal(wx.ID_CANCEL)             
    1349             #self.Destroy()
    13501346           
    13511347        def GetData(self):
     
    19731969        HKLFdata['Instrument Parameters'] = self.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(self,HKLFname,'Instrument Parameters'))
    19741970        return HKLFdata
    1975                    
    1976     def GetUsedHistogramsAndPhasesfromTree(self):
    1977         ''' Returns all histograms that are found in any phase
    1978         and any phase that uses a histogram
    1979         return:
    1980             Histograms = dictionary of histograms as {name:data,...}
    1981             Phases = dictionary of phases that use histograms
    1982         '''
     1971       
     1972    def GetPhaseData(self):
    19831973        phaseData = {}
    19841974        if G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     
    19911981            while item:
    19921982                phaseData[self.PatternTree.GetItemText(item)] =  self.PatternTree.GetItemPyData(item)               
    1993                 item, cookie = self.PatternTree.GetNextChild(sub, cookie)               
     1983                item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     1984        return phaseData               
     1985                   
     1986    def GetUsedHistogramsAndPhasesfromTree(self):
     1987        ''' Returns all histograms that are found in any phase
     1988        and any phase that uses a histogram
     1989        return:
     1990            Histograms = dictionary of histograms as {name:data,...}
     1991            Phases = dictionary of phases that use histograms
     1992        '''
     1993        phaseData = self.GetPhaseData()
    19941994        Histograms = {}
    19951995        Phases = {}
  • trunk/GSASIIIO.py

    r678 r683  
    998998        # select one or more from a from list
    999999        choices = [i.filename for i in zinfo]
    1000         dlg = wx.MultiChoiceDialog(
    1001             parent,
    1002             'Select file(s) to extract from zip file'+str(filename),
    1003             'Choose file(s)',
    1004             choices,
    1005             wx.CHOICEDLG_STYLE,
    1006             )
     1000        dlg = wx.MultiChoiceDialog(parent,'Select file(s) to extract from zip file'+str(filename),
     1001            'Choose file(s)',choices,wx.CHOICEDLG_STYLE,)
    10071002        if dlg.ShowModal() == wx.ID_OK:
    10081003            zlist = dlg.GetSelections()
    1009             dlg.Destroy()
    10101004        else:
    1011             dlg.Destroy()
    10121005            zlist = []
     1006        dlg.Destroy()
    10131007    else:
    10141008        # select one from a from list
    10151009        choices = [i.filename for i in zinfo]
    1016         dlg = wx.SingleChoiceDialog(
    1017             parent,
    1018             'Select file to extract from zip file'+str(filename),
    1019             'Choose file',
    1020             choices,
    1021             )
     1010        dlg = wx.SingleChoiceDialog(parent,
     1011            'Select file to extract from zip file'+str(filename),'Choose file',
     1012            choices,)
    10221013        if dlg.ShowModal() == wx.ID_OK:
    10231014            zlist = [dlg.GetSelection()]
    1024             dlg.Destroy()
    10251015        else:
    1026             dlg.Destroy()
    10271016            zlist = [-1]
     1017        dlg.Destroy()
    10281018       
    10291019    outlist = []
     
    10331023            if os.path.exists(efil) and confirmoverwrite:
    10341024                result = wx.ID_NO
    1035                 dlg = wx.MessageDialog(
    1036                     parent,
     1025                dlg = wx.MessageDialog(parent,
    10371026                    'File '+str(efil)+' already exists. OK to overwrite it?',
    1038                     'Confirm overwrite',
    1039                     wx.YES_NO | wx.ICON_QUESTION)
     1027                    'Confirm overwrite',wx.YES_NO | wx.ICON_QUESTION)
    10401028                try:
    10411029                    result = dlg.ShowModal()
     
    10991087        #print 'created',self.__class__
    11001088
    1101     def BlockSelector(self, ChoiceList, ParentFrame=None,
    1102                       title='Select a block',
    1103                       size=None, header='Block Selector'):
     1089    def BlockSelector(self, ChoiceList, ParentFrame=None,itle='Select a block',
     1090        size=None, header='Block Selector'):
    11041091        ''' Provide a wx dialog to select a block if the file contains more
    11051092        than one set of data and one must be selected
    11061093        '''
    1107         dlg = wx.SingleChoiceDialog(
    1108             ParentFrame,
    1109             title, header,
    1110             ChoiceList,
    1111             )
     1094        dlg = wx.SingleChoiceDialog(ParentFrame,title, header,ChoiceList,)
    11121095        if size: dlg.SetSize(size)
    11131096        if dlg.ShowModal() == wx.ID_OK:
    11141097            sel = dlg.GetSelection()
    1115             dlg.Destroy()
    11161098            return sel
    11171099        else:
    1118             dlg.Destroy()
    11191100            return None
     1101        dlg.Destroy()
    11201102
    11211103    def MultipleBlockSelector(self, ChoiceList, ParentFrame=None,
    1122                       title='Select a block',
    1123                       size=None, header='Block Selector'):
     1104        title='Select a block',size=None, header='Block Selector'):
    11241105        ''' Provide a wx dialog to select a block of data if the file contains more
    11251106        than one set of data and one must be selected.
    11261107        Returns a list of the selected blocks
    11271108        '''
    1128         dlg = wx.MultiChoiceDialog(
    1129             ParentFrame,
    1130             title, header,
    1131             ChoiceList+['Select all'],
    1132             wx.CHOICEDLG_STYLE
    1133             )
     1109        dlg = wx.MultiChoiceDialog(ParentFrame,title, header,ChoiceList+['Select all'],
     1110            wx.CHOICEDLG_STYLE)
    11341111        if size: dlg.SetSize(size)
    11351112        if dlg.ShowModal() == wx.ID_OK:
    11361113            sel = dlg.GetSelections()
    1137             dlg.Destroy()
    11381114        else:
    1139             dlg.Destroy()
    11401115            return []
     1116        dlg.Destroy()
    11411117        selected = []
    11421118        if len(ChoiceList) in sel:
     
    11571133        result = None
    11581134        dlg = MultipleChoicesDialog(choicelist,headinglist,
    1159                                     parent=ParentFrame, **kwargs)         
     1135            parent=ParentFrame, **kwargs)         
    11601136        if dlg.ShowModal() == wx.ID_OK:
    11611137            result = dlg.chosen
  • trunk/GSASIIgrid.py

    r661 r683  
    5555] = [wx.NewId() for item in range(12)]
    5656
     57[ wxID_DRAWRESTRBOND, wxID_DRAWRESTRANGLE, wxID_DRAWRESTRPLANE, wxID_DRAWRESTRCHIRAL,
     58] = [wx.NewId() for item in range(4)]
     59
    5760[ wxID_CLEARTEXTURE,wxID_REFINETEXTURE,
    5861] = [wx.NewId() for item in range(2)]
     
    8487] = [wx.NewId() for item in range(4)]
    8588
    86 [ wxID_RESTRAINTADD,wxID_PWDANALYSIS,
    87 ] = [wx.NewId() for item in range(2)]
     89[ wxID_RESTRAINTADD,wxID_PWDANALYSIS, wxID_RESTSELPHASE,
     90] = [wx.NewId() for item in range(3)]
    8891
    8992[ wxID_SAVESEQSEL,
     
    278281        self.RestraintMenu.Append(menu=self.RestraintEdit, title='Edit')
    279282        self.RestraintMenu.Append(menu=MyHelp(self,helpType='Restraints'),title='&Help')
    280         self.RestraintEdit.Append(id=wxID_RESTRAINTADD, kind=wx.ITEM_NORMAL,text='Add restraint',
    281             help='restraint dummy menu item')
     283        self.RestraintEdit.Append(id=wxID_RESTSELPHASE, kind=wx.ITEM_NORMAL,text='Select phase',
     284            help='Select phase')
     285        self.RestraintEdit.Append(id=wxID_RESTRAINTADD, kind=wx.ITEM_NORMAL,text='Add restraints',
     286            help='Add restraints')
    282287           
    283288# Sequential results
     
    500505            help='Reload atom drawing list')
    501506        self.AtomCompute.Append(id=wxID_ATOMSDISAGL, kind=wx.ITEM_NORMAL,text='Distances & Angles',
    502             help='Compute distances & angles for selected atoms')   
     507            help='Compute distances & angles for selected atoms')
    503508                 
    504509# Phase / Draw Options tab
     
    510515        self.DrawAtomEdit = wx.Menu(title='')
    511516        self.DrawAtomCompute = wx.Menu(title='')
     517        self.DrawAtomRestraint = wx.Menu(title='')
    512518        self.DrawAtomsMenu.Append(menu=self.DrawAtomEdit, title='Edit')
    513519        self.DrawAtomsMenu.Append(menu=self.DrawAtomCompute,title='Compute')
     520        self.DrawAtomsMenu.Append(menu=self.DrawAtomRestraint, title='Restraints')
    514521        self.DrawAtomsMenu.Append(menu=MyHelp(self,helpType='Draw Atoms'),title='&Help')
    515522        self.DrawAtomEdit.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
     
    537544        self.DrawAtomCompute.Append(id=wxID_DRAWPLANE, kind=wx.ITEM_NORMAL,text='Best plane',
    538545            help='Compute best plane for 4+ selected atoms')   
     546        self.DrawAtomRestraint.Append(id=wxID_DRAWRESTRBOND, kind=wx.ITEM_NORMAL,text='Add bond restraint',
     547            help='Add bond restraint for selected atoms (2)')
     548        self.DrawAtomRestraint.Append(id=wxID_DRAWRESTRANGLE, kind=wx.ITEM_NORMAL,text='Add angle restraint',
     549            help='Add angle restraint for selected atoms (3: one end 1st)')
     550        self.DrawAtomRestraint.Append(id=wxID_DRAWRESTRPLANE, kind=wx.ITEM_NORMAL,text='Add plane restraint',
     551            help='Add plane restraint for selected atoms (4+)')
     552        self.DrawAtomRestraint.Append(id=wxID_DRAWRESTRCHIRAL, kind=wx.ITEM_NORMAL,text='Add chiral restraint',
     553            help='Add chiral restraint for selected atoms (4: center atom 1st)')
    539554           
    540555# Phase / Texture tab
     
    15691584    elif warnmsg:
    15701585        print 'Unexpected contraint warning:\n',warnmsg
    1571 
    1572 def UpdateRestraints(G2frame,data):
    1573 
     1586       
     1587def UpdateRestraints(G2frame,data,Phases,phaseName):
     1588    if not len(Phases):
     1589        print 'There are no phases to form restraints'
     1590        return
     1591    phasedata = Phases[phaseName]
     1592    if phaseName not in data:
     1593        data[phaseName] = {}
     1594    restrData = data[phaseName]
     1595    if 'Bond' not in restrData:
     1596        restrData['Bond'] = {'wtFactor':1.0,'Bonds':[]}
     1597    if 'Angle' not in restrData:
     1598        restrData['Angle'] = {'wtFactor':1.0,'Angles':[]}
     1599    if 'Plane' not in restrData:
     1600        restrData['Plane'] = {'wtFactor':1.0,'Planes':[]}
     1601    if 'Chiral' not in restrData:
     1602        restrData['Chiral'] = {'wtFactor':1.0,'Volumes':[]}
     1603   
     1604    def OnSelectPhase(event):
     1605        dlg = wx.SingleChoiceDialog(G2frame,'Select','Phase',Phases.keys())
     1606        try:
     1607            if dlg.ShowModal() == wx.ID_OK:
     1608                phaseName = Phases.keys()[dlg.GetSelection()]
     1609                UpdateRestraints(G2frame,data,Phases,phaseName)
     1610        finally:
     1611            dlg.Destroy()
     1612   
    15741613    def OnAddRestraint(event):
    15751614        page = G2frame.dataDisplay.GetSelection()
    1576         print G2frame.dataDisplay.GetPageText(page)
    1577 
    1578     def UpdateAtomRestr():
    1579         AtomRestr.DestroyChildren()
    1580         dataDisplay = wx.Panel(AtomRestr)
     1615        if 'Bond' in G2frame.dataDisplay.GetPageText(page):
     1616            AddBondRestraint()
     1617        elif 'Angle' in G2frame.dataDisplay.GetPageText(page):
     1618            AddAngleRestraint()
     1619        elif 'Plane' in G2frame.dataDisplay.GetPageText(page):
     1620            AddPlaneRestraint()
     1621        elif 'Chiral' in G2frame.dataDisplay.GetPageText(page):
     1622            AddChiralRestraint()
     1623           
     1624    def AddBondRestraint():
     1625        print 'Bond restraint'
     1626
     1627    def AddAngleRestraint():
     1628        print 'Angle restraint'
     1629
     1630    def AddPlaneRestraint():
     1631        print 'Plane restraint'
     1632
     1633    def AddChiralRestraint():
     1634        print 'Chiral restraint'
     1635       
     1636    def WtBox(wind,restData):
     1637       
     1638        def OnWtFactor(event):
     1639            try:
     1640                value = float(wtfactor.GetValue())
     1641            except ValueError:
     1642                value = 1.0
     1643            restData['wtFactor'] = value
     1644            wtfactor.SetValue('%.2f'%(value))
     1645           
     1646        wtBox = wx.BoxSizer(wx.HORIZONTAL)
     1647        wtBox.Add(wx.StaticText(wind,-1,'Restraint weight factor:'),0,wx.ALIGN_CENTER_VERTICAL)
     1648        wtfactor = wx.TextCtrl(wind,-1,value='%.2f'%(restData['wtFactor']),style=wx.TE_PROCESS_ENTER)
     1649        wtfactor.Bind(wx.EVT_TEXT_ENTER,OnWtFactor)
     1650        wtfactor.Bind(wx.EVT_KILL_FOCUS,OnWtFactor)
     1651        wtBox.Add(wtfactor,0,wx.ALIGN_CENTER_VERTICAL)
     1652        return wtBox
     1653       
     1654    def UpdateBondRestr(bondRestData):
     1655        BondRestr.DestroyChildren()
     1656        dataDisplay = wx.Panel(BondRestr)
    15811657        mainSizer = wx.BoxSizer(wx.VERTICAL)
    15821658        mainSizer.Add((5,5),0)
    1583         mainSizer.Add(wx.StaticText(dataDisplay,-1,'Atom restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
    1584         mainSizer.Add((5,5),0)
    1585 
    1586 
    1587         dataDisplay.SetSizer(mainSizer)
     1659        mainSizer.Add(WtBox(BondRestr,bondRestData),0,wx.ALIGN_CENTER_VERTICAL)
     1660        for bond in bondRestData['Bonds']:
     1661            print bond
     1662
     1663        BondRestr.SetSizer(mainSizer)
    15881664        Size = mainSizer.Fit(G2frame.dataFrame)
    1589         Size[1] += 26                           #compensate for status bar
    1590         dataDisplay.SetSize(Size)
     1665        Size[1] += 25       #make room for tab
     1666        BondRestr.SetSize(Size)
    15911667        G2frame.dataFrame.setSizePosLeft(Size)
    15921668       
    1593     def UpdatePhaseRestr():
    1594         PhaseRestr.DestroyChildren()
    1595         dataDisplay = wx.Panel(PhaseRestr)
     1669    def UpdateAngleRestr(angleRestData):
     1670        AngleRestr.DestroyChildren()
     1671        dataDisplay = wx.Panel(AngleRestr)
    15961672        mainSizer = wx.BoxSizer(wx.VERTICAL)
    15971673        mainSizer.Add((5,5),0)
    1598         mainSizer.Add(wx.StaticText(dataDisplay,-1,'Phase restraint data:'),0,wx.ALIGN_CENTER_VERTICAL)
     1674        mainSizer.Add(WtBox(AngleRestr,angleRestData),0,wx.ALIGN_CENTER_VERTICAL)
     1675        for angle in angleRestData['Angles']:
     1676            print angle
     1677
     1678
     1679        AngleRestr.SetSizer(mainSizer)
     1680        Size = mainSizer.Fit(G2frame.dataFrame)
     1681        Size[1] += 25       #make room for tab
     1682        AngleRestr.SetSize(Size)
     1683        G2frame.dataFrame.setSizePosLeft(Size)
     1684   
     1685    def UpdatePlaneRestr(planeRestData):
     1686        PlaneRestr.DestroyChildren()
     1687        dataDisplay = wx.Panel(PlaneRestr)
     1688        mainSizer = wx.BoxSizer(wx.VERTICAL)
    15991689        mainSizer.Add((5,5),0)
    1600 
    1601 
    1602         dataDisplay.SetSizer(mainSizer)
     1690        mainSizer.Add(WtBox(PlaneRestr,planeRestData),0,wx.ALIGN_CENTER_VERTICAL)
     1691        for plane in planeRestData['Planes']:
     1692            print plane
     1693
     1694
     1695        PlaneRestr.SetSizer(mainSizer)
    16031696        Size = mainSizer.Fit(G2frame.dataFrame)
    1604         Size[1] += 26                           #compensate for status bar
    1605         dataDisplay.SetSize(Size)
     1697        Size[1] += 25       #make room for tab
     1698        PlaneRestr.SetSize(Size)
     1699        G2frame.dataFrame.setSizePosLeft(Size)
     1700   
     1701    def UpdateChiralRestr(chiralRestData):
     1702        ChiralRestr.DestroyChildren()
     1703        dataDisplay = wx.Panel(ChiralRestr)
     1704        mainSizer = wx.BoxSizer(wx.VERTICAL)
     1705        mainSizer.Add((5,5),0)
     1706        mainSizer.Add(WtBox(ChiralRestr,chiralRestData),0,wx.ALIGN_CENTER_VERTICAL)
     1707        for volume in chiralRestData['Volumes']:
     1708            print volume
     1709
     1710
     1711        ChiralRestr.SetSizer(mainSizer)
     1712        Size = mainSizer.Fit(G2frame.dataFrame)
     1713        Size[1] += 25       #make room for tab
     1714        ChiralRestr.SetSize(Size)
    16061715        G2frame.dataFrame.setSizePosLeft(Size)
    16071716   
     
    16091718        page = event.GetSelection()
    16101719        text = G2frame.dataDisplay.GetPageText(page)
    1611         if text == 'Atom restraints':
     1720        if text == 'Bond restraints':
    16121721            G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.RestraintMenu)
    1613             UpdateAtomRestr()
    1614         elif text == 'Phase restraints':
    1615             UpdatePhaseRestr()
     1722            bondRestData = restrData['Bond']
     1723            UpdateBondRestr(bondRestData)
     1724        elif text == 'Angle restraints':
    16161725            G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.RestraintMenu)
     1726            angleRestData = restrData['Angle']
     1727            UpdateAngleRestr(angleRestData)
     1728        elif text == 'Plane restraints':
     1729            G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.RestraintMenu)
     1730            planeRestData = restrData['Plane']
     1731            UpdatePlaneRestr(planeRestData)
     1732        elif text == 'Chiral restraints':
     1733            G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.RestraintMenu)
     1734            chiralRestData = restrData['Chiral']
     1735            UpdateChiralRestr(chiralRestData)
    16171736        event.Skip()
    16181737
    16191738    if G2frame.dataDisplay:
    16201739        G2frame.dataDisplay.Destroy()
     1740       
    16211741    G2frame.dataFrame.SetMenuBar(G2frame.dataFrame.RestraintMenu)
    1622     G2frame.dataFrame.SetLabel('restraints')
    1623     G2frame.dataFrame.CreateStatusBar()
     1742    G2frame.dataFrame.SetLabel('restraints for '+phaseName)
     1743    G2frame.dataFrame.RestraintEdit.Enable(wxID_RESTSELPHASE,False)
     1744    if len(Phases) > 1:
     1745        G2frame.dataFrame.RestraintEdit.Enable(wxID_RESTSELPHASE,True)
     1746        G2frame.dataFrame.Bind(wx.EVT_MENU, OnSelectPhase, id=wxID_RESTSELPHASE)
    16241747    G2frame.dataFrame.Bind(wx.EVT_MENU, OnAddRestraint, id=wxID_RESTRAINTADD)
    16251748    G2frame.dataDisplay = GSNoteBook(parent=G2frame.dataFrame,size=G2frame.dataFrame.GetClientSize())
    16261749   
    1627     PhaseRestr = wx.ScrolledWindow(G2frame.dataDisplay)
    1628     G2frame.dataDisplay.AddPage(PhaseRestr,'Phase restraints')
    1629     AtomRestr = wx.ScrolledWindow(G2frame.dataDisplay)
    1630     G2frame.dataDisplay.AddPage(AtomRestr,'Atom restraints')
    1631     UpdatePhaseRestr()
    1632 #    AtomRestrData = data['AtomRestr']
     1750    BondRestr = wx.ScrolledWindow(G2frame.dataDisplay)
     1751    G2frame.dataDisplay.AddPage(BondRestr,'Bond restraints')
     1752    AngleRestr = wx.ScrolledWindow(G2frame.dataDisplay)
     1753    G2frame.dataDisplay.AddPage(AngleRestr,'Angle restraints')
     1754    PlaneRestr = wx.ScrolledWindow(G2frame.dataDisplay)
     1755    G2frame.dataDisplay.AddPage(PlaneRestr,'Plane restraints')
     1756    ChiralRestr = wx.ScrolledWindow(G2frame.dataDisplay)
     1757    G2frame.dataDisplay.AddPage(ChiralRestr,'Chiral restraints')
     1758    UpdateBondRestr(restrData['Bond'])
    16331759
    16341760    G2frame.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
     
    18371963        elif G2frame.PatternTree.GetItemText(item) == 'Restraints':
    18381964            data = G2frame.PatternTree.GetItemPyData(item)
    1839             UpdateRestraints(G2frame,data)
     1965            Phases = G2frame.GetPhaseData()
     1966            phase = ''
     1967            if Phases:
     1968                phaseName = Phases.keys()[0]
     1969            UpdateRestraints(G2frame,data,Phases,phaseName)
    18401970        elif 'IMG' in G2frame.PatternTree.GetItemText(item):
    18411971            G2frame.Image = item
  • trunk/GSASIIimgGUI.py

    r675 r683  
    537537        dataSizer.Add(littleSizer,0,)
    538538        littleSizer = wx.BoxSizer(wx.HORIZONTAL)
    539         oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Appl. det. absorption?')
     539        oblique = wx.CheckBox(parent=G2frame.dataDisplay,label='Apply detector absorption?')
    540540        dataSizer.Add(oblique,0,wx.ALIGN_CENTER_VERTICAL)
    541541        oblique.Bind(wx.EVT_CHECKBOX, OnOblique)
    542542        oblique.SetValue(data['Oblique'][1])
    543         littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label=' value (0.01-0.99)  '),0,
     543        littleSizer.Add(wx.StaticText(G2frame.dataDisplay,label='Value (0.01-0.99)  '),0,
    544544            wx.ALIGN_CENTER_VERTICAL)
    545545        obliqVal = wx.TextCtrl(parent=G2frame.dataDisplay,value='%.3f'%(data['Oblique'][0]),style=wx.TE_PROCESS_ENTER)
  • trunk/GSASIImath.py

    r674 r683  
    156156                vcov[i1][i2] = 0.0
    157157    return vcov
    158    
     158
     159def getRestDist(XYZ,Amat):
     160    return np.sqrt(np.sum(np.inner(Amat,(XYZ[1]-XYZ[0]))**2))
     161
     162def getRestAngle(XYZ,Amat):
     163   
     164    def calcVec(Ox,Tx,Amat):
     165        return np.inner(Amat,(Tx-Ox))
     166
     167    VecA = calcVec(XYZ[1],XYZ[0],Amat)
     168    VecA /= np.sqrt(np.sum(VecA**2))
     169    VecB = calcVec(XYZ[1],XYZ[2],Amat)
     170    VecB /= np.sqrt(np.sum(VecB**2))
     171    edge = VecB-VecA
     172    edge = np.sum(edge**2)
     173    angle = (2.-edge)/2.
     174    angle = max(angle,-1.)
     175    return acosd(angle)
     176   
     177def getRestPlane(XYZ,Amat):
     178    sumXYZ = np.zeros(3)
     179    for xyz in XYZ:
     180        sumXYZ += xyz
     181    sumXYZ /= len(XYZ)
     182    XYZ = np.array(XYZ)-sumXYZ
     183    XYZ = np.inner(Amat,XYZ).T
     184    Zmat = np.zeros((3,3))
     185    for i,xyz in enumerate(XYZ):
     186        Zmat += np.outer(xyz.T,xyz)
     187    Evec,Emat = nl.eig(Zmat)
     188    Evec = np.sqrt(Evec)/(len(XYZ)-3)
     189    Order = np.argsort(Evec)
     190    return Evec[Order[0]]
     191   
     192def getRestChiral(XYZ,Amat):
     193   
     194    VecA = np.empty((3,3))   
     195    VecA[0] = np.inner(XYZ[1]-XYZ[0],Amat)
     196    VecA[1] = np.inner(XYZ[2]-XYZ[0],Amat)
     197    VecA[2] = np.inner(XYZ[3]-XYZ[0],Amat)
     198    return nl.det(VecA)
     199       
    159200def getDistDerv(Oxyz,Txyz,Amat,Tunit,Top,SGData):
    160201   
  • trunk/GSASIIphsGUI.py

    r682 r683  
    131131        parent.Raise()
    132132        self.EndModal(wx.ID_OK)
    133         #self.Destroy()
    134133
    135134    def OnCancel(self,event):
     
    137136        parent.Raise()
    138137        self.EndModal(wx.ID_CANCEL)
    139         #self.Destroy()
    140138
    141139class DisAglDialog(wx.Dialog):
     
    227225        parent.Raise()
    228226        self.EndModal(wx.ID_OK)             
    229         #self.Destroy()
    230227       
    231228    def OnReset(self,event):
     
    286283        parent.Raise()
    287284        self.EndModal(wx.ID_OK)             
    288         #self.Destroy()
    289285       
    290286    def OnCancel(self,event):
     
    292288        parent.Raise()
    293289        self.EndModal(wx.ID_CANCEL)             
    294         #self.Destroy()
     290       
     291def FindAtomIndexByIDs(atomData,IDs,Draw=True):
     292    indx = []
     293    for i,atom in enumerate(atomData):
     294        if Draw and atom[-3] in IDs:
     295            indx.append(i)
     296        elif atom[-1] in IDs:
     297            indx.append(i)
     298    return indx
    295299       
    296300def UpdatePhaseData(G2frame,Item,data,oldPage):
     
    913917                            if parms == atomData[row][c]:
    914918                                Atoms.SelectRow(row,True)
     919                    dlg.Destroy()
    915920                    SetupGeneral()
    916921                elif Atoms.GetColLabelValue(c) == 'residue':
     
    929934                            if parms == atomData[row][c]:
    930935                                Atoms.SelectRow(row,True)
     936                    dlg.Destroy()
    931937                elif Atoms.GetColLabelValue(c) == 'res no':
    932938                    choice = []
     
    943949                            if int(parms) == atomData[row][c]:
    944950                                Atoms.SelectRow(row,True)
     951                    dlg.Destroy()
    945952                elif Atoms.GetColLabelValue(c) == 'chain':
    946953                    choice = []
     
    13041311                        atomData[r][cid] = parm
    13051312                    FillAtomsGrid()
     1313                dlg.Destroy()
    13061314            elif parm in ['frac','Uiso']:
    13071315                limits = [0.,1.]
     
    13171325                    SetupGeneral()
    13181326                    FillAtomsGrid()
     1327                dlg.Destroy()
    13191328            elif parm in ['x','y','z']:
    13201329                limits = [-1.,1.]
     
    13271336                    SetupGeneral()
    13281337                    FillAtomsGrid()
     1338                dlg.Destroy()
    13291339
    13301340    def AtomTransform(event):
     
    14081418                DisAglData['covData'] = G2frame.PatternTree.GetItemPyData(G2gd.GetPatternTreeItemId(G2frame,G2frame.root, 'Covariance'))
    14091419            G2str.DistAngle(DisAglCtls,DisAglData)
    1410            
     1420                       
    14111421################################################################################
    14121422#Structure drawing GUI stuff               
     
    14351445        if 'contourLevel' not in drawingData:
    14361446            drawingData['contourLevel'] = 1.
    1437         cx,ct,cs = [0,0,0]
     1447        cx,ct,cs,ci = [0,0,0,0]
    14381448        if generalData['Type'] == 'nuclear':
    1439             cx,ct,cs = [2,1,6]         #x, type & style
     1449            cx,ct,cs,ci = [2,1,6,17]         #x, type, style & index
    14401450        elif generalData['Type'] == 'macromolecular':
    1441             cx,ct,cs = [5,4,9]         #x, type & style
     1451            cx,ct,cs,ci = [5,4,9,20]         #x, type, style & index
    14421452        elif generalData['Type'] == 'magnetic':
    1443             cx,ct,cs = [2,1,6]         #x, type & style
     1453            cx,ct,cs,ci = [2,1,6,20]         #x, type, style & index
    14441454#        elif generalData['Type'] == 'modulated':
    14451455#           ?????   for future
     1456        drawingData['atomPtrs'] = [cx,ct,cs,ci]
    14461457        if not drawingData.get('Atoms'):
    14471458            for atom in atomData:
    14481459                DrawAtomAdd(drawingData,atom)
    1449             drawingData['atomPtrs'] = [cx,ct,cs]
    14501460            data['Drawing'] = drawingData
    14511461           
     
    15001510        for ind in indx:
    15011511            atomData[ind] = MakeDrawAtom(atom,atomData[ind])
     1512           
     1513    def OnRestraint(event):       
     1514        indx = drawAtoms.GetSelectedRows()
     1515        restData = G2frame.PatternTree.GetItemPyData(   
     1516            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Restraints'))
     1517        drawingData = data['Drawing']
     1518        generalData = data['General']
     1519        Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7])           
     1520        cx,ct,cs,ci = drawingData['atomPtrs']
     1521        atomData = drawingData['Atoms']
     1522        atNames = []
     1523        atXYZ = []
     1524        atSymOp = []
     1525        atIndx = []
     1526        for item in indx:
     1527            atNames.append(atomData[item][ct-1])
     1528            atXYZ.append(np.array(atomData[item][cx:cx+3]))
     1529            atSymOp.append(atomData[item][cs-1])
     1530            atIndx.append(atomData[item][ci])
     1531        if event.GetId() == G2gd.wxID_DRAWRESTRBOND and len(indx) == 2:
     1532            try:
     1533                bondData = restData[PhaseName]['Bond']
     1534            except KeyError:
     1535                bondData = {'wtFactor':1.0,'Bonds':[]}
     1536                restData[PhaseName] = {}
     1537                restData[PhaseName]['Bond'] = bondData
     1538            dist = G2mth.getRestDist(atXYZ,Amat)
     1539            bondData['Bonds'].append([atNames,atSymOp,atIndx,dist,1.54,0.01])
     1540        elif event.GetId() == G2gd.wxID_DRAWRESTRANGLE and len(indx) == 3:
     1541            try:
     1542                angleData = restData[PhaseName]['Angle']
     1543            except KeyError:
     1544                angleData = {'wtFactor':1.0,'Angles':[]}
     1545                restData[PhaseName] = {}
     1546                restData[PhaseName]['Angle'] = angleData
     1547            angle = G2mth.getRestAngle(atXYZ,Amat)
     1548            angleData['Angles'].append([atNames,atSymOp,atIndx,angle,109.5,1.0])           
     1549        elif event.GetId() == G2gd.wxID_DRAWRESTRPLANE and len(indx) > 3:
     1550            try:
     1551                planeData = restData[PhaseName]['Plane']
     1552            except KeyError:
     1553                planeData = {'wtFactor':1.0,'Planes':[]}
     1554                restData[PhaseName] = {}
     1555                restData[PhaseName]['Plane'] = planeData
     1556            plane = G2mth.getRestPlane(atXYZ,Amat)
     1557            planeData['Planes'].append([atNames,atSymOp,atIndx,plane,0.0,0.01])           
     1558        elif event.GetId() == G2gd.wxID_DRAWRESTRCHIRAL and len(indx) == 4:
     1559            try:
     1560                chiralData = restData[PhaseName]['Chiral']
     1561            except KeyError:
     1562                chiralData = {'wtFactor':1.0,'Volumes':[]}
     1563                restData[PhaseName] = {}
     1564                restData[PhaseName]['Chiral'] = chiralData
     1565            volume = G2mth.getRestChiral(atXYZ,Amat)
     1566            chiralData['Volumes'].append([atNames,atSymOp,atIndx,volume,2.5,0.1])           
     1567        else:
     1568            print '**** ERROR wrong number of atoms selected for this restraint'
     1569            return
     1570        G2frame.PatternTree.SetItemPyData(   
     1571            G2gd.GetPatternTreeItemId(G2frame,G2frame.root,'Restraints'),restData)
    15021572
    15031573################################################################################
     
    15091579        SetupDrawingData()
    15101580        drawingData = data['Drawing']
    1511         cx,ct,cs = drawingData['atomPtrs']
     1581        cx,ct,cs,ci = drawingData['atomPtrs']
    15121582        atomData = drawingData['Atoms']
    15131583        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,]+3*[wg.GRID_VALUE_FLOAT+':10,5',]+ \
     
    17091779            generalData = data['General']
    17101780            atomData = data['Drawing']['Atoms']
    1711             cx,ct,cs = data['Drawing']['atomPtrs']
     1781            cx,ct,cs,ci = data['Drawing']['atomPtrs']
    17121782            styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra']
    17131783            if generalData['Type'] == 'macromolecular':
     
    17311801            generalData = data['General']
    17321802            atomData = data['Drawing']['Atoms']
    1733             cx,ct,cs = data['Drawing']['atomPtrs']
     1803            cx,ct,cs,ci = data['Drawing']['atomPtrs']
    17341804            styleChoice = [' ','type','name','number']
    17351805            if generalData['Type'] == 'macromolecular':
     
    17561826            generalData = data['General']
    17571827            atomData = data['Drawing']['Atoms']
    1758             cx,ct,cs = data['Drawing']['atomPtrs']
     1828            cx,ct,cs,ci = data['Drawing']['atomPtrs']
    17591829            atmColors = []
    17601830            atmTypes = []
     
    17891859        generalData = data['General']
    17901860        atomData = data['Drawing']['Atoms']
    1791         cx,ct,cs = data['Drawing']['atomPtrs']
     1861        cx,ct,cs,ci = data['Drawing']['atomPtrs']
    17921862        for atom in atomData:           
    17931863            atNum = generalData['AtomTypes'].index(atom[ct])
     
    19161986            atomData = data['Drawing']['Atoms']
    19171987            numAtoms = len(atomData)
    1918             cx,ct,cs = data['Drawing']['atomPtrs']
     1988            cx,ct,cs,ci = data['Drawing']['atomPtrs']
    19191989            generalData = data['General']
    19201990            SGData = generalData['SGData']
     
    19982068           
    19992069    def FindBondsToo():                         #works but slow for large structures - keep as reference
    2000         cx,ct,cs = data['Drawing']['atomPtrs']
     2070        cx,ct,cs,ci = data['Drawing']['atomPtrs']
    20012071        atomData = data['Drawing']['Atoms']
    20022072        generalData = data['General']
     
    20322102    def FindBondsDraw():                    #uses numpy & masks - very fast even for proteins!
    20332103        import numpy.ma as ma
    2034         cx,ct,cs = data['Drawing']['atomPtrs']
     2104        cx,ct,cs,ci = data['Drawing']['atomPtrs']
    20352105        hydro = data['Drawing']['showHydrogen']
    20362106        atomData = data['Drawing']['Atoms']
     
    21322202    def ChangeDrawAtomsByIDs(colName,IDs,value):
    21332203        atomData = data['Drawing']['Atoms']
    2134         cx,ct,cs = data['Drawing']['atomPtrs']
     2204        cx,ct,cs,ci = data['Drawing']['atomPtrs']
    21352205        if colName == 'Name':
    21362206            col = ct-1
     
    39344004            G2frame.dataFrame.Bind(wx.EVT_MENU, OnDrawDAT, id=G2gd.wxID_DRAWDISAGLTOR)
    39354005            G2frame.dataFrame.Bind(wx.EVT_MENU, OnDrawPlane, id=G2gd.wxID_DRAWPLANE)
     4006            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRestraint, id=G2gd.wxID_DRAWRESTRBOND)
     4007            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRestraint, id=G2gd.wxID_DRAWRESTRANGLE)
     4008            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRestraint, id=G2gd.wxID_DRAWRESTRPLANE)
     4009            G2frame.dataFrame.Bind(wx.EVT_MENU, OnRestraint, id=G2gd.wxID_DRAWRESTRCHIRAL)
    39364010            UpdateDrawAtoms()
    39374011            G2plt.PlotStructure(G2frame,data)
  • trunk/GSASIIplot.py

    r661 r683  
    23032303        flipData = generalData['Flip']                       
    23042304        flipData['mapRoll'] = [0,0,0]
    2305     cx,ct,cs = drawingData['atomPtrs']
     2305    cx,ct,cs,ci = drawingData['atomPtrs']
    23062306    Wt = np.array([255,255,255])
    23072307    Rd = np.array([255,0,0])
     
    28422842        anglex,angley,anglez = drawingData['Rotation'][:3]
    28432843        Tx,Ty,Tz = drawingData['viewPoint'][0]
    2844         cx,ct,cs = drawingData['atomPtrs']
     2844        cx,ct,cs,ci = drawingData['atomPtrs']
    28452845        bondR = drawingData['bondRadius']
    28462846        G,g = G2lat.cell2Gmat(cell)
Note: See TracChangeset for help on using the changeset viewer.