Coverage for /builds/ase/ase/ase/gui/nanotube.py: 98.00%
50 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
3"""Window for setting up Carbon nanotubes and similar tubes.
4"""
7import ase.gui.ui as ui
8from ase.build import nanotube
9from ase.gui.i18n import _
10from ase.gui.widgets import Element, pybutton
12introtext = _("""\
13Set up a Carbon nanotube by specifying the (n,m) roll-up vector.
14Please note that m <= n.
16Nanotubes of other elements can be made by specifying the element
17and bond length.\
18""")
20py_template = """\
21from ase.build import nanotube
22atoms = nanotube({n}, {m}, length={length}, bond={bl:.3f}, symbol='{symb}')
23"""
25label_template = _('{natoms} atoms, diameter: {diameter:.3f} Å, '
26 'total length: {total_length:.3f} Å')
29class SetupNanotube:
30 """Window for setting up a (Carbon) nanotube."""
32 def __init__(self, gui):
33 self.element = Element('C', self.make)
34 self.bondlength = ui.SpinBox(1.42, 0.0, 10.0, 0.01, self.make)
35 self.n = ui.SpinBox(5, 1, 100, 1, self.make)
36 self.m = ui.SpinBox(5, 0, 100, 1, self.make)
37 self.length = ui.SpinBox(1, 1, 100, 1, self.make)
38 self.description = ui.Label('')
40 win = self.win = ui.Window(_('Nanotube'), wmtype='utility')
41 win.add(ui.Text(introtext))
42 win.add(self.element)
43 win.add([_('Bond length: '),
44 self.bondlength,
45 _('Å')])
46 win.add(_('Select roll-up vector (n,m) and tube length:'))
47 win.add(['n:', self.n,
48 'm:', self.m,
49 _('Length:'), self.length])
50 win.add(self.description)
51 win.add([pybutton(_('Creating a nanoparticle.'), self.make),
52 ui.Button(_('Apply'), self.apply),
53 ui.Button(_('OK'), self.ok)])
55 self.gui = gui
56 self.atoms = None
58 def make(self, element=None):
59 symbol = self.element.symbol
60 if symbol is None:
61 self.atoms = None
62 self.python = None
63 self.description.text = ''
64 return None
66 n = self.n.value
67 m = self.m.value
68 length = self.length.value
69 bl = self.bondlength.value
70 self.atoms = nanotube(n, m, length=length, bond=bl, symbol=symbol)
71 label = label_template.format(
72 natoms=len(self.atoms),
73 total_length=self.atoms.cell[2, 2],
74 diameter=self.atoms.cell[0, 0] / 2)
75 self.description.text = label
76 return py_template.format(n=n, m=m, length=length, symb=symbol, bl=bl)
78 def apply(self):
79 self.make()
80 if self.atoms is not None:
81 self.gui.new_atoms(self.atoms)
82 return True
83 else:
84 ui.error(_('No valid atoms.'),
85 _('You have not (yet) specified a consistent '
86 'set of parameters.'))
87 return False
89 def ok(self, *args):
90 if self.apply():
91 self.win.close()