root / ase / visualize / vtk / sources.py @ 14
Historique | Voir | Annoter | Télécharger (3,84 ko)
| 1 | 1 | tkerber | |
|---|---|---|---|
| 2 | 1 | tkerber | import numpy as np |
| 3 | 1 | tkerber | |
| 4 | 1 | tkerber | from vtk import vtkProperty, vtkSphereSource, vtkArrowSource, vtkConeSource |
| 5 | 1 | tkerber | |
| 6 | 1 | tkerber | from ase.data import atomic_numbers |
| 7 | 1 | tkerber | from ase.data import covalent_radii as atomic_radii |
| 8 | 1 | tkerber | from ase.data.colors import jmol_colors as atomic_colors |
| 9 | 1 | tkerber | #from ase.data.colors import cpk_colors as atomic_colors
|
| 10 | 1 | tkerber | |
| 11 | 1 | tkerber | avg_radius = np.mean(atomic_radii[np.isfinite(atomic_radii)]) |
| 12 | 1 | tkerber | |
| 13 | 1 | tkerber | # -------------------------------------------------------------------
|
| 14 | 1 | tkerber | |
| 15 | 1 | tkerber | class vtkCustomGlyphSource: |
| 16 | 1 | tkerber | def __init__(self, scale, vtk_glyph_source): |
| 17 | 1 | tkerber | self.scale = scale
|
| 18 | 1 | tkerber | self.vtk_glyph_source = vtk_glyph_source
|
| 19 | 1 | tkerber | self.vtk_property = vtkProperty()
|
| 20 | 1 | tkerber | |
| 21 | 1 | tkerber | def get_scale(self): |
| 22 | 1 | tkerber | return self.scale |
| 23 | 1 | tkerber | |
| 24 | 1 | tkerber | def get_property(self): |
| 25 | 1 | tkerber | return self.vtk_property |
| 26 | 1 | tkerber | |
| 27 | 1 | tkerber | def get_output(self): |
| 28 | 1 | tkerber | return self.vtk_glyph_source.GetOutput() |
| 29 | 1 | tkerber | |
| 30 | 1 | tkerber | class vtkAtomSource(vtkCustomGlyphSource): |
| 31 | 1 | tkerber | def __init__(self, name, scale=1, fraction=0.25): |
| 32 | 1 | tkerber | vtkCustomGlyphSource.__init__(self, scale, vtkSphereSource())
|
| 33 | 1 | tkerber | |
| 34 | 1 | tkerber | self.number = atomic_numbers[name]
|
| 35 | 1 | tkerber | self.radius = atomic_radii[self.number] |
| 36 | 1 | tkerber | self.color = atomic_colors[self.number] |
| 37 | 1 | tkerber | |
| 38 | 1 | tkerber | self.vtk_property.SetColor(self.color[0],self.color[1],self.color[2]) |
| 39 | 1 | tkerber | self.vtk_property.SetInterpolationToPhong()
|
| 40 | 1 | tkerber | self.vtk_property.SetDiffuse(0.7) |
| 41 | 1 | tkerber | self.vtk_property.SetSpecular(0.4) |
| 42 | 1 | tkerber | self.vtk_property.SetSpecularPower(20) |
| 43 | 1 | tkerber | |
| 44 | 1 | tkerber | self.vtk_glyph_source.SetPhiResolution(16) |
| 45 | 1 | tkerber | self.vtk_glyph_source.SetThetaResolution(16) |
| 46 | 1 | tkerber | self.vtk_glyph_source.SetRadius(fraction*self.radius) |
| 47 | 1 | tkerber | |
| 48 | 1 | tkerber | # -------------------------------------------------------------------
|
| 49 | 1 | tkerber | |
| 50 | 1 | tkerber | class vtkClampedGlyphSource(vtkCustomGlyphSource): |
| 51 | 1 | tkerber | def __init__(self, scale, vtk_glyph_source, range_min, range_max): |
| 52 | 1 | tkerber | vtkCustomGlyphSource.__init__(self, scale, vtk_glyph_source)
|
| 53 | 1 | tkerber | self.range = (range_min, range_max,)
|
| 54 | 1 | tkerber | |
| 55 | 1 | tkerber | def get_range(self): |
| 56 | 1 | tkerber | return self.range |
| 57 | 1 | tkerber | |
| 58 | 1 | tkerber | class vtkForceSource(vtkClampedGlyphSource): |
| 59 | 1 | tkerber | def __init__(self, maxnorm, scale=1): |
| 60 | 1 | tkerber | vtkClampedGlyphSource.__init__(self, scale, vtkArrowSource(),
|
| 61 | 1 | tkerber | range_min=0.0, range_max=maxnorm)
|
| 62 | 1 | tkerber | |
| 63 | 1 | tkerber | self.vtk_property.SetColor(1.0, 0.25, 0.25) # forces are red |
| 64 | 1 | tkerber | self.vtk_property.SetInterpolationToPhong()
|
| 65 | 1 | tkerber | self.vtk_property.SetDiffuse(0.7) |
| 66 | 1 | tkerber | self.vtk_property.SetSpecular(0.4) |
| 67 | 1 | tkerber | self.vtk_property.SetSpecularPower(20) |
| 68 | 1 | tkerber | |
| 69 | 1 | tkerber | self.vtk_glyph_source.SetShaftResolution(12) |
| 70 | 1 | tkerber | self.vtk_glyph_source.SetShaftRadius(0.03*avg_radius) #default 0.03 |
| 71 | 1 | tkerber | self.vtk_glyph_source.SetTipResolution(20) |
| 72 | 1 | tkerber | self.vtk_glyph_source.SetTipLength(0.3*avg_radius) #default 0.35 |
| 73 | 1 | tkerber | self.vtk_glyph_source.SetTipRadius(0.1*avg_radius) #default 0.1 |
| 74 | 1 | tkerber | |
| 75 | 1 | tkerber | class vtkVelocitySource(vtkClampedGlyphSource): |
| 76 | 1 | tkerber | def __init__(self, maxnorm, scale=1): |
| 77 | 1 | tkerber | vtkClampedGlyphSource.__init__(self, scale, vtkConeSource(),
|
| 78 | 1 | tkerber | range_min=0.0, range_max=maxnorm)
|
| 79 | 1 | tkerber | |
| 80 | 1 | tkerber | self.vtk_property.SetColor(0.25, 0.25, 1.0) # velocities blue |
| 81 | 1 | tkerber | self.vtk_property.SetInterpolationToPhong()
|
| 82 | 1 | tkerber | self.vtk_property.SetDiffuse(0.9) |
| 83 | 1 | tkerber | self.vtk_property.SetSpecular(1.0) |
| 84 | 1 | tkerber | self.vtk_property.SetSpecularPower(50) |
| 85 | 1 | tkerber | |
| 86 | 1 | tkerber | self.vtk_glyph_source.SetAngle(6) |
| 87 | 1 | tkerber | self.vtk_glyph_source.SetHeight(avg_radius)
|
| 88 | 1 | tkerber | self.vtk_glyph_source.SetResolution(16) |
| 89 | 1 | tkerber | self.vtk_glyph_source.SetCenter(0.05*avg_radius, 0.0, 0.0) |
| 90 | 1 | tkerber | |
| 91 | 1 | tkerber | # -------------------------------------------------------------------
|
| 92 | 1 | tkerber | |
| 93 | 1 | tkerber | class vtkBondSource(vtkCustomGlyphSource): |
| 94 | 1 | tkerber | def __init__(self, width, scale=1): |
| 95 | 1 | tkerber | vtkCustomGlyphSource.__init__(self, scale, vtkCylinderSource())
|
| 96 | 1 | tkerber | |
| 97 | 1 | tkerber | self.width = width
|
| 98 | 1 | tkerber | |
| 99 | 1 | tkerber | self.vtk_property.SetColor(0.25, 1.0, 0.25) # bonds are green |
| 100 | 1 | tkerber | # (and so are you)
|
| 101 | 1 | tkerber | |
| 102 | 1 | tkerber | self.vtk_glyph_source.SetRadius(self.scale*self.width) |
| 103 | 1 | tkerber | self.vtk_glyph_source.SetResolution(16) |