1 | """ |
---|
2 | This software was developed by the University of Tennessee as part of the |
---|
3 | Distributed Data Analysis of Neutron Scattering Experiments (DANSE) |
---|
4 | project funded by the US National Science Foundation. |
---|
5 | |
---|
6 | See the license text in license.txt |
---|
7 | |
---|
8 | copyright 2009, University of Tennessee |
---|
9 | """ |
---|
10 | import sans.realspace.VolumeCanvas as VolumeCanvas |
---|
11 | |
---|
12 | class ShapeVisitor: |
---|
13 | """ |
---|
14 | The shape visitor process a GUI object representing |
---|
15 | a shape and returns a shape description that can be |
---|
16 | processed by the VolumeCanvas. |
---|
17 | """ |
---|
18 | |
---|
19 | def __init__(self): |
---|
20 | """ |
---|
21 | Initialize visitor |
---|
22 | """ |
---|
23 | ## Place holder for the simulation canvas |
---|
24 | self.sim_canvas = None |
---|
25 | |
---|
26 | def fromCylinder(self, cyl): |
---|
27 | """ |
---|
28 | Create a simulation cylinder descriptor (computation) |
---|
29 | from the information produced by the GUI |
---|
30 | @param cyl: Cylinder object from the GUI canvas |
---|
31 | @return: VolumeCanvas.CylinderDescriptor object |
---|
32 | """ |
---|
33 | from sans.realspace.VolumeCanvas import CylinderDescriptor |
---|
34 | desc = CylinderDescriptor() |
---|
35 | |
---|
36 | desc.params["center"] = [cyl.x, cyl.y, cyl.z] |
---|
37 | # Orientation are angular offsets in degrees with respect to X, Y, Z |
---|
38 | desc.params["orientation"] = [cyl.theta_x, cyl.theta_y, cyl.theta_z] |
---|
39 | desc.params["order"] = cyl.params["order"] |
---|
40 | |
---|
41 | |
---|
42 | # Length of the cylinder |
---|
43 | desc.params["length"] = cyl.params["length"] |
---|
44 | # Radius of the cylinder |
---|
45 | desc.params["radius"] = cyl.params["radius"] |
---|
46 | # Constrast parameter |
---|
47 | desc.params["contrast"] = cyl.params["contrast"] |
---|
48 | |
---|
49 | return desc |
---|
50 | |
---|
51 | def fromSphere(self, sph): |
---|
52 | """ |
---|
53 | Create a simulation sphere descriptor (computation) |
---|
54 | from the information produced by the GUI |
---|
55 | @param sph: Sphere object from the GUI canvas |
---|
56 | @return: VolumeCanvas.SphereDescriptor object |
---|
57 | """ |
---|
58 | from sans.realspace.VolumeCanvas import SphereDescriptor |
---|
59 | desc = SphereDescriptor() |
---|
60 | |
---|
61 | desc.params["center"] = [sph.x, sph.y, sph.z] |
---|
62 | desc.params["order"] = sph.params["order"] |
---|
63 | # Radius of the sphere |
---|
64 | desc.params["radius"] = sph.params["radius"] |
---|
65 | # Constrast parameter |
---|
66 | desc.params["contrast"] = sph.params["contrast"] |
---|
67 | |
---|
68 | return desc |
---|
69 | |
---|
70 | def update_sphere(self, sph): |
---|
71 | """ |
---|
72 | Update a shape description in the simulation canvas (computation) |
---|
73 | according to the new parameters of the GUI canvas. |
---|
74 | @param sph: Sphere object from the GUI canvas |
---|
75 | """ |
---|
76 | # Check class |
---|
77 | if self.sim_canvas.shapes[sph.name].__class__.__name__=="SphereDescriptor": |
---|
78 | desc = self.sim_canvas.shapes[sph.name] |
---|
79 | |
---|
80 | desc.params["center"] = [sph.x, sph.y, sph.z] |
---|
81 | desc.params["order"] = sph.params["order"] |
---|
82 | # Radius of the sphere |
---|
83 | desc.params["radius"] = sph.params["radius"] |
---|
84 | # Constrast parameter |
---|
85 | desc.params["contrast"] = sph.params["contrast"] |
---|
86 | |
---|
87 | self.sim_canvas._model_changed() |
---|
88 | else: |
---|
89 | raise ValueError, "SimShapeVisitor: Wrong class for visited object" |
---|
90 | |
---|
91 | |
---|
92 | |
---|
93 | def update_cylinder(self, cyl): |
---|
94 | """ |
---|
95 | Update a shape description in the simulation canvas (computation) |
---|
96 | according to the new parameters of the GUI canvas. |
---|
97 | @param cyl: Cylinder object from the GUI canvas |
---|
98 | """ |
---|
99 | # Check class |
---|
100 | if self.sim_canvas.shapes[cyl.name].__class__.__name__=="CylinderDescriptor": |
---|
101 | desc = self.sim_canvas.shapes[cyl.name] |
---|
102 | |
---|
103 | desc.params["center"] = [cyl.x, cyl.y, cyl.z] |
---|
104 | # Orientation are angular offsets in degrees with respect to X, Y, Z |
---|
105 | desc.params["orientation"] = [cyl.theta_x, cyl.theta_y, cyl.theta_z] |
---|
106 | desc.params["order"] = cyl.params["order"] |
---|
107 | |
---|
108 | # Length of the cylinder |
---|
109 | desc.params["length"] = cyl.params["length"] |
---|
110 | # Radius of the cylinder |
---|
111 | desc.params["radius"] = cyl.params["radius"] |
---|
112 | # Constrast parameter |
---|
113 | desc.params["contrast"] = cyl.params["contrast"] |
---|
114 | |
---|
115 | self.sim_canvas._model_changed() |
---|
116 | else: |
---|
117 | raise ValueError, "SimShapeVisitor: Wrong class for visited object" |
---|
118 | |
---|
119 | |
---|
120 | def update(self, volCanvas, shape): |
---|
121 | """ |
---|
122 | Update the shape descriptor in the VolumeCanvas |
---|
123 | corresponding to the given 'shape' parameter |
---|
124 | |
---|
125 | @param volCanvas: VolumeCanvas object |
---|
126 | @param shape: SimCanvas.BaseShape object |
---|
127 | """ |
---|
128 | if shape.name in volCanvas.getShapeList(): |
---|
129 | self.sim_canvas = volCanvas |
---|
130 | shape.accept_update(self) |
---|
131 | else: |
---|
132 | raise ValueError, "ShapeAdapter: Shape [%s] not in list" % shape.name |
---|
133 | |
---|