1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: TestQuadRotationalExtrusion.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 // .SECTION Thanks
16 // This test was written by Philippe Pebay, Kitware SAS 2012
17
18 #include "vtkSmartPointer.h"
19
20 #include "vtkAVSucdReader.h"
21 #include "vtkCamera.h"
22 #include "vtkCellData.h"
23 #include "vtkCompositeDataIterator.h"
24 #include "vtkDataSetMapper.h"
25 #include "vtkDoubleArray.h"
26 #include "vtkInformation.h"
27 #include "vtkMultiBlockDataSet.h"
28 #include "vtkNew.h"
29 #include "vtkProperty.h"
30 #include "vtkRenderer.h"
31 #include "vtkRenderWindow.h"
32 #include "vtkRenderWindowInteractor.h"
33 #include "vtkTestUtilities.h"
34 #include "vtkThreshold.h"
35 #include "vtkUnstructuredGrid.h"
36 #include "vtkYoungsMaterialInterface.h"
37
38 //----------------------------------------------------------------------------
TestYoungsMaterialInterface(int argc,char * argv[])39 int TestYoungsMaterialInterface( int argc, char * argv [] )
40 {
41 // Create renderer and add actors to it
42 vtkNew<vtkRenderer> renderer;
43 renderer->SetBackground( .8, .8 ,.8 );
44
45 // Create render window;
46 vtkNew<vtkRenderWindow> window;
47 window->AddRenderer( renderer.GetPointer() );
48 window->SetSize( 500, 200 );
49 window->SetMultiSamples( 0 );
50
51 // Create interactor;
52 vtkNew<vtkRenderWindowInteractor> interactor;
53 interactor->SetRenderWindow( window.GetPointer() );
54
55 // Read from AVS UCD data in binary form;
56 char* fileName = vtkTestUtilities::ExpandDataFileName( argc, argv, "Data/UCD2D/UCD_00005.inp");
57 vtkNew<vtkAVSucdReader> reader;
58 reader->SetFileName( fileName );
59 delete [] fileName;
60
61 // Update reader and get mesh cell data;
62 reader->Update();
63 vtkUnstructuredGrid* mesh = reader->GetOutput();
64 vtkCellData* cellData = mesh->GetCellData();
65
66 // Create normal vectors;
67 cellData->SetActiveScalars( "norme[0]" );
68 vtkDataArray* normX = cellData->GetScalars();
69 cellData->SetActiveScalars( "norme[1]" );
70 vtkDataArray* normY = cellData->GetScalars();
71 vtkIdType n = normX->GetNumberOfTuples();
72 vtkNew<vtkDoubleArray> norm;
73 norm->SetNumberOfComponents( 3 );
74 norm->SetNumberOfTuples( n );
75 norm->SetName( "norme" );
76 for ( int i = 0; i < n; ++ i )
77 {
78 norm->SetTuple3( i, normX->GetTuple1( i ), normY->GetTuple1( i ), 0. );
79 }
80 cellData->SetVectors( norm.GetPointer() );
81
82 // Extract submesh corresponding with cells containing material 2
83 cellData->SetActiveScalars( "Material Id" );
84 vtkNew<vtkThreshold> threshold2;
85 threshold2->SetInputData( mesh );
86 threshold2->SetInputArrayToProcess( 0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, vtkDataSetAttributes::SCALARS );
87 threshold2->ThresholdByLower( 2 );
88 threshold2->Update();
89 vtkUnstructuredGrid* meshMat2 = threshold2->GetOutput();
90
91 // Extract submesh corresponding with cells containing material 3
92 vtkNew<vtkThreshold> threshold3;
93 threshold3->SetInputData( mesh );
94 threshold3->SetInputArrayToProcess( 0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_CELLS, vtkDataSetAttributes::SCALARS );
95 threshold3->ThresholdByUpper( 3 );
96 threshold3->Update();
97 vtkUnstructuredGrid* meshMat3 = threshold3->GetOutput();
98
99 // Make multiblock from extracted submeshes;
100 vtkNew<vtkMultiBlockDataSet> meshMB;
101 meshMB->SetNumberOfBlocks( 2 );
102 meshMB->GetMetaData( static_cast<unsigned>( 0 ) )->Set( vtkCompositeDataSet::NAME(), "Material 2" );
103 meshMB->SetBlock( 0, meshMat2 );
104 meshMB->GetMetaData( static_cast<unsigned>( 1 ) )->Set( vtkCompositeDataSet::NAME(), "Material 3" );
105 meshMB->SetBlock( 1, meshMat3 );
106
107 // Create mapper for submesh corresponding to material 2;
108 double* matRange = cellData->GetScalars()->GetRange();
109 vtkNew<vtkDataSetMapper> meshMapper;
110 meshMapper->SetInputData( meshMat2 );
111 meshMapper->SetScalarRange( matRange );
112 meshMapper->SetScalarModeToUseCellData();
113 meshMapper->SetColorModeToMapScalars();
114 meshMapper->ScalarVisibilityOn();
115 meshMapper->SetResolveCoincidentTopologyPolygonOffsetParameters( 0, 1 );
116 meshMapper->SetResolveCoincidentTopologyToPolygonOffset();
117
118 // Create wireframe actor for entire mesh
119 vtkNew<vtkActor> meshActor;
120 meshActor->SetMapper( meshMapper.GetPointer() );
121 meshActor->GetProperty()->SetRepresentationToWireframe();
122 renderer->AddViewProp( meshActor.GetPointer() );
123
124 cellData->SetActiveScalars("frac_pres[1]");
125 // Reconstruct Youngs material interface
126 vtkNew<vtkYoungsMaterialInterface> youngs;
127 youngs->SetInputData( meshMB.GetPointer() );
128 youngs->SetNumberOfMaterials( 2 );
129 youngs->SetMaterialVolumeFractionArray( 0, "frac_pres[1]" );
130 youngs->SetMaterialVolumeFractionArray( 1, "frac_pres[2]" );
131 youngs->SetMaterialNormalArray( 0, "norme" );
132 youngs->SetMaterialNormalArray( 1, "norme" );
133 youngs->SetVolumeFractionRange( .001, .999 );
134 youngs->FillMaterialOn();
135 youngs->RemoveAllMaterialBlockMappings();
136 youngs->AddMaterialBlockMapping( -1 );
137 youngs->AddMaterialBlockMapping( 1 );
138 youngs->AddMaterialBlockMapping( -2 );
139 youngs->AddMaterialBlockMapping( 2 );
140 youngs->UseAllBlocksOff();
141 youngs->Update();
142
143 // Create mappers and actors for surface rendering of all reconstructed interfaces;
144 vtkSmartPointer<vtkCompositeDataIterator> interfaceIterator;
145 interfaceIterator.TakeReference( youngs->GetOutput()->NewIterator() );
146 interfaceIterator->SkipEmptyNodesOn();
147 interfaceIterator->InitTraversal();
148 interfaceIterator->GoToFirstItem();
149 while ( interfaceIterator->IsDoneWithTraversal() == 0 )
150 {
151 // Select blue component of leaf mesh
152 double bComp = interfaceIterator->GetCurrentFlatIndex() == 2 ? 0 : 1;
153
154 // Fetch interface object and downcast to data set
155 vtkDataObject* interfaceDO = interfaceIterator->GetCurrentDataObject();
156 vtkDataSet* interface = vtkDataSet::SafeDownCast( interfaceDO );
157
158 // Create mapper for interface
159 vtkNew<vtkDataSetMapper> interfaceMapper;
160 interfaceMapper->SetInputData( interface );
161 interfaceIterator->GoToNextItem();
162 interfaceMapper->ScalarVisibilityOff();
163 interfaceMapper->SetResolveCoincidentTopologyPolygonOffsetParameters( 1, 1 );
164 interfaceMapper->SetResolveCoincidentTopologyToPolygonOffset();
165
166 // Create surface actor and add it to view
167 vtkNew<vtkActor> interfaceActor;
168 interfaceActor->SetMapper( interfaceMapper.GetPointer() );
169 interfaceActor->GetProperty()->SetColor( 0., 1 - bComp, bComp );
170 interfaceActor->GetProperty()->SetRepresentationToSurface();
171 renderer->AddViewProp( interfaceActor.GetPointer() );
172 }
173
174 // Render and test;
175 window->Render();
176 interactor->Start();
177
178 return EXIT_SUCCESS;
179 }
180