OGS
VtkPolylinesSource.cpp
Go to the documentation of this file.
1 
15 // ** INCLUDES **
16 #include "VtkPolylinesSource.h"
17 
18 #include <vtkCellArray.h>
19 #include <vtkCellData.h>
20 #include <vtkInformation.h>
21 #include <vtkInformationVector.h>
22 #include <vtkObjectFactory.h>
23 #include <vtkPointData.h>
24 #include <vtkPoints.h>
25 #include <vtkPolyData.h>
26 #include <vtkProperty.h>
27 #include <vtkSmartPointer.h>
28 #include <vtkStreamingDemandDrivenPipeline.h>
29 
31 #include "BaseLib/Logging.h"
32 #include "GeoLib/Polyline.h"
33 
35 
37 {
38  _removable = false; // From VtkAlgorithmProperties
39  this->SetNumberOfInputPorts(0);
40 
42  GetProperties()->SetColor(c[0] / 255.0, c[1] / 255.0, c[2] / 255.0);
43 }
44 
46 
47 void VtkPolylinesSource::PrintSelf(ostream& os, vtkIndent indent)
48 {
49  this->Superclass::PrintSelf(os, indent);
50 
51  if (_polylines->empty())
52  {
53  return;
54  }
55 
56  for (auto polyline : *_polylines)
57  {
58  os << indent << "== Polyline =="
59  << "\n";
60  int numPoints = polyline->getNumberOfPoints();
61  for (int i = 0; i < numPoints; i++)
62  {
63  const GeoLib::Point& point = *polyline->getPoint(i);
64  os << indent << "Point " << i << " (" << point[0] << ", "
65  << point[1] << ", " << point[2] << ")\n";
66  }
67  }
68 }
69 
70 int VtkPolylinesSource::RequestData(vtkInformation* request,
71  vtkInformationVector** inputVector,
72  vtkInformationVector* outputVector)
73 {
74  (void)request;
75  (void)inputVector;
76 
77  if (!_polylines)
78  {
79  return 0;
80  }
81  if (_polylines->empty())
82  {
83  ERR("VtkPolylineSource::RequestData(): Size of polyline vector is 0");
84  return 0;
85  }
86 
87  vtkSmartPointer<vtkInformation> outInfo =
88  outputVector->GetInformationObject(0);
89  vtkSmartPointer<vtkPolyData> output =
90  vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));
91 
92  vtkSmartPointer<vtkPoints> newPoints = vtkSmartPointer<vtkPoints>::New();
93  vtkSmartPointer<vtkCellArray> newLines =
94  vtkSmartPointer<vtkCellArray>::New();
95 
96  // newPoints->Allocate(numPoints);
97  // newLines->Allocate(newLines->EstimateSize(numLines, 2));
98 
99  if (outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER()) >
100  0)
101  {
102  return 1;
103  }
104 
105  vtkSmartPointer<vtkIntArray> plyIDs = vtkSmartPointer<vtkIntArray>::New();
106  plyIDs->SetNumberOfComponents(1);
107  plyIDs->SetName("PolylineIDs");
108 
109  unsigned lastMaxIndex(0);
110  const std::size_t nPolylines(_polylines->size());
111  for (std::size_t j = 0; j < nPolylines; j++)
112  {
113  const int numPoints = (*_polylines)[j]->getNumberOfPoints();
114  const bool isClosed = (*_polylines)[j]->isClosed();
115 
116  // Generate points
117  const int numVerts = (isClosed) ? numPoints - 1 : numPoints;
118  for (int i = 0; i < numVerts; i++)
119  {
120  const GeoLib::Point* point = (*_polylines)[j]->getPoint(i);
121  const double* coords = point->getCoords();
122  newPoints->InsertNextPoint(coords);
123  }
124 
125  // Generate lines
126  newLines->InsertNextCell(numPoints);
127  plyIDs->InsertNextValue(j);
128  for (int i = 0; i < numVerts; i++)
129  {
130  newLines->InsertCellPoint(i + lastMaxIndex);
131  }
132 
133  if (isClosed)
134  {
135  newLines->InsertCellPoint(lastMaxIndex);
136  }
137 
138  lastMaxIndex += numVerts;
139  }
140 
141  output->SetPoints(newPoints);
142  output->SetLines(newLines);
143  output->GetCellData()->AddArray(plyIDs);
144  output->GetCellData()->SetActiveAttribute("PolylineIDs",
145  vtkDataSetAttributes::SCALARS);
146  output->Squeeze();
147 
148  return 1;
149 }
150 
152  vtkInformation* /*request*/,
153  vtkInformationVector** /*inputVector*/,
154  vtkInformationVector* /*outputVector*/)
155 {
156  return 1;
157 }
158 
159 void VtkPolylinesSource::SetUserProperty(QString name, QVariant value)
160 {
161  Q_UNUSED(name);
162  Q_UNUSED(value);
163 }
Definition of the Color class.
void ERR(char const *fmt, Args const &... args)
Definition: Logging.h:42
Definition of the PolyLine class.
vtkStandardNewMacro(VtkPolylinesSource)
Definition of the VtkPolylinesSource class.
const T * getCoords() const
Definition: TemplatePoint.h:75
vtkProperty * GetProperties() const
Returns the vtk properties.
VtkPolylinesSource is a VTK source object for the visualisation of polyline data. As a vtkPolyDataAlg...
int RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
~VtkPolylinesSource() override
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
Computes the polygonal data object.
const std::vector< GeoLib::Polyline * > * _polylines
The polylines to visualize.
void SetUserProperty(QString name, QVariant value) override
Sets a user property. This should be implemented by subclasses.
void PrintSelf(ostream &os, vtkIndent indent) override
Prints its data on a stream.
std::array< unsigned char, 4 > Color
Definition: Color.h:24
Color getRandomColor()
Returns a random RGB colour.
Definition: Color.cpp:29