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