Statistiques
| Révision :

root / ase / visualize / vtk / cell.py @ 3

Historique | Voir | Annoter | Télécharger (3,96 ko)

1 1 tkerber
2 1 tkerber
import numpy as np
3 1 tkerber
4 1 tkerber
from ase import Atoms
5 1 tkerber
6 1 tkerber
from vtk import vtkOutlineSource, vtkAxesActor, vtkProperty2D, vtkTextProperty
7 1 tkerber
from ase.visualize.vtk.module import vtkModule, vtkPolyDataModule
8 1 tkerber
9 1 tkerber
# -------------------------------------------------------------------
10 1 tkerber
11 1 tkerber
class vtkUnitCellModule(vtkPolyDataModule):
12 1 tkerber
    def __init__(self, atoms):
13 1 tkerber
14 1 tkerber
        assert isinstance(atoms, Atoms)
15 1 tkerber
        self.pbc = atoms.get_pbc()
16 1 tkerber
17 1 tkerber
        cell = atoms.get_cell()
18 1 tkerber
19 1 tkerber
        """
20 1 tkerber
        if not isinstance(cell, np.ndarray):
21 1 tkerber
            cell = np.array(cell)
22 1 tkerber

23 1 tkerber
        if cell.shape == (3,):
24 1 tkerber
            cell = np.diag(cell)
25 1 tkerber

26 1 tkerber
        assert cell.dtype == float and cell.shape == (3, 3)
27 1 tkerber
        """
28 1 tkerber
29 1 tkerber
        self.vtk_outline = vtkOutlineSource()
30 1 tkerber
31 1 tkerber
        if (cell - np.diag(cell.diagonal())).any():
32 1 tkerber
            corners = np.empty((8,3), dtype=float)
33 1 tkerber
            # edges = [map(int,[(i-1)%2==0,i%4>=2,i>=4]) for i in range(8)]
34 1 tkerber
            for c,a in enumerate([(0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0), \
35 1 tkerber
                                  (0, 0, 1), (1, 0, 1), (0, 1, 1), (1, 1, 1)]):
36 1 tkerber
                corners[c] = np.dot(a, cell)
37 1 tkerber
            self.bbox = np.array(zip(np.min(corners, axis=0), \
38 1 tkerber
                                     np.max(corners, axis=0))).ravel()
39 1 tkerber
            self.vtk_outline.SetCorners(corners.ravel())
40 1 tkerber
            self.vtk_outline.SetBoxTypeToOriented()
41 1 tkerber
        else:
42 1 tkerber
            self.bbox = np.array(zip(np.zeros(3),cell.diagonal())).ravel()
43 1 tkerber
        self.vtk_outline.SetBounds(self.bbox)
44 1 tkerber
45 1 tkerber
        vtkPolyDataModule.__init__(self, self.vtk_outline)
46 1 tkerber
47 1 tkerber
    def get_bounding_box(self):
48 1 tkerber
        return self.bbox
49 1 tkerber
50 1 tkerber
    def get_size(self):
51 1 tkerber
        return self.bbox[1::2]-self.bbox[0::2]
52 1 tkerber
53 1 tkerber
    def get_pbc(self):
54 1 tkerber
        return self.pbc
55 1 tkerber
56 1 tkerber
    def get_characteristic_length(self):
57 1 tkerber
        return np.prod(self.get_size())**(1.0/3.0)
58 1 tkerber
59 1 tkerber
# -------------------------------------------------------------------
60 1 tkerber
61 1 tkerber
class vtkAxesModule(vtkModule):
62 1 tkerber
    def __init__(self, cell):
63 1 tkerber
64 1 tkerber
        assert isinstance(cell, vtkUnitCellModule)
65 1 tkerber
        self.cell = cell
66 1 tkerber
67 1 tkerber
        l0 = self.cell.get_characteristic_length()
68 1 tkerber
69 1 tkerber
        # Create VTK axes actor (not really a VTK actor though)
70 1 tkerber
        self.vtk_ax = vtkAxesActor()
71 1 tkerber
        self.vtk_ax.SetTipTypeToCone()
72 1 tkerber
        self.vtk_ax.SetConeRadius(5e-2*l0)
73 1 tkerber
        self.vtk_ax.SetShaftTypeToCylinder()
74 1 tkerber
        self.vtk_ax.SetCylinderRadius(5e-3*l0)
75 1 tkerber
76 1 tkerber
        # Create VTK two-dimensional property
77 1 tkerber
        p2d = vtkProperty2D()
78 1 tkerber
        p2d.SetDisplayLocationToBackground()
79 1 tkerber
80 1 tkerber
        vtkModule.__init__(self, self.vtk_ax, p2d)
81 1 tkerber
82 1 tkerber
        # Create VTK text property and apply to axes
83 1 tkerber
        vtk_textproperty = vtkTextProperty()
84 1 tkerber
        vtk_textproperty.SetFontSize(14)
85 1 tkerber
        vtk_textproperty.SetBold(True)
86 1 tkerber
        vtk_textproperty.SetItalic(True)
87 1 tkerber
        vtk_textproperty.SetShadow(True)
88 1 tkerber
        vtk_textproperty.SetJustificationToRight()
89 1 tkerber
        vtk_textproperty.SetVerticalJustificationToCentered()
90 1 tkerber
91 1 tkerber
        self.set_text_property(vtk_textproperty)
92 1 tkerber
93 1 tkerber
    def set_actor(self, vtk_act):
94 1 tkerber
        assert isinstance(vtk_act, vtkAxesActor) #fix for non-vtkActor actor
95 1 tkerber
        self.vtk_act = vtk_act
96 1 tkerber
97 1 tkerber
    def set_property(self, vtk_property):
98 1 tkerber
        assert isinstance(vtk_property, vtkProperty2D)
99 1 tkerber
        for vtk_cap in [self.vtk_ax.GetXAxisCaptionActor2D(),
100 1 tkerber
                        self.vtk_ax.GetYAxisCaptionActor2D(),
101 1 tkerber
                        self.vtk_ax.GetZAxisCaptionActor2D()]:
102 1 tkerber
            #vtk_cap.ThreeDimensionalLeaderOn()
103 1 tkerber
            #vtk_cap.LeaderOn()
104 1 tkerber
            vtk_cap.SetProperty(vtk_property)
105 1 tkerber
            vtk_txt = vtk_cap.GetTextActor()
106 1 tkerber
            vtk_txt.SetProperty(vtk_property)
107 1 tkerber
108 1 tkerber
    def set_text_property(self, vtk_textproperty, scaled=False):
109 1 tkerber
        assert isinstance(vtk_textproperty, vtkTextProperty)
110 1 tkerber
        for vtk_cap in [self.vtk_ax.GetXAxisCaptionActor2D(),
111 1 tkerber
                        self.vtk_ax.GetYAxisCaptionActor2D(),
112 1 tkerber
                        self.vtk_ax.GetZAxisCaptionActor2D()]:
113 1 tkerber
            vtk_txt = vtk_cap.GetTextActor()
114 1 tkerber
            vtk_txt.SetScaledText(scaled)
115 1 tkerber
            vtk_txt.SetTextProperty(vtk_textproperty)