1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: TestPointCloudFilterArrays.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
16 #include <vtkSmartPointer.h>
17 #include <vtkRadiusOutlierRemoval.h>
18
19 #include <vtkPoints.h>
20 #include <vtkPolyData.h>
21 #include <vtkPointData.h>
22
23 #include <vtkUnsignedCharArray.h>
24 #include <vtkCharArray.h>
25 #include <vtkUnsignedShortArray.h>
26 #include <vtkShortArray.h>
27 #include <vtkUnsignedIntArray.h>
28 #include <vtkIntArray.h>
29 #include <vtkUnsignedLongArray.h>
30 #include <vtkLongArray.h>
31
32 template<typename T> vtkSmartPointer<T> MakeArray (const std::string &name);
33
TestPointCloudFilterArrays(int,char * [])34 int TestPointCloudFilterArrays(int, char*[])
35 {
36 const double pt1[3] = { 0, 0, 0};
37 const double pt2[3] = { 1, 0, 0};
38 const double pt3[3] = { 2, 0, 0};
39
40 vtkSmartPointer<vtkPoints> points =
41 vtkSmartPointer<vtkPoints>::New();
42 points->SetDataTypeToDouble();
43 points->InsertNextPoint(pt1);
44 points->InsertNextPoint(pt2);
45 points->InsertNextPoint(pt3);
46
47 // Generate arrays of integral types
48 vtkSmartPointer<vtkUnsignedCharArray> uca =
49 MakeArray<vtkUnsignedCharArray> ("uca");
50 vtkSmartPointer<vtkCharArray> ca =
51 MakeArray<vtkCharArray> ("ca");
52
53 vtkSmartPointer<vtkUnsignedShortArray> usa =
54 MakeArray<vtkUnsignedShortArray> ("usa");
55 vtkSmartPointer<vtkShortArray> sa =
56 MakeArray<vtkShortArray> ("sa");
57
58 vtkSmartPointer<vtkUnsignedIntArray> uia =
59 MakeArray<vtkUnsignedIntArray> ("uia");
60 vtkSmartPointer<vtkIntArray> ia =
61 MakeArray<vtkIntArray> ("ia");
62
63 vtkSmartPointer<vtkUnsignedLongArray> ula =
64 MakeArray<vtkUnsignedLongArray> ("ula");
65 vtkSmartPointer<vtkLongArray> la =
66 MakeArray<vtkLongArray> ("la");
67
68 vtkSmartPointer<vtkPolyData> polyData =
69 vtkSmartPointer<vtkPolyData>::New();
70 polyData->SetPoints(points);
71 polyData->GetPointData()->AddArray(uca);
72 polyData->GetPointData()->AddArray(ca);
73 polyData->GetPointData()->AddArray(usa);
74 polyData->GetPointData()->AddArray(sa);
75 polyData->GetPointData()->AddArray(uia);
76 polyData->GetPointData()->AddArray(ia);
77 polyData->GetPointData()->AddArray(ula);
78 polyData->GetPointData()->AddArray(la);
79
80 vtkSmartPointer<vtkRadiusOutlierRemoval> outlierRemoval =
81 vtkSmartPointer<vtkRadiusOutlierRemoval>::New();
82 outlierRemoval->SetInputData(polyData);
83 outlierRemoval->SetRadius(1.5);
84 outlierRemoval->SetNumberOfNeighbors(2);
85 outlierRemoval->Update();
86
87 vtkPointData *inPD = polyData->GetPointData();
88 vtkPointData *outPD = outlierRemoval->GetOutput()->GetPointData();
89 // Number of arrays should match
90 if (inPD->GetNumberOfArrays() != outPD->GetNumberOfArrays())
91 {
92 std::cout << "ERROR: Number of input arrays : " << inPD->GetNumberOfArrays()
93 << " != " << outPD->GetNumberOfArrays() << std::endl;
94 return EXIT_FAILURE;
95 }
96 // Types should not change
97 int status = 0;
98 for (int i = 0; i < outPD->GetNumberOfArrays(); ++i)
99 {
100 vtkDataArray *outArray = outPD->GetArray(i);
101 vtkDataArray *inArray = inPD->GetArray(i);
102 if (inArray->GetDataType() != outArray->GetDataType())
103 {
104 std::cout << "ERROR: Output array: " << outArray->GetName() << ", type: " << outArray->GetDataTypeAsString()
105 << " does not match "
106 << "Input array: " << inArray->GetName() << ", type: " << inArray->GetDataTypeAsString()
107 << std::endl;
108 ++status;
109 }
110 }
111 return status == 0 ? EXIT_SUCCESS: EXIT_FAILURE;
112 }
113
MakeArray(const std::string & name)114 template<typename T> vtkSmartPointer<T> MakeArray (const std::string &name)
115 {
116 vtkSmartPointer<T> array = vtkSmartPointer<T>::New();
117 array->SetName(name.c_str());
118 array->SetNumberOfComponents(1);
119 array->InsertNextValue(1);
120 array->InsertNextValue(2);
121 array->InsertNextValue(3);
122 return array;
123 }
124