@@ -7221,7 +7221,241 @@ def OnDefineRB(event):
72217221 G2frame.GetStatusBar().SetStatusText('New rigid body UNKRB added to set of Residue rigid bodies',1)
72227222
72237223##### Draw Atom routines ################################################################################
7224+ def UpdateDrawAtoms(G2frame,data,atomStyle=''):
7225+ drawAtoms = G2frame.drawAtoms
7226+ def RefreshDrawAtomGrid(event):
7227+ def SetChoice(name,c,n=0):
7228+ choice = []
7229+ for r in range(len(atomData)):
7230+ if n:
7231+ srchStr = str(atomData[r][c][:n])
7232+ else:
7233+ srchStr = str(atomData[r][c])
7234+ if srchStr not in choice:
7235+ if n:
7236+ choice.append(str(atomData[r][c][:n]))
7237+ else:
7238+ choice.append(str(atomData[r][c]))
7239+ choice.sort()
7240+
7241+ dlg = wx.MultiChoiceDialog(G2frame,'Select',name,choice)
7242+ if dlg.ShowModal() == wx.ID_OK:
7243+ sel = dlg.GetSelections()
7244+ parms = []
7245+ for x in sel:
7246+ parms.append(choice[x])
7247+ drawAtoms.ClearSelection()
7248+ drawingData['selectedAtoms'] = []
7249+ for row in range(len(atomData)):
7250+ test = atomData[row][c]
7251+ if n:
7252+ test = test[:n]
7253+ if test in parms:
7254+ drawAtoms.SelectRow(row,True)
7255+ drawingData['selectedAtoms'].append(row)
7256+ G2plt.PlotStructure(G2frame,data)
7257+ dlg.Destroy()
7258+
7259+ r,c = event.GetRow(),event.GetCol()
7260+ if r < 0 and c < 0:
7261+ for row in range(drawAtoms.GetNumberRows()):
7262+ drawingData['selectedAtoms'].append(row)
7263+ drawAtoms.SelectRow(row,True)
7264+ elif r < 0: #dclick on col label
7265+ # sel = -1
7266+ if drawAtoms.GetColLabelValue(c) == 'Style':
7267+ DrawAtomStyle(event)
7268+ elif drawAtoms.GetColLabelValue(c) == 'Label':
7269+ DrawAtomLabel(event)
7270+ elif drawAtoms.GetColLabelValue(c) == 'Color':
7271+ DrawAtomColor(event)
7272+ elif drawAtoms.GetColLabelValue(c) == 'Residue':
7273+ SetChoice('Residue',c,3)
7274+ elif drawAtoms.GetColLabelValue(c) == '1-letter':
7275+ SetChoice('1-letter',c,1)
7276+ elif drawAtoms.GetColLabelValue(c) == 'Chain':
7277+ SetChoice('Chain',c)
7278+ elif drawAtoms.GetColLabelValue(c) == 'Name':
7279+ SetChoice('Name',c)
7280+ elif drawAtoms.GetColLabelValue(c) == 'Sym Op':
7281+ SetChoice('Name',c)
7282+ elif drawAtoms.GetColLabelValue(c) == 'Type':
7283+ SetChoice('Type',c)
7284+ elif drawAtoms.GetColLabelValue(c) in ['x','y','z','I/A']:
7285+ drawAtoms.ClearSelection()
7286+ else:
7287+ if drawAtoms.GetColLabelValue(c) in ['Style','Label']:
7288+ atomData[r][c] = drawAtoms.GetCellValue(r,c)
7289+ FindBondsDraw(data)
7290+ elif drawAtoms.GetColLabelValue(c) == 'Color':
7291+ colors = wx.ColourData()
7292+ colors.SetChooseFull(True)
7293+ dlg = wx.ColourDialog(G2frame.GetParent(),colors)
7294+ if dlg.ShowModal() == wx.ID_OK:
7295+ color = dlg.GetColourData().GetColour()[:3]
7296+ attr = wg.GridCellAttr() #needs to be here - gets lost if outside loop!
7297+ attr.SetReadOnly(True)
7298+ attr.SetBackgroundColour(color)
7299+ atomData[r][c] = color
7300+ drawingData['Atoms'][r][c] = color
7301+ drawAtoms.SetAttr(i,cs+2,attr)
7302+ dlg.Destroy()
7303+ UpdateDrawAtoms(G2frame,data)
7304+ G2plt.PlotStructure(G2frame,data)
72247305
7306+ def NextAtom(event):
7307+ 'respond to a tab by cycling through the atoms'
7308+ next = 0
7309+ for r in drawAtoms.GetSelectedRows():
7310+ next = r + 1
7311+ break
7312+ if next >= drawAtoms.GetNumberRows():
7313+ next = 0
7314+ drawAtoms.ClearSelection()
7315+ drawAtoms.SelectRow(next,True)
7316+ drawAtoms.MakeCellVisible(next,0)
7317+ drawingData['selectedAtoms'] = drawAtoms.GetSelectedRows()
7318+ G2plt.PlotStructure(G2frame,data)
7319+ G2frame.Raise()
7320+
7321+ def RowSelect(event):
7322+ r,c = event.GetRow(),event.GetCol()
7323+ if r < 0 and c < 0:
7324+ if drawAtoms.IsSelection():
7325+ drawAtoms.ClearSelection()
7326+ elif c < 0: #only row clicks
7327+ if event.ControlDown():
7328+ if r in drawAtoms.GetSelectedRows():
7329+ drawAtoms.DeselectRow(r)
7330+ else:
7331+ drawAtoms.SelectRow(r,True)
7332+ elif event.ShiftDown():
7333+ indxs = drawAtoms.GetSelectedRows()
7334+ drawAtoms.ClearSelection()
7335+ ibeg = 0
7336+ if indxs:
7337+ ibeg = indxs[-1]
7338+ for row in range(ibeg,r+1):
7339+ drawAtoms.SelectRow(row,True)
7340+ else:
7341+ G2frame.GetStatusBar().SetStatusText('Use right mouse click to brng up Draw Atom editing options',1)
7342+ drawAtoms.ClearSelection()
7343+ drawAtoms.SelectRow(r,True)
7344+ drawingData['selectedAtoms'] = []
7345+ drawingData['selectedAtoms'] = drawAtoms.GetSelectedRows()
7346+ G2plt.PlotStructure(G2frame,data)
7347+
7348+ #### UpdateDrawAtoms executable code starts here
7349+ topSizer = G2frame.dataWindow.topBox
7350+ topSizer.Clear(True)
7351+ parent = G2frame.dataWindow.topPanel
7352+ lbl= f"Draw Atom list for {data['General']['Name']!r}"[:60]
7353+ topSizer.Add(wx.StaticText(parent,label=lbl),0,WACV)
7354+ topSizer.Add((-1,-1),1,wx.EXPAND)
7355+ topSizer.Add(G2G.HelpButton(parent,helpIndex=G2frame.dataWindow.helpKey))
7356+ wx.CallAfter(G2frame.dataWindow.SetDataSize)
7357+ G2frame.GetStatusBar().SetStatusText('',1)
7358+ oldSizer = G2frame.drawAtomsList.GetSizer()
7359+ if oldSizer: # 2nd+ use, clear out old entries
7360+ for i in oldSizer.GetChildren(): # look for grids in sizer
7361+ if type(i.GetWindow()) is G2G.GSGrid:
7362+ oldSizer.Detach(i.GetWindow()) # don't delete them
7363+ oldSizer.Clear(True)
7364+ generalData = data['General']
7365+ SetupDrawingData()
7366+ drawingData = data['Drawing']
7367+ SetDrawingDefaults(drawingData)
7368+ cx,ct,cs,ci = drawingData['atomPtrs']
7369+ atomData = drawingData['Atoms']
7370+ if atomStyle:
7371+ for atom in atomData:
7372+ atom[cs] = atomStyle
7373+ Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,]+3*[wg.GRID_VALUE_FLOAT+':10,5',]+ \
7374+ [wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,polyhedra",
7375+ wg.GRID_VALUE_CHOICE+": ,type,name,number",wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,]
7376+ # styleChoice = DrawStyleChoice
7377+ # labelChoice = [' ','type','name','number']
7378+ colLabels = ['Name','Type','x','y','z','Sym Op','Style','Label','Color','I/A']
7379+ if generalData['Type'] == 'macromolecular':
7380+ colLabels = ['Residue','1-letter','Chain'] + colLabels
7381+ Types = 3*[wg.GRID_VALUE_STRING,]+Types
7382+ Types[8] = wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,backbone,ribbons,schematic"
7383+ # styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','backbone','ribbons','schematic']
7384+ # labelChoice = [' ','type','name','number','residue','1-letter','chain']
7385+ Types[9] = wg.GRID_VALUE_CHOICE+": ,type,name,number,residue,1-letter,chain"
7386+ elif generalData['Type'] == 'magnetic':
7387+ colLabels = colLabels[:5]+['Mx','My','Mz']+colLabels[5:]
7388+ Types = Types[:5]+3*[wg.GRID_VALUE_FLOAT+':10,4',]+Types[5:]
7389+ table = []
7390+ rowLabels = []
7391+ for i,atom in enumerate(drawingData['Atoms']):
7392+ table.append(atom[:colLabels.index('I/A')+1])
7393+ rowLabels.append(str(i))
7394+
7395+ G2frame.atomTable = None
7396+ G2frame.atomTable = G2G.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
7397+ drawAtoms.SetTable(G2frame.atomTable, True)
7398+ drawAtoms.SetMargins(0,0)
7399+ drawAtoms.AutoSizeColumns(True)
7400+ drawAtoms.SetColSize(colLabels.index('Style'),80)
7401+ drawAtoms.SetColSize(colLabels.index('Color'),50)
7402+ drawAtoms.SetRowLabelSize(45)
7403+ if 'phoenix' in wx.version():
7404+ drawAtoms.Unbind(wg.EVT_GRID_CELL_CHANGED)
7405+ drawAtoms.Bind(wg.EVT_GRID_CELL_CHANGED, RefreshDrawAtomGrid)
7406+ else:
7407+ drawAtoms.Unbind(wg.EVT_GRID_CELL_CHANGE)
7408+ drawAtoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshDrawAtomGrid)
7409+ drawAtoms.Unbind(wg.EVT_GRID_LABEL_LEFT_DCLICK)
7410+ drawAtoms.Unbind(wg.EVT_GRID_CELL_LEFT_DCLICK)
7411+ drawAtoms.Unbind(wg.EVT_GRID_LABEL_LEFT_CLICK)
7412+ drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshDrawAtomGrid)
7413+ drawAtoms.Bind(wg.EVT_GRID_CELL_LEFT_DCLICK, RefreshDrawAtomGrid)
7414+ drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect)
7415+
7416+ lblList = ('Delete','Set atom style','Set atom label',
7417+ 'Set atom color','Set view point','Generate copy',
7418+ 'Generate surrounding sphere','Transform atoms',
7419+ 'Generate bonded','Select from list')
7420+ callList = (DrawAtomsDelete,DrawAtomStyle, DrawAtomLabel,
7421+ DrawAtomColor,SetViewPoint,AddSymEquiv,
7422+ AddSphere,AddBox,TransformSymEquiv,
7423+ FillCoordSphere,SelDrawList)
7424+ onRightClick = drawAtoms.setupPopup(lblList,callList)
7425+ drawAtoms.Bind(wg.EVT_GRID_CELL_RIGHT_CLICK, onRightClick)
7426+ drawAtoms.Bind(wg.EVT_GRID_LABEL_RIGHT_CLICK, onRightClick)
7427+
7428+ try:
7429+ drawAtoms.Bind(wg.EVT_GRID_TABBING, NextAtom)
7430+ except: # patch: for pre-2.9.5 wx
7431+ pass
7432+ for i,atom in enumerate(drawingData['Atoms']):
7433+ attr = wg.GridCellAttr() #needs to be here - gets lost if outside loop!
7434+ attr.SetReadOnly(True)
7435+ attr.SetBackgroundColour(atom[cs+2])
7436+ drawAtoms.SetAttr(i,cs+2,attr)
7437+ drawAtoms.SetCellValue(i,cs+2,'')
7438+ indx = drawingData['selectedAtoms']
7439+ if indx:
7440+ for r in range(len(atomData)):
7441+ if r in indx:
7442+ drawAtoms.SelectRow(r)
7443+ for c in range(len(colLabels)):
7444+ attr = wg.GridCellAttr() #needs to be here - gets lost if outside loop!
7445+ attr.SetReadOnly(True)
7446+ attr.SetBackgroundColour(VERY_LIGHT_GREY)
7447+ if colLabels[c] not in ['Style','Label','Color']:
7448+ drawAtoms.SetColAttr(c,attr)
7449+
7450+ mainSizer = wx.BoxSizer(wx.VERTICAL)
7451+ mainSizer.Add(drawAtoms,1,wx.EXPAND)
7452+ drawAtoms.SetScrollRate(10,10) # allow grid to scroll
7453+ SetPhaseWindow(G2frame.drawAtomsList,mainSizer)
7454+
7455+ FindBondsDraw(data)
7456+ drawAtoms.ClearSelection()
7457+ G2frame.drawAtoms = drawAtoms
7458+
72257459 def DrawAtomStyle(event):
72267460 cx,ct,cs,ci = G2mth.getAtomPtrs(data,draw=True)
72277461 indx = getAtomSelections(G2frame.drawAtoms,ct-1)
@@ -8168,8 +8402,8 @@ def RandomizedAction(event):
81688402 ranDrwDict['msgWin'].Show()
81698403 G2phsG2.UpdateDrawAtoms(G2frame,data)
81708404
8171- #### Draw Options page ################################################################################
8172- def UpdateDrawOptions():
8405+ # # ### Draw Options page ################################################################################
8406+ def UpdateDrawOptions(G2frame,data ):
81738407 def SlopSizer():
81748408 def OnCameraPos():
81758409 #old code
@@ -8602,6 +8836,7 @@ def onLeave(*args,**kwargs):
86028836 return mapSizer
86038837
86048838 # UpdateDrawOptions exectable code starts here
8839+ drawOptions = G2frame.drawOptions
86058840 topSizer = G2frame.dataWindow.topBox
86068841 topSizer.Clear(True)
86078842 parent = G2frame.dataWindow.topPanel
@@ -12997,11 +13232,11 @@ def ChangePage(page):
1299713232 elif text == 'Draw Options':
1299813233 G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DataDrawOptions)
1299913234 G2plt.PlotStructure(G2frame,data,firstCall=True)
13000- UpdateDrawOptions()
13235+ UpdateDrawOptions(G2frame,data )
1300113236 elif text == 'Draw Atoms':
1300213237 G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DrawAtomsMenu)
1300313238 G2plt.PlotStructure(G2frame,data,firstCall=True)
13004- G2phsG2. UpdateDrawAtoms(G2frame,data)
13239+ UpdateDrawAtoms(G2frame,data)
1300513240 elif text == 'Deformation':
1300613241 G2gd.SetDataMenuBar(G2frame,G2frame.dataWindow.DeformationMenu)
1300713242 G2plt.PlotStructure(G2frame,data,firstCall=True)
@@ -13353,8 +13588,8 @@ def renamePhaseName(phaseItem,generalData,newName):
1335313588 G2frame.layerData = wx.ScrolledWindow(G2frame.phaseDisplay)
1335413589 G2frame.phaseDisplay.AddPage(G2frame.layerData,'Layers')
1335513590 Pages.append('Layers')
13356- drawOptions = wx.ScrolledWindow(G2frame.phaseDisplay)
13357- G2frame.phaseDisplay.AddPage(drawOptions,'Draw Options')
13591+ G2frame. drawOptions = wx.ScrolledWindow(G2frame.phaseDisplay)
13592+ G2frame.phaseDisplay.AddPage(G2frame. drawOptions,'Draw Options')
1335813593 Pages.append('Draw Options')
1335913594 G2frame.drawAtomsList = wx.Panel(G2frame.phaseDisplay)
1336013595 G2frame.drawAtoms = G2G.GSGrid(G2frame.drawAtomsList)
0 commit comments