1 /*=========================================================================
2 
3   Program:   Visualization Toolkit
4   Module:    vtkCompositeDataGeometryFilter.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 #include "vtkCompositeDataGeometryFilter.h"
16 
17 #include "vtkAppendPolyData.h"
18 #include "vtkCompositeDataIterator.h"
19 #include "vtkCompositeDataPipeline.h"
20 #include "vtkDataSet.h"
21 #include "vtkDataSetSurfaceFilter.h"
22 #include "vtkImageData.h"
23 #include "vtkInformation.h"
24 #include "vtkInformationVector.h"
25 #include "vtkCompositeDataSet.h"
26 #include "vtkObjectFactory.h"
27 
28 vtkStandardNewMacro(vtkCompositeDataGeometryFilter);
29 
30 //-----------------------------------------------------------------------------
vtkCompositeDataGeometryFilter()31 vtkCompositeDataGeometryFilter::vtkCompositeDataGeometryFilter()
32 {
33 }
34 
35 //-----------------------------------------------------------------------------
~vtkCompositeDataGeometryFilter()36 vtkCompositeDataGeometryFilter::~vtkCompositeDataGeometryFilter()
37 {
38 }
39 
40 //-----------------------------------------------------------------------------
FillInputPortInformation(int vtkNotUsed (port),vtkInformation * info)41 int vtkCompositeDataGeometryFilter::FillInputPortInformation(
42   int vtkNotUsed(port), vtkInformation* info)
43 {
44   // now add our info
45   info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkCompositeDataSet");
46   return 1;
47 }
48 
49 //-----------------------------------------------------------------------------
ProcessRequest(vtkInformation * request,vtkInformationVector ** inputVector,vtkInformationVector * outputVector)50 int vtkCompositeDataGeometryFilter::ProcessRequest(
51   vtkInformation* request,
52   vtkInformationVector** inputVector,
53   vtkInformationVector* outputVector)
54 {
55   // generate the data
56   if(request->Has(vtkCompositeDataPipeline::REQUEST_DATA()))
57     {
58     int retVal = this->RequestCompositeData(request, inputVector, outputVector);
59     return retVal;
60     }
61 
62  return this->Superclass::ProcessRequest(request, inputVector, outputVector);
63 }
64 
65 //-----------------------------------------------------------------------------
RequestCompositeData(vtkInformation *,vtkInformationVector ** inputVector,vtkInformationVector * outputVector)66 int vtkCompositeDataGeometryFilter::RequestCompositeData(
67   vtkInformation*,
68   vtkInformationVector** inputVector,
69   vtkInformationVector*  outputVector)
70 {
71   vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
72   vtkCompositeDataSet *input = vtkCompositeDataSet::SafeDownCast(
73     inInfo->Get(vtkDataObject::DATA_OBJECT()));
74   if (!input)
75     {
76     vtkErrorMacro("No input composite dataset provided.");
77     return 0;
78     }
79 
80   vtkInformation* info = outputVector->GetInformationObject(0);
81   vtkPolyData *output = vtkPolyData::SafeDownCast(
82     info->Get(vtkDataObject::DATA_OBJECT()));
83   if (!output)
84     {
85     vtkErrorMacro("No output polydata provided.");
86     return 0;
87     }
88 
89   bool added=false;
90   vtkCompositeDataIterator* iter = input->NewIterator();
91   vtkAppendPolyData* append = vtkAppendPolyData::New();
92   for(iter->InitTraversal(); !iter->IsDoneWithTraversal(); iter->GoToNextItem())
93     {
94     vtkDataSet* ds = vtkDataSet::SafeDownCast(iter->GetCurrentDataObject());
95     if (ds)
96       {
97       vtkDataSetSurfaceFilter* dssf = vtkDataSetSurfaceFilter::New();
98       dssf->SetInputData(ds);
99       dssf->Update();
100       append->AddInputConnection(dssf->GetOutputPort());
101       dssf->Delete();
102       added = true;
103       }
104     }
105   iter->Delete();
106   if (added)
107     {
108     append->Update();
109     output->ShallowCopy(append->GetOutput());
110     }
111 
112   append->Delete();
113 
114   return 1;
115 }
116 
117 //-----------------------------------------------------------------------------
CreateDefaultExecutive()118 vtkExecutive* vtkCompositeDataGeometryFilter::CreateDefaultExecutive()
119 {
120   return vtkCompositeDataPipeline::New();
121 }
122 
123 //-----------------------------------------------------------------------------
PrintSelf(ostream & os,vtkIndent indent)124 void vtkCompositeDataGeometryFilter::PrintSelf(ostream& os, vtkIndent indent)
125 {
126   this->Superclass::PrintSelf(os,indent);
127 }
128 
129