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