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