Statistiques
| Révision :

root / ase / visualize / vtk / sources.py @ 1

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

1

    
2
import numpy as np
3

    
4
from vtk import vtkProperty, vtkSphereSource, vtkArrowSource, vtkConeSource
5

    
6
from ase.data import atomic_numbers
7
from ase.data import covalent_radii as atomic_radii
8
from ase.data.colors import jmol_colors as atomic_colors
9
#from ase.data.colors import cpk_colors as atomic_colors
10

    
11
avg_radius = np.mean(atomic_radii[np.isfinite(atomic_radii)])
12

    
13
# -------------------------------------------------------------------
14

    
15
class vtkCustomGlyphSource:
16
    def __init__(self, scale, vtk_glyph_source):
17
        self.scale = scale
18
        self.vtk_glyph_source = vtk_glyph_source
19
        self.vtk_property = vtkProperty()
20

    
21
    def get_scale(self):
22
        return self.scale
23

    
24
    def get_property(self):
25
        return self.vtk_property
26

    
27
    def get_output(self):
28
        return self.vtk_glyph_source.GetOutput()
29

    
30
class vtkAtomSource(vtkCustomGlyphSource):
31
    def __init__(self, name, scale=1, fraction=0.25):
32
        vtkCustomGlyphSource.__init__(self, scale, vtkSphereSource())
33

    
34
        self.number = atomic_numbers[name]
35
        self.radius = atomic_radii[self.number]
36
        self.color = atomic_colors[self.number]
37

    
38
        self.vtk_property.SetColor(self.color[0],self.color[1],self.color[2])
39
        self.vtk_property.SetInterpolationToPhong()
40
        self.vtk_property.SetDiffuse(0.7)
41
        self.vtk_property.SetSpecular(0.4)
42
        self.vtk_property.SetSpecularPower(20)
43

    
44
        self.vtk_glyph_source.SetPhiResolution(16)
45
        self.vtk_glyph_source.SetThetaResolution(16)
46
        self.vtk_glyph_source.SetRadius(fraction*self.radius)
47

    
48
# -------------------------------------------------------------------
49

    
50
class vtkClampedGlyphSource(vtkCustomGlyphSource):
51
    def __init__(self, scale, vtk_glyph_source, range_min, range_max):
52
        vtkCustomGlyphSource.__init__(self, scale, vtk_glyph_source)
53
        self.range = (range_min, range_max,)
54

    
55
    def get_range(self):
56
        return self.range
57

    
58
class vtkForceSource(vtkClampedGlyphSource):
59
    def __init__(self, maxnorm, scale=1):
60
        vtkClampedGlyphSource.__init__(self, scale, vtkArrowSource(),
61
                                       range_min=0.0, range_max=maxnorm)
62

    
63
        self.vtk_property.SetColor(1.0, 0.25, 0.25) # forces are red
64
        self.vtk_property.SetInterpolationToPhong()
65
        self.vtk_property.SetDiffuse(0.7)
66
        self.vtk_property.SetSpecular(0.4)
67
        self.vtk_property.SetSpecularPower(20)
68

    
69
        self.vtk_glyph_source.SetShaftResolution(12)
70
        self.vtk_glyph_source.SetShaftRadius(0.03*avg_radius) #default 0.03
71
        self.vtk_glyph_source.SetTipResolution(20)
72
        self.vtk_glyph_source.SetTipLength(0.3*avg_radius) #default 0.35
73
        self.vtk_glyph_source.SetTipRadius(0.1*avg_radius) #default 0.1
74

    
75
class vtkVelocitySource(vtkClampedGlyphSource):
76
    def __init__(self, maxnorm, scale=1):
77
        vtkClampedGlyphSource.__init__(self, scale, vtkConeSource(),
78
                                       range_min=0.0, range_max=maxnorm)
79

    
80
        self.vtk_property.SetColor(0.25, 0.25, 1.0) # velocities blue
81
        self.vtk_property.SetInterpolationToPhong()
82
        self.vtk_property.SetDiffuse(0.9)
83
        self.vtk_property.SetSpecular(1.0)
84
        self.vtk_property.SetSpecularPower(50)
85

    
86
        self.vtk_glyph_source.SetAngle(6)
87
        self.vtk_glyph_source.SetHeight(avg_radius)
88
        self.vtk_glyph_source.SetResolution(16)
89
        self.vtk_glyph_source.SetCenter(0.05*avg_radius, 0.0, 0.0)
90

    
91
# -------------------------------------------------------------------
92

    
93
class vtkBondSource(vtkCustomGlyphSource):
94
    def __init__(self, width, scale=1):
95
        vtkCustomGlyphSource.__init__(self, scale, vtkCylinderSource())
96

    
97
        self.width = width
98

    
99
        self.vtk_property.SetColor(0.25, 1.0, 0.25) # bonds are green
100
                                                    # (and so are you)
101

    
102
        self.vtk_glyph_source.SetRadius(self.scale*self.width)
103
        self.vtk_glyph_source.SetResolution(16)
104