|
6 | 6 | from cmlibs.zinc.context import Context |
7 | 7 | from cmlibs.zinc.result import RESULT_OK |
8 | 8 |
|
| 9 | +from cmlibs.maths.vectorops import normalize, sub, magnitude, dot, mult |
| 10 | + |
9 | 11 |
|
10 | 12 | def is_exf_file(filename): |
11 | 13 | if not os.path.isfile(filename): |
@@ -168,5 +170,34 @@ def create_node(field_module, data_object, identifier=-1, node_set_name='nodes', |
168 | 170 | return node.getIdentifier() |
169 | 171 |
|
170 | 172 |
|
| 173 | +def rotate_to_next_standard_view(scene_viewer): |
| 174 | + if scene_viewer is not None: |
| 175 | + result, eyePosition, lookAtPosition, upVector = scene_viewer.getLookatParameters() |
| 176 | + upVector = normalize(upVector) |
| 177 | + viewVector = sub(lookAtPosition, eyePosition) |
| 178 | + viewDistance = magnitude(viewVector) |
| 179 | + viewVector = normalize(viewVector) |
| 180 | + # viewX = dot(viewVector, [1.0, 0.0, 0.0]) |
| 181 | + viewY = dot(viewVector, [0.0, 1.0, 0.0]) |
| 182 | + viewZ = dot(viewVector, [0.0, 0.0, 1.0]) |
| 183 | + # upX = dot(upVector, [1.0, 0.0, 0.0]) |
| 184 | + upY = dot(upVector, [0.0, 1.0, 0.0]) |
| 185 | + upZ = dot(upVector, [0.0, 0.0, 1.0]) |
| 186 | + if (viewZ < -0.999) and (upY > 0.999): |
| 187 | + # XY -> XZ |
| 188 | + viewVector = [0.0, 1.0, 0.0] |
| 189 | + upVector = [0.0, 0.0, 1.0] |
| 190 | + elif (viewY > 0.999) and (upZ > 0.999): |
| 191 | + # XZ -> YZ |
| 192 | + viewVector = [-1.0, 0.0, 0.0] |
| 193 | + upVector = [0.0, 0.0, 1.0] |
| 194 | + else: |
| 195 | + # XY |
| 196 | + viewVector = [0.0, 0.0, -1.0] |
| 197 | + upVector = [0.0, 1.0, 0.0] |
| 198 | + eyePosition = sub(lookAtPosition, mult(viewVector, viewDistance)) |
| 199 | + scene_viewer.setLookatParametersNonSkew(eyePosition, lookAtPosition, upVector) |
| 200 | + |
| 201 | + |
171 | 202 | defineStandardGraphicsObjects = define_standard_graphics_objects |
172 | 203 | createNode = create_node |
0 commit comments