Skip to content

Commit 6c2b59b

Browse files
committed
Refactor attribute
1 parent 2571056 commit 6c2b59b

File tree

3 files changed

+54
-123
lines changed

3 files changed

+54
-123
lines changed

pygem/freeform.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,8 @@ def perform(self):
8686
# translation and then affine transformation
8787
translation = self.parameters.origin_box
8888

89-
physical_frame = np.array([
90-
self.parameters.position_vertex_1 - translation,
91-
self.parameters.position_vertex_2 - translation,
92-
self.parameters.position_vertex_3 - translation, [0, 0, 0]
93-
])
94-
reference_frame = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 0]])
89+
physical_frame = self.parameters.position_vertices - translation
90+
reference_frame = np.array([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]])
9591

9692
transformation = at.affine_points_fit(physical_frame, reference_frame)
9793
inverse_transformation = at.affine_points_fit(reference_frame,

pygem/params/ffdparams.py

Lines changed: 15 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,6 @@ class FFDParameters(object):
4141
:cvar numpy.ndarray array_mu_z: collects the displacements (weights) along
4242
z, normalized with the box lenght z.
4343
44-
:cvar numpy.ndarray psi_mapping: map from the pysical domain to the
45-
reference domain.
46-
:cvar numpy.ndarray inv_psi_mapping: map from the reference domain to the
47-
physical domain.
48-
49-
:cvar numpy.ndarray rotation_matrix: rotation matrix (according to
50-
rot_angle_x, rot_angle_y, rot_angle_z).
51-
52-
:cvar numpy.ndarray position_vertex_0: position of the first vertex of the
53-
FFD bounding box. It is always equal to the member `origin_box`.
54-
:cvar numpy.ndarray position_vertex_1: position of the second vertex of the
55-
FFD bounding box.
56-
:cvar numpy.ndarray position_vertex_2: position of the third vertex of the
57-
FFD bounding box.
58-
:cvar numpy.ndarray position_vertex_3: position of the fourth vertex of the
59-
FFD bounding box.
60-
6144
:Example: from file
6245
6346
>>> import pygem.params as ffdp
@@ -105,11 +88,6 @@ def __init__(self, n_control_points=None):
10588
self.array_mu_y = np.zeros(self.n_control_points)
10689
self.array_mu_z = np.zeros(self.n_control_points)
10790

108-
self.position_vertex_0 = self.origin_box
109-
self.position_vertex_1 = np.array([1., 0., 0.])
110-
self.position_vertex_2 = np.array([0., 1., 0.])
111-
self.position_vertex_3 = np.array([0., 0., 1.])
112-
11391
@property
11492
def psi_mapping(self):
11593
"""
@@ -140,6 +118,17 @@ def rotation_matrix(self):
140118
radians(self.rot_angle[2]), radians(self.rot_angle[1]),
141119
radians(self.rot_angle[0]))
142120

121+
@property
122+
def position_vertices(self):
123+
"""
124+
The position of the second vertex of the FFD bounding box.
125+
126+
:rtype: numpy.ndarray
127+
"""
128+
return self.origin_box + np.vstack([
129+
np.zeros((1, 3)),
130+
self.rotation_matrix.dot(np.diag(self.lenght_box)).T
131+
])
143132

144133
def read_parameters(self, filename='parameters.prm'):
145134
"""
@@ -198,14 +187,6 @@ def read_parameters(self, filename='parameters.prm'):
198187
values = line.split()
199188
self.array_mu_z[tuple(map(int, values[0:3]))] = float(values[3])
200189

201-
self.position_vertex_0 = self.origin_box
202-
self.position_vertex_1 = self.position_vertex_0 + \
203-
np.dot(self.rotation_matrix, [self.lenght_box[0], 0, 0])
204-
self.position_vertex_2 = self.position_vertex_0 + \
205-
np.dot(self.rotation_matrix, [0, self.lenght_box[1], 0])
206-
self.position_vertex_3 = self.position_vertex_0 + \
207-
np.dot(self.rotation_matrix, [0, 0, self.lenght_box[2]])
208-
209190
def write_parameters(self, filename='parameters.prm'):
210191
"""
211192
This method writes a parameters file (.prm) called `filename` and fills
@@ -316,10 +297,7 @@ def __str__(self):
316297
string += '\narray_mu_z =\n{}\n'.format(self.array_mu_z)
317298
string += '\npsi_mapping = \n{}\n'.format(self.psi_mapping)
318299
string += '\nrotation_matrix = \n{}\n'.format(self.rotation_matrix)
319-
string += '\nposition_vertex_0 = {}\n'.format(self.position_vertex_0)
320-
string += 'position_vertex_1 = {}\n'.format(self.position_vertex_1)
321-
string += 'position_vertex_2 = {}\n'.format(self.position_vertex_2)
322-
string += 'position_vertex_3 = {}\n'.format(self.position_vertex_3)
300+
string += '\nposition_vertices = {}\n'.format(self.position_vertices)
323301
return string
324302

325303
def save(self, filename, write_deformed=True):
@@ -336,7 +314,7 @@ def save(self, filename, write_deformed=True):
336314
337315
:Example:
338316
339-
>>> from pygem.params_ffd import FFDParameters
317+
>>> from pygem.params import FFDParameters
340318
>>>
341319
>>> params = FFDParameters()
342320
>>> params.read_parameters(
@@ -418,25 +396,9 @@ def build_bounding_box(self,
418396
triangulate_tol)
419397
self.origin_box = min_xyz
420398
self.lenght_box = max_xyz - min_xyz
421-
self._set_position_of_vertices()
422-
self._set_transformation_params_to_zero()
399+
self.reset_deformation()
423400

424-
def _set_position_of_vertices(self):
425-
"""
426-
Vertices of the control box around the object are set in this method.
427-
Four vertices (non coplanar) are sufficient to uniquely identify a
428-
parallelepiped -- the second half of the box is created as a mirror
429-
reflection of the first four vertices.
430-
"""
431-
self.position_vertex_0 = self.origin_box
432-
self.position_vertex_1 = self.origin_box + np.array(
433-
[self.lenght_box[0], .0, .0])
434-
self.position_vertex_2 = self.origin_box + np.array(
435-
[.0, self.lenght_box[1], .0])
436-
self.position_vertex_3 = self.origin_box + np.array(
437-
[.0, .0, self.lenght_box[2]])
438-
439-
def _set_transformation_params_to_zero(self):
401+
def reset_deformation(self):
440402
"""
441403
Sets transfomration parameters (``array_mu_x, array_mu_y, array_mu_z``)
442404
to arrays of zeros (``numpy.zeros``). The shape of arrays corresponds to

tests/test_ffdparams.py

Lines changed: 37 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from OCC.BRepPrimAPI import BRepPrimAPI_MakeSphere, BRepPrimAPI_MakeBox
88
from OCC.gp import gp_Pnt
99

10-
from pygem import FFDParameters
10+
from pygem.params import FFDParameters
1111

1212

1313
class TestFFDParameters(TestCase):
@@ -60,25 +60,16 @@ def test_class_members_default_rotation_matrix(self):
6060
params = FFDParameters()
6161
np.testing.assert_array_almost_equal(params.rotation_matrix, np.eye(3))
6262

63-
def test_class_members_default_position_vertex_0(self):
63+
def test_class_members_default_position_vertices(self):
6464
params = FFDParameters()
65-
np.testing.assert_array_almost_equal(params.position_vertex_0,
66-
np.zeros(3))
67-
68-
def test_class_members_default_position_vertex_1(self):
69-
params = FFDParameters()
70-
np.testing.assert_array_almost_equal(params.position_vertex_1,
71-
np.array([1., 0., 0.]))
72-
73-
def test_class_members_default_position_vertex_2(self):
74-
params = FFDParameters()
75-
np.testing.assert_array_almost_equal(params.position_vertex_2,
76-
np.array([0., 1., 0.]))
77-
78-
def test_class_members_default_position_vertex_3(self):
79-
params = FFDParameters()
80-
np.testing.assert_array_almost_equal(params.position_vertex_3,
81-
np.array([0., 0., 1.]))
65+
expected_matrix = np.array([
66+
[0., 0., 0.],
67+
[1., 0., 0.],
68+
[0., 1., 0.],
69+
[0., 0., 1.]
70+
])
71+
np.testing.assert_array_almost_equal(params.position_vertices,
72+
expected_matrix)
8273

8374
def test_class_members_generic_n_control_points(self):
8475
params = FFDParameters([2, 3, 5])
@@ -180,38 +171,21 @@ def test_read_parameters_rotation_matrix(self):
180171
def test_read_parameters_position_vertex_0_origin(self):
181172
params = FFDParameters(n_control_points=[3, 2, 2])
182173
params.read_parameters('tests/test_datasets/parameters_sphere.prm')
183-
np.testing.assert_array_almost_equal(params.position_vertex_0,
174+
np.testing.assert_array_almost_equal(params.position_vertices[0],
184175
params.origin_box)
185176

186177
def test_read_parameters_position_vertex_0(self):
187178
params = FFDParameters(n_control_points=[3, 2, 2])
188179
params.read_parameters('tests/test_datasets/parameters_sphere.prm')
189-
position_vertex_0_exact = np.array([-20.0, -55.0, -45.0])
190-
np.testing.assert_array_almost_equal(params.position_vertex_0,
191-
position_vertex_0_exact)
192-
193-
def test_read_parameters_position_vertex_1(self):
194-
params = FFDParameters(n_control_points=[3, 2, 2])
195-
params.read_parameters('tests/test_datasets/parameters_sphere.prm')
196-
position_vertex_1_exact = np.array(
197-
[24.17322326, -52.02107006, -53.05309404])
198-
np.testing.assert_array_almost_equal(params.position_vertex_1,
199-
position_vertex_1_exact)
180+
position_vertices = np.array([
181+
[-20.0, -55.0, -45.0],
182+
[24.17322326, -52.02107006, -53.05309404],
183+
[-20., 29.41000412, -13.77579136],
184+
[-2.82719042, -85.65053198, 37.85915459]
185+
])
200186

201-
def test_read_parameters_position_vertex_2(self):
202-
params = FFDParameters(n_control_points=[3, 2, 2])
203-
params.read_parameters('tests/test_datasets/parameters_sphere.prm')
204-
position_vertex_2_exact = np.array([-20., 29.41000412, -13.77579136])
205-
np.testing.assert_array_almost_equal(params.position_vertex_2,
206-
position_vertex_2_exact)
207-
208-
def test_read_parameters_position_vertex_3(self):
209-
params = FFDParameters(n_control_points=[3, 2, 2])
210-
params.read_parameters('tests/test_datasets/parameters_sphere.prm')
211-
position_vertex_3_exact = np.array(
212-
[-2.82719042, -85.65053198, 37.85915459])
213-
np.testing.assert_array_almost_equal(params.position_vertex_3,
214-
position_vertex_3_exact)
187+
np.testing.assert_array_almost_equal(params.position_vertices,
188+
position_vertices)
215189

216190
def test_read_parameters_failing_filename_type(self):
217191
params = FFDParameters(n_control_points=[3, 2, 2])
@@ -286,33 +260,32 @@ def test_build_bounding_box_2(self):
286260
params = FFDParameters()
287261
params.build_bounding_box(cube)
288262

263+
expected_matrix = np.array([
264+
[0., 0., 0.],
265+
[1., 0., 0.],
266+
[0., 1., 0.],
267+
[0., 0., 1.]
268+
])
289269
np.testing.assert_almost_equal(
290-
params.position_vertex_0, origin, decimal=5)
291-
np.testing.assert_almost_equal(
292-
params.position_vertex_1, [1., 0., 0.], decimal=5)
293-
np.testing.assert_almost_equal(
294-
params.position_vertex_2, [0., 1., 0.], decimal=5)
295-
np.testing.assert_almost_equal(
296-
params.position_vertex_3, [0., 0., 1.], decimal=5)
270+
params.position_vertices, expected_matrix, decimal=5)
297271

298272
def test_set_position_of_vertices(self):
299-
vertex_0 = [0., 0., 0.]
300-
vertex_1 = [1., 0., 0.]
301-
vertex_2 = [0., 1., 0.]
302-
vertex_3 = [0., 0., 1.]
273+
expected_matrix = np.array([
274+
[0., 0., 0.],
275+
[1., 0., 0.],
276+
[0., 1., 0.],
277+
[0., 0., 1.]
278+
])
303279
tops = np.array([1., 1., 1.])
304280
params = FFDParameters()
305-
params.origin_box = vertex_0
306-
params.lenght_box = tops - vertex_0
307-
params._set_position_of_vertices()
308-
np.testing.assert_equal(params.position_vertex_0, vertex_0)
309-
np.testing.assert_equal(params.position_vertex_1, vertex_1)
310-
np.testing.assert_equal(params.position_vertex_2, vertex_2)
311-
np.testing.assert_equal(params.position_vertex_3, vertex_3)
281+
params.origin_box = expected_matrix[0]
282+
params.lenght_box = tops - expected_matrix[0]
283+
np.testing.assert_almost_equal(
284+
params.position_vertices, expected_matrix, decimal=5)
312285

313286
def test_set_modification_parameters_to_zero(self):
314287
params = FFDParameters([5, 5, 5])
315-
params._set_transformation_params_to_zero()
288+
params.reset_deformation()
316289
np.testing.assert_almost_equal(
317290
params.array_mu_x, np.zeros(shape=(5, 5, 5)))
318291
np.testing.assert_almost_equal(

0 commit comments

Comments
 (0)