From 82bc5df63ffe8c7f349792573edb5cf2d5e05b25 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 16 May 2016 10:56:00 +0200 Subject: [PATCH 1/6] first commit for utilities --- pygem/__init__.py | 3 +- pygem/utilities.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 pygem/utilities.py diff --git a/pygem/__init__.py b/pygem/__init__.py index 5d94031..cbb0264 100644 --- a/pygem/__init__.py +++ b/pygem/__init__.py @@ -1,5 +1,5 @@ -__all__ = ['affine', 'filehandler', 'freeform', 'openfhandler', 'params', 'stlhandler', 'unvhandler', 'vtkhandler', 'igeshandler'] +__all__ = ['affine', 'filehandler', 'freeform', 'openfhandler', 'params', 'stlhandler', 'unvhandler', 'vtkhandler', 'igeshandler', 'utilities'] from . import affine from . import freeform @@ -10,3 +10,4 @@ from . import unvhandler from . import vtkhandler from . import igeshandler +from . import utilities diff --git a/pygem/utilities.py b/pygem/utilities.py new file mode 100644 index 0000000..91ddca0 --- /dev/null +++ b/pygem/utilities.py @@ -0,0 +1,70 @@ +import vtk +import vtk.util.numpy_support as ns +import numpy as np + +def write_initial_box(parameters, latticeName): + """ + Writes a vtk files for the undeformed FFD lattice. + """ + + x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) + y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) + z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) + yy, xx, zz = np.meshgrid(y, x, z) + + boxPoints = np.array([xx.ravel(), yy.ravel(), zz.ravel()]) + n_row = boxPoints.shape[1] + + boxPoints = np.dot(parameters.rotation_matrix,boxPoints) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + + write_vtk_box(boxPoints, 'originalBox_' + latticeName + '.vtk') + +def write_modified_box(parameters, latticeName): + """ + Writes a vtk files for the deformed FFD lattice. + """ + + x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) + y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) + z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) + yy, xx, zz = np.meshgrid(y, x, z) + + boxPoints = np.array([xx.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ + yy.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ + zz.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) + + n_row = boxPoints.shape[1] + + boxPoints = np.dot(parameters.rotation_matrix,boxPoints) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + + write_vtk_box(boxPoints, 'modifiedBox_' + latticeName + '.vtk') + +def write_vtk_box(boxPoints, filename): + """ + Documentation + """ + # setup points and vertices + points = vtk.vtkPoints() + vertices = vtk.vtkCellArray() + + for index in range(0, boxPoints.shape[1]): + id = points.InsertNextPoint(boxPoints[0, index], boxPoints[1, index], boxPoints[2, index]) + vertices.InsertNextCell(1) + vertices.InsertCellPoint(id) + + polydata = vtk.vtkPolyData() + polydata.SetPoints(points) + polydata.SetVerts(vertices) + + polydata.Modified() + writer = vtk.vtkDataSetWriter() + writer.SetFileName(filename) + + if vtk.VTK_MAJOR_VERSION <= 5: + polydata.Update() + writer.SetInput(polydata) + else: + writer.SetInputData(polydata) + + writer.Write() + From 3ca457519b84b097393381078eed53f9358e0b83 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Mon, 16 May 2016 11:55:44 +0200 Subject: [PATCH 2/6] some tests written --- pygem/utilities.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pygem/utilities.py b/pygem/utilities.py index 91ddca0..9915ec5 100644 --- a/pygem/utilities.py +++ b/pygem/utilities.py @@ -17,6 +17,8 @@ def write_initial_box(parameters, latticeName): boxPoints = np.dot(parameters.rotation_matrix,boxPoints) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + #print boxPoints + write_vtk_box(boxPoints, 'originalBox_' + latticeName + '.vtk') def write_modified_box(parameters, latticeName): From bed9cf2bc133f9c16cea6a8812b36751202b22af Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Wed, 18 May 2016 15:45:11 +0200 Subject: [PATCH 3/6] added documentation for utilities --- docs/source/code.rst | 1 + docs/source/utilities.rst | 5 +++ pygem/utilities.py | 87 +++++++++++++++++++++++++++------------ tests/test_utilities.py | 59 ++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 26 deletions(-) create mode 100644 docs/source/utilities.rst create mode 100644 tests/test_utilities.py diff --git a/docs/source/code.rst b/docs/source/code.rst index a81bf36..dde71fc 100644 --- a/docs/source/code.rst +++ b/docs/source/code.rst @@ -15,4 +15,5 @@ Code Documentation vtkhandler unvhandler igeshandler + utilities diff --git a/docs/source/utilities.rst b/docs/source/utilities.rst new file mode 100644 index 0000000..09c21cf --- /dev/null +++ b/docs/source/utilities.rst @@ -0,0 +1,5 @@ +Utilities +===================== + +.. automodule:: pygem.utilities + :members: diff --git a/pygem/utilities.py b/pygem/utilities.py index 9915ec5..6bba42f 100644 --- a/pygem/utilities.py +++ b/pygem/utilities.py @@ -2,55 +2,90 @@ import vtk.util.numpy_support as ns import numpy as np -def write_initial_box(parameters, latticeName): +# TODO: add the connectivity to the ffd control points to visualize the lattice. + +def write_initial_box(parameters, lattice_name): """ - Writes a vtk files for the undeformed FFD lattice. + Method that writes a vtk file containing the undeformed FFD lattice. This method + allows to visualize where the FFD control points are located before the geometrical morphing. + + :param FFDParameters parameters: parameters of the Free Form Deformation. + :param string lattice_name: name related of the output file. The output file will + be 'originalBox_lattice_name.vtk' + + :Example: + + >>> import pygem.utilities as util + >>> import pygem.params as pars + >>> import numpy as np + + >>> params = pars.FFDParameters() + >>> params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') + >>> util.write_initial_box(params, 'test_on_sphere') """ - x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) - y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) - z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) - yy, xx, zz = np.meshgrid(y, x, z) + aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) + aux_y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) + aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) + points_in_y, xx, zz = np.meshgrid(aux_y, aux_x, aux_z) - boxPoints = np.array([xx.ravel(), yy.ravel(), zz.ravel()]) - n_row = boxPoints.shape[1] + box_points = np.array([xx.ravel(), points_in_y.ravel(), zz.ravel()]) + n_row = box_points.shape[1] - boxPoints = np.dot(parameters.rotation_matrix,boxPoints) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) - #print boxPoints + write_vtk_box(box_points, 'originalBox_' + lattice_name + '.vtk') - write_vtk_box(boxPoints, 'originalBox_' + latticeName + '.vtk') -def write_modified_box(parameters, latticeName): +def write_modified_box(parameters, lattice_name): """ - Writes a vtk files for the deformed FFD lattice. + Method that writes a vtk file containing the deformed FFD lattice. This method + allows to visualize where the FFD control points are located after the geometrical morphing. + + :param FFDParameters parameters: parameters of the Free Form Deformation. + :param string lattice_name: name related of the output file. The output file will + be 'modifiedBox_lattice_name.vtk' + + :Example: + + >>> import pygem.utilities as util + >>> import pygem.params as pars + >>> import numpy as np + + >>> params = pars.FFDParameters() + >>> params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') + >>> util.write_modified_box(params, 'test_on_sphere') """ - x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) - y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) - z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) - yy, xx, zz = np.meshgrid(y, x, z) + aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) + aux_y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) + aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) + points_in_y, xx, zz = np.meshgrid(aux_y, aux_x, aux_z) - boxPoints = np.array([xx.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ - yy.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ + box_points = np.array([xx.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ + points_in_y.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ zz.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) - n_row = boxPoints.shape[1] + n_row = box_points.shape[1] - boxPoints = np.dot(parameters.rotation_matrix,boxPoints) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) - write_vtk_box(boxPoints, 'modifiedBox_' + latticeName + '.vtk') + write_vtk_box(box_points, 'modifiedBox_' + lattice_name + '.vtk') -def write_vtk_box(boxPoints, filename): + +def write_vtk_box(box_points, filename): """ - Documentation + Method that writes a vtk file containing FFD control points. + + :param numpy.ndarray box_points: coordinates of the FFD control points. + :param string filename: name of the output file. """ # setup points and vertices points = vtk.vtkPoints() vertices = vtk.vtkCellArray() - for index in range(0, boxPoints.shape[1]): - id = points.InsertNextPoint(boxPoints[0, index], boxPoints[1, index], boxPoints[2, index]) + for index in range(0, box_points.shape[1]): + id = points.InsertNextPoint(box_points[0, index], box_points[1, index], box_points[2, index]) vertices.InsertNextCell(1) vertices.InsertCellPoint(id) diff --git a/tests/test_utilities.py b/tests/test_utilities.py new file mode 100644 index 0000000..8e46fa3 --- /dev/null +++ b/tests/test_utilities.py @@ -0,0 +1,59 @@ + +from unittest import TestCase +import unittest +import pygem.utilities as util +import pygem.params as pars +import numpy as np +import filecmp +import os + + +class TestVtkHandler(TestCase): + + + def test_utilities_write_original_box(self): + params = pars.FFDParameters() + params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') + + util.write_initial_box(params, 'test_on_sphere') + os.remove('originalBox_test_on_sphere.vtk') + + + def test_utilities_write_modified_box(self): + params = pars.FFDParameters() + params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') + + util.write_modified_box(params, 'test_on_sphere') + os.remove('modifiedBox_test_on_sphere.vtk') + + + def test_utilities_write_vtk_box(self): + box_points = np.array([[-20., -4.37166401, -42.9398302, -27.31149421, 1.40315296, 17.03148895, \ + -21.53667724, -5.90834125, 22.80630592, 38.43464191, -0.13352429, 15.4948117], \ + [-55. , -55., 31.93332437, 31.93332437, -49.17657149, -49.17657149, \ + 37.75675288, 37.75675288, -43.35314297, -43.35314297, 43.5801814, 43.5801814], \ + [-45. , 43.63269777, -40.955089 , 47.67760877, -48.77395334, 39.85874443 , \ + -44.72904234, 43.90365543, -52.54790668, 36.08479109, -48.50299568, 40.12970209]]) + + outfilename = 'tests/test_datasets/originalBox_test_on_sphere.vtk' + + util.write_vtk_box(box_points, outfilename) + os.remove(outfilename) + + + def test_utilities_check_vtk_box(self): + box_points = np.array([[-20., -4.37166401, -42.9398302, -27.31149421, 1.40315296, 17.03148895, \ + -21.53667724, -5.90834125, 22.80630592, 38.43464191, -0.13352429, 15.4948117], \ + [-55. , -55., 31.93332437, 31.93332437, -49.17657149, -49.17657149, \ + 37.75675288, 37.75675288, -43.35314297, -43.35314297, 43.5801814, 43.5801814], \ + [-45. , 43.63269777, -40.955089 , 47.67760877, -48.77395334, 39.85874443 , \ + -44.72904234, 43.90365543, -52.54790668, 36.08479109, -48.50299568, 40.12970209]]) + + outfilename = 'tests/test_datasets/box_test_sphere.vtk' + outfilename_expected = 'tests/test_datasets/box_test_sphere_true.vtk' + + util.write_vtk_box(box_points, outfilename) + + self.assertTrue(filecmp.cmp(outfilename, outfilename_expected)) + os.remove(outfilename) + From a070f1efc07ecf5cb10efa52671d80eded6ea896 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Wed, 18 May 2016 15:54:46 +0200 Subject: [PATCH 4/6] some variable name made more clear --- pygem/utilities.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pygem/utilities.py b/pygem/utilities.py index 6bba42f..d3caefe 100644 --- a/pygem/utilities.py +++ b/pygem/utilities.py @@ -27,12 +27,12 @@ def write_initial_box(parameters, lattice_name): aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) aux_y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) - points_in_y, xx, zz = np.meshgrid(aux_y, aux_x, aux_z) + lattice_y_coords, lattice_x_coords, lattice_z_coords = np.meshgrid(aux_y, aux_x, aux_z) - box_points = np.array([xx.ravel(), points_in_y.ravel(), zz.ravel()]) - n_row = box_points.shape[1] + box_points = np.array([lattice_x_coords.ravel(), lattice_y_coords.ravel(), lattice_z_coords.ravel()]) + n_rows = box_points.shape[1] - box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_rows,1))) write_vtk_box(box_points, 'originalBox_' + lattice_name + '.vtk') @@ -60,15 +60,15 @@ def write_modified_box(parameters, lattice_name): aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) aux_y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) - points_in_y, xx, zz = np.meshgrid(aux_y, aux_x, aux_z) + lattice_y_coords, lattice_x_coords, lattice_z_coords = np.meshgrid(aux_y, aux_x, aux_z) - box_points = np.array([xx.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ - points_in_y.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ - zz.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) + box_points = np.array([lattice_x_coords.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ + lattice_y_coords.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ + lattice_z_coords.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) - n_row = box_points.shape[1] + n_rows = box_points.shape[1] - box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_row,1))) + box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_rows,1))) write_vtk_box(box_points, 'modifiedBox_' + lattice_name + '.vtk') From 0a19f5ebb2b1f807ae326289a5e77fb51af03ff2 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Wed, 18 May 2016 17:31:14 +0200 Subject: [PATCH 5/6] method write_original_box and write_modified_box merged in write_bounding_box --- pygem/utilities.py | 59 ++++++-------------- tests/test_datasets/box_test_sphere_true.vtk | 24 ++++++++ tests/test_utilities.py | 34 ++++------- 3 files changed, 50 insertions(+), 67 deletions(-) create mode 100644 tests/test_datasets/box_test_sphere_true.vtk diff --git a/pygem/utilities.py b/pygem/utilities.py index d3caefe..be121e5 100644 --- a/pygem/utilities.py +++ b/pygem/utilities.py @@ -4,14 +4,17 @@ # TODO: add the connectivity to the ffd control points to visualize the lattice. -def write_initial_box(parameters, lattice_name): +def write_bounding_box(parameters, outfile, flag='original'): """ - Method that writes a vtk file containing the undeformed FFD lattice. This method + Method that writes a vtk file containing the FFD lattice. This method allows to visualize where the FFD control points are located before the geometrical morphing. + If the flag is set to original (default) the method writes out the undeformed lattice, + if it is set to modified it writes out the deformed lattice. :param FFDParameters parameters: parameters of the Free Form Deformation. - :param string lattice_name: name related of the output file. The output file will - be 'originalBox_lattice_name.vtk' + :param string outfile: name of the output file. + :param string flag: flag to write the original or modified FFD control lattice. + The default is set to original. :Example: @@ -21,7 +24,7 @@ def write_initial_box(parameters, lattice_name): >>> params = pars.FFDParameters() >>> params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') - >>> util.write_initial_box(params, 'test_on_sphere') + >>> util.write_initial_box(params, 'tests/test_datasets/box_test_sphere.vtk') """ aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) @@ -29,51 +32,21 @@ def write_initial_box(parameters, lattice_name): aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) lattice_y_coords, lattice_x_coords, lattice_z_coords = np.meshgrid(aux_y, aux_x, aux_z) - box_points = np.array([lattice_x_coords.ravel(), lattice_y_coords.ravel(), lattice_z_coords.ravel()]) - n_rows = box_points.shape[1] - - box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_rows,1))) - - write_vtk_box(box_points, 'originalBox_' + lattice_name + '.vtk') - - -def write_modified_box(parameters, lattice_name): - """ - Method that writes a vtk file containing the deformed FFD lattice. This method - allows to visualize where the FFD control points are located after the geometrical morphing. - - :param FFDParameters parameters: parameters of the Free Form Deformation. - :param string lattice_name: name related of the output file. The output file will - be 'modifiedBox_lattice_name.vtk' + if flag == 'original': + box_points = np.array([lattice_x_coords.ravel(), lattice_y_coords.ravel(), lattice_z_coords.ravel()]) + if flag == 'modified': + box_points = np.array([lattice_x_coords.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ + lattice_y_coords.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ + lattice_z_coords.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) - :Example: - - >>> import pygem.utilities as util - >>> import pygem.params as pars - >>> import numpy as np - - >>> params = pars.FFDParameters() - >>> params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') - >>> util.write_modified_box(params, 'test_on_sphere') - """ - - aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) - aux_y = np.linspace(0, parameters.lenght_box_y, parameters.n_control_points[1]) - aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) - lattice_y_coords, lattice_x_coords, lattice_z_coords = np.meshgrid(aux_y, aux_x, aux_z) - - box_points = np.array([lattice_x_coords.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ - lattice_y_coords.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ - lattice_z_coords.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) - n_rows = box_points.shape[1] box_points = np.dot(parameters.rotation_matrix,box_points) + np.transpose(np.tile(parameters.origin_box, (n_rows,1))) - write_vtk_box(box_points, 'modifiedBox_' + lattice_name + '.vtk') + _write_vtk_box(box_points, outfile) -def write_vtk_box(box_points, filename): +def _write_vtk_box(box_points, filename): """ Method that writes a vtk file containing FFD control points. diff --git a/tests/test_datasets/box_test_sphere_true.vtk b/tests/test_datasets/box_test_sphere_true.vtk new file mode 100644 index 0000000..f0d478f --- /dev/null +++ b/tests/test_datasets/box_test_sphere_true.vtk @@ -0,0 +1,24 @@ +# vtk DataFile Version 3.0 +vtk output +ASCII +DATASET POLYDATA +POINTS 12 float +-20 -55 -45 -4.37166 -55 43.6327 -42.9398 31.9333 -40.9551 +-27.3115 31.9333 47.6776 1.40315 -49.1766 -48.774 17.0315 -49.1766 39.8587 +-21.5367 37.7568 -44.729 -5.90834 37.7568 43.9037 22.8063 -43.3531 -52.5479 +38.4346 -43.3531 36.0848 -0.133524 43.5802 -48.503 15.4948 43.5802 40.1297 + +VERTICES 12 24 +1 0 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 10 +1 11 + diff --git a/tests/test_utilities.py b/tests/test_utilities.py index 8e46fa3..b090b63 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -15,44 +15,30 @@ def test_utilities_write_original_box(self): params = pars.FFDParameters() params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') - util.write_initial_box(params, 'test_on_sphere') - os.remove('originalBox_test_on_sphere.vtk') + outfilename = 'tests/test_datasets/box_test_sphere.vtk' + + util.write_bounding_box(params, outfilename) + os.remove('tests/test_datasets/box_test_sphere.vtk') def test_utilities_write_modified_box(self): params = pars.FFDParameters() params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') - util.write_modified_box(params, 'test_on_sphere') - os.remove('modifiedBox_test_on_sphere.vtk') - - - def test_utilities_write_vtk_box(self): - box_points = np.array([[-20., -4.37166401, -42.9398302, -27.31149421, 1.40315296, 17.03148895, \ - -21.53667724, -5.90834125, 22.80630592, 38.43464191, -0.13352429, 15.4948117], \ - [-55. , -55., 31.93332437, 31.93332437, -49.17657149, -49.17657149, \ - 37.75675288, 37.75675288, -43.35314297, -43.35314297, 43.5801814, 43.5801814], \ - [-45. , 43.63269777, -40.955089 , 47.67760877, -48.77395334, 39.85874443 , \ - -44.72904234, 43.90365543, -52.54790668, 36.08479109, -48.50299568, 40.12970209]]) - - outfilename = 'tests/test_datasets/originalBox_test_on_sphere.vtk' + outfilename = 'tests/test_datasets/box_test_sphere.vtk' - util.write_vtk_box(box_points, outfilename) - os.remove(outfilename) + util.write_bounding_box(params, outfilename, 'modified') + os.remove('tests/test_datasets/box_test_sphere.vtk') def test_utilities_check_vtk_box(self): - box_points = np.array([[-20., -4.37166401, -42.9398302, -27.31149421, 1.40315296, 17.03148895, \ - -21.53667724, -5.90834125, 22.80630592, 38.43464191, -0.13352429, 15.4948117], \ - [-55. , -55., 31.93332437, 31.93332437, -49.17657149, -49.17657149, \ - 37.75675288, 37.75675288, -43.35314297, -43.35314297, 43.5801814, 43.5801814], \ - [-45. , 43.63269777, -40.955089 , 47.67760877, -48.77395334, 39.85874443 , \ - -44.72904234, 43.90365543, -52.54790668, 36.08479109, -48.50299568, 40.12970209]]) + params = pars.FFDParameters() + params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') outfilename = 'tests/test_datasets/box_test_sphere.vtk' outfilename_expected = 'tests/test_datasets/box_test_sphere_true.vtk' - util.write_vtk_box(box_points, outfilename) + util.write_bounding_box(params, outfilename) self.assertTrue(filecmp.cmp(outfilename, outfilename_expected)) os.remove(outfilename) From ec5e0743869163286cdb5ed53b7adc7a7da376d1 Mon Sep 17 00:00:00 2001 From: fsalmoir Date: Thu, 19 May 2016 10:25:04 +0200 Subject: [PATCH 6/6] added vtk file and check on vtk version to make test passing on travis --- pygem/utilities.py | 18 ++++++---- ...box_modified_test_sphere_true_version5.vtk | 24 +++++++++++++ ...box_modified_test_sphere_true_version6.vtk | 24 +++++++++++++ ....vtk => box_test_sphere_true_version5.vtk} | 0 .../box_test_sphere_true_version6.vtk | 24 +++++++++++++ tests/test_utilities.py | 35 +++++++++++++++---- 6 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 tests/test_datasets/box_modified_test_sphere_true_version5.vtk create mode 100644 tests/test_datasets/box_modified_test_sphere_true_version6.vtk rename tests/test_datasets/{box_test_sphere_true.vtk => box_test_sphere_true_version5.vtk} (100%) create mode 100644 tests/test_datasets/box_test_sphere_true_version6.vtk diff --git a/pygem/utilities.py b/pygem/utilities.py index be121e5..5b1afbb 100644 --- a/pygem/utilities.py +++ b/pygem/utilities.py @@ -1,10 +1,16 @@ +""" +Auxiliary utilities for PyGeM. +""" + import vtk import vtk.util.numpy_support as ns import numpy as np # TODO: add the connectivity to the ffd control points to visualize the lattice. -def write_bounding_box(parameters, outfile, flag='original'): + + +def write_bounding_box(parameters, outfile, write_deformed=True): """ Method that writes a vtk file containing the FFD lattice. This method allows to visualize where the FFD control points are located before the geometrical morphing. @@ -13,8 +19,8 @@ def write_bounding_box(parameters, outfile, flag='original'): :param FFDParameters parameters: parameters of the Free Form Deformation. :param string outfile: name of the output file. - :param string flag: flag to write the original or modified FFD control lattice. - The default is set to original. + :param bool write_deformed: flag to write the original or modified FFD control lattice. + The default is set to deformed. :Example: @@ -24,7 +30,7 @@ def write_bounding_box(parameters, outfile, flag='original'): >>> params = pars.FFDParameters() >>> params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') - >>> util.write_initial_box(params, 'tests/test_datasets/box_test_sphere.vtk') + >>> util.write_bounding_box(params, 'tests/test_datasets/box_test_sphere.vtk') """ aux_x = np.linspace(0, parameters.lenght_box_x, parameters.n_control_points[0]) @@ -32,9 +38,9 @@ def write_bounding_box(parameters, outfile, flag='original'): aux_z = np.linspace(0, parameters.lenght_box_z, parameters.n_control_points[2]) lattice_y_coords, lattice_x_coords, lattice_z_coords = np.meshgrid(aux_y, aux_x, aux_z) - if flag == 'original': + if write_deformed == False: box_points = np.array([lattice_x_coords.ravel(), lattice_y_coords.ravel(), lattice_z_coords.ravel()]) - if flag == 'modified': + if write_deformed == True: box_points = np.array([lattice_x_coords.ravel() + parameters.array_mu_x.ravel()*parameters.lenght_box_x, \ lattice_y_coords.ravel() + parameters.array_mu_y.ravel()*parameters.lenght_box_y, \ lattice_z_coords.ravel() + parameters.array_mu_z.ravel()*parameters.lenght_box_z]) diff --git a/tests/test_datasets/box_modified_test_sphere_true_version5.vtk b/tests/test_datasets/box_modified_test_sphere_true_version5.vtk new file mode 100644 index 0000000..9b0cb11 --- /dev/null +++ b/tests/test_datasets/box_modified_test_sphere_true_version5.vtk @@ -0,0 +1,24 @@ +# vtk DataFile Version 3.0 +vtk output +ASCII +DATASET POLYDATA +POINTS 12 float +-20 -55 -45 -4.37166 -55 43.6327 -42.9398 31.9333 -40.9551 +-27.3115 31.9333 47.6776 1.40315 -49.1766 -48.774 17.0315 -49.1766 39.8587 +-21.5367 37.7568 -44.729 -5.90834 37.7568 43.9037 52.8929 -77.5023 -149.241 +38.4346 -43.3531 36.0848 -0.133524 43.5802 -48.503 15.4948 43.5802 40.1297 + +VERTICES 12 24 +1 0 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 10 +1 11 + diff --git a/tests/test_datasets/box_modified_test_sphere_true_version6.vtk b/tests/test_datasets/box_modified_test_sphere_true_version6.vtk new file mode 100644 index 0000000..c547733 --- /dev/null +++ b/tests/test_datasets/box_modified_test_sphere_true_version6.vtk @@ -0,0 +1,24 @@ +# vtk DataFile Version 4.0 +vtk output +ASCII +DATASET POLYDATA +POINTS 12 float +-20 -55 -45 -4.37166 -55 43.6327 -42.9398 31.9333 -40.9551 +-27.3115 31.9333 47.6776 1.40315 -49.1766 -48.774 17.0315 -49.1766 39.8587 +-21.5367 37.7568 -44.729 -5.90834 37.7568 43.9037 52.8929 -77.5023 -149.241 +38.4346 -43.3531 36.0848 -0.133524 43.5802 -48.503 15.4948 43.5802 40.1297 + +VERTICES 12 24 +1 0 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 10 +1 11 + diff --git a/tests/test_datasets/box_test_sphere_true.vtk b/tests/test_datasets/box_test_sphere_true_version5.vtk similarity index 100% rename from tests/test_datasets/box_test_sphere_true.vtk rename to tests/test_datasets/box_test_sphere_true_version5.vtk diff --git a/tests/test_datasets/box_test_sphere_true_version6.vtk b/tests/test_datasets/box_test_sphere_true_version6.vtk new file mode 100644 index 0000000..cc40df9 --- /dev/null +++ b/tests/test_datasets/box_test_sphere_true_version6.vtk @@ -0,0 +1,24 @@ +# vtk DataFile Version 4.0 +vtk output +ASCII +DATASET POLYDATA +POINTS 12 float +-20 -55 -45 -4.37166 -55 43.6327 -42.9398 31.9333 -40.9551 +-27.3115 31.9333 47.6776 1.40315 -49.1766 -48.774 17.0315 -49.1766 39.8587 +-21.5367 37.7568 -44.729 -5.90834 37.7568 43.9037 22.8063 -43.3531 -52.5479 +38.4346 -43.3531 36.0848 -0.133524 43.5802 -48.503 15.4948 43.5802 40.1297 + +VERTICES 12 24 +1 0 +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +1 9 +1 10 +1 11 + diff --git a/tests/test_utilities.py b/tests/test_utilities.py index b090b63..8d27828 100644 --- a/tests/test_utilities.py +++ b/tests/test_utilities.py @@ -17,8 +17,8 @@ def test_utilities_write_original_box(self): outfilename = 'tests/test_datasets/box_test_sphere.vtk' - util.write_bounding_box(params, outfilename) - os.remove('tests/test_datasets/box_test_sphere.vtk') + util.write_bounding_box(params, outfilename, False) + os.remove(outfilename) def test_utilities_write_modified_box(self): @@ -27,16 +27,39 @@ def test_utilities_write_modified_box(self): outfilename = 'tests/test_datasets/box_test_sphere.vtk' - util.write_bounding_box(params, outfilename, 'modified') - os.remove('tests/test_datasets/box_test_sphere.vtk') + util.write_bounding_box(params, outfilename) + os.remove(outfilename) - def test_utilities_check_vtk_box(self): + def test_utilities_check_vtk_original_box(self): + import vtk + + params = pars.FFDParameters() + params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') + + outfilename = 'tests/test_datasets/box_test_sphere.vtk' + if vtk.VTK_MAJOR_VERSION <= 5: + outfilename_expected = 'tests/test_datasets/box_test_sphere_true_version5.vtk' + else: + outfilename_expected = 'tests/test_datasets/box_test_sphere_true_version6.vtk' + + util.write_bounding_box(params, outfilename, False) + + self.assertTrue(filecmp.cmp(outfilename, outfilename_expected)) + os.remove(outfilename) + + + def test_utilities_check_vtk_modified_box(self): + import vtk + params = pars.FFDParameters() params.read_parameters(filename='tests/test_datasets/parameters_test_ffd_sphere.prm') outfilename = 'tests/test_datasets/box_test_sphere.vtk' - outfilename_expected = 'tests/test_datasets/box_test_sphere_true.vtk' + if vtk.VTK_MAJOR_VERSION <= 5: + outfilename_expected = 'tests/test_datasets/box_modified_test_sphere_true_version5.vtk' + else: + outfilename_expected = 'tests/test_datasets/box_modified_test_sphere_true_version6.vtk' util.write_bounding_box(params, outfilename)