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

1# fmt: off 

2 

3"""Window for setting up Carbon nanotubes and similar tubes. 

4""" 

5 

6 

7import ase.gui.ui as ui 

8from ase.build import nanotube 

9from ase.gui.i18n import _ 

10from ase.gui.widgets import Element, pybutton 

11 

12introtext = _("""\ 

13Set up a Carbon nanotube by specifying the (n,m) roll-up vector. 

14Please note that m <= n. 

15 

16Nanotubes of other elements can be made by specifying the element 

17and bond length.\ 

18""") 

19 

20py_template = """\ 

21from ase.build import nanotube 

22atoms = nanotube({n}, {m}, length={length}, bond={bl:.3f}, symbol='{symb}') 

23""" 

24 

25label_template = _('{natoms} atoms, diameter: {diameter:.3f} Å, ' 

26 'total length: {total_length:.3f} Å') 

27 

28 

29class SetupNanotube: 

30 """Window for setting up a (Carbon) nanotube.""" 

31 

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('') 

39 

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)]) 

54 

55 self.gui = gui 

56 self.atoms = None 

57 

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 

65 

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) 

77 

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 

88 

89 def ok(self, *args): 

90 if self.apply(): 

91 self.win.close()