Coverage for /builds/ase/ase/ase/gui/modify.py: 95.65%
46 statements
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
« prev ^ index » next coverage.py v7.5.3, created at 2025-08-02 00:12 +0000
1# fmt: off
3from functools import partial
5import numpy as np
7import ase.gui.ui as ui
8from ase.gui.i18n import _
9from ase.gui.utils import get_magmoms
10from ase.gui.widgets import Element
13class ModifyAtoms:
14 """Presents a dialog box where the user is able to change the
15 atomic type, the magnetic moment and tags of the selected atoms.
16 """
18 def __init__(self, gui):
19 self.gui = gui
20 selected = self.selection()
21 if not selected.any():
22 ui.error(_('No atoms selected!'))
23 return
25 win = ui.Window(_('Modify'), wmtype='utility')
26 element = Element(callback=self.set_element)
27 win.add(element)
28 win.add(ui.Button(_('Change element'),
29 partial(self.set_element, element)))
30 self.tag = ui.SpinBox(0, -1000, 1000, 1, self.set_tag)
31 win.add([_('Tag'), self.tag])
32 self.magmom = ui.SpinBox(0.0, -10, 10, 0.1, self.set_magmom)
33 win.add([_('Moment'), self.magmom])
35 atoms = self.gui.atoms
36 sym = atoms.symbols[selected]
37 if len(sym.species()) == 1:
38 element.symbol = sym[0]
40 tags = atoms.get_tags()[selected]
41 if np.ptp(tags) == 0:
42 self.tag.value = tags[0]
44 magmoms = get_magmoms(atoms)[selected]
45 if np.ptp(magmoms.round(2)) == 0.0:
46 self.magmom.value = round(magmoms[0], 2)
48 def selection(self):
49 return self.gui.images.selected[:len(self.gui.atoms)]
51 def set_element(self, element):
52 self.gui.atoms.numbers[self.selection()] = element.Z
53 self.gui.draw()
55 def set_tag(self):
56 tags = self.gui.atoms.get_tags()
57 tags[self.selection()] = self.tag.value
58 self.gui.atoms.set_tags(tags)
59 self.gui.draw()
61 def set_magmom(self):
62 magmoms = get_magmoms(self.gui.atoms)
63 magmoms[self.selection()] = self.magmom.value
64 self.gui.atoms.set_initial_magnetic_moments(magmoms)
65 self.gui.draw()