1 //=============================================================================
2 //
3 // Copyright (c) Kitware, Inc.
4 // All rights reserved.
5 // See LICENSE.txt for details.
6 //
7 // This software is distributed WITHOUT ANY WARRANTY; without even
8 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
9 // PURPOSE. See the above copyright notice for more information.
10 //
11 // Copyright 2012 Sandia Corporation.
12 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
13 // the U.S. Government retains certain rights in this software.
14 //
15 //=============================================================================
16 #include "vtkmImageConnectivity.h"
17
18 #include "vtkImageData.h"
19 #include "vtkInformation.h"
20 #include "vtkInformationVector.h"
21 #include "vtkNew.h"
22 #include "vtkObjectFactory.h"
23
24 #include "vtkmlib/ArrayConverters.h"
25 #include "vtkmlib/DataSetConverters.h"
26 #include "vtkmlib/PolyDataConverter.h"
27
28 #include "vtkmFilterPolicy.h"
29
30 #include <vtkm/filter/ImageConnectivity.h>
31
32 vtkStandardNewMacro(vtkmImageConnectivity);
33
34 //------------------------------------------------------------------------------
35 vtkmImageConnectivity::vtkmImageConnectivity() = default;
36
37 //------------------------------------------------------------------------------
38 vtkmImageConnectivity::~vtkmImageConnectivity() = default;
39
40 //------------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)41 void vtkmImageConnectivity::PrintSelf(ostream& os, vtkIndent indent)
42 {
43 this->Superclass::PrintSelf(os, indent);
44 }
45
46 //------------------------------------------------------------------------------
RequestData(vtkInformation *,vtkInformationVector ** inputVector,vtkInformationVector * outputVector)47 int vtkmImageConnectivity::RequestData(
48 vtkInformation*, vtkInformationVector** inputVector, vtkInformationVector* outputVector)
49 {
50 vtkInformation* outInfo = outputVector->GetInformationObject(0);
51 vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
52
53 vtkImageData* output = static_cast<vtkImageData*>(outInfo->Get(vtkDataObject::DATA_OBJECT()));
54 vtkImageData* input = static_cast<vtkImageData*>(inInfo->Get(vtkDataObject::DATA_OBJECT()));
55
56 // Find the scalar array:
57 int association = this->GetInputArrayAssociation(0, inputVector);
58 vtkDataArray* inputArray = this->GetInputArrayToProcess(0, inputVector);
59 if (association != vtkDataObject::FIELD_ASSOCIATION_POINTS || inputArray == nullptr ||
60 inputArray->GetName() == nullptr || inputArray->GetName()[0] == '\0')
61 {
62 vtkErrorMacro("Invalid scalar array; array missing or not a point array.");
63 return 0;
64 }
65
66 try
67 {
68 vtkm::filter::ImageConnectivity filter;
69 filter.SetActiveField(inputArray->GetName(), vtkm::cont::Field::Association::POINTS);
70 // the field should be named 'RegionId'
71 filter.SetOutputFieldName("RegionId");
72
73 // explicitly convert just the field we need
74 auto inData = tovtkm::Convert(input, tovtkm::FieldsFlag::None);
75 auto inField = tovtkm::Convert(inputArray, association);
76 inData.AddField(inField);
77
78 // don't pass this field
79 filter.SetFieldsToPass(vtkm::filter::FieldSelection(vtkm::filter::FieldSelection::MODE_NONE));
80
81 vtkm::cont::DataSet result;
82 result = filter.Execute(inData);
83
84 // Make sure the output has all the fields / etc that the input has
85 output->ShallowCopy(input);
86
87 // convert back the regionId field to VTK
88 if (!fromvtkm::ConvertArrays(result, output))
89 {
90 vtkWarningMacro(<< "Unable to convert VTKm DataSet back to VTK.\n"
91 << "Falling back to serial implementation.");
92 return 0;
93 }
94 }
95 catch (const vtkm::cont::Error& e)
96 {
97 vtkErrorMacro(<< "VTK-m error: " << e.GetMessage());
98 return 0;
99 }
100 return 1;
101 }
102