47 #include <igtl_util.h> 48 #include <igtlPolyDataMessage.h> 51 #include <vtkPolyData.h> 52 #include <vtkIntArray.h> 53 #include <vtkMatrix4x4.h> 54 #include <vtkObjectFactory.h> 55 #include <vtkSmartPointer.h> 56 #include <vtkVertex.h> 57 #include <vtkCellArray.h> 58 #include <vtkPolyLine.h> 59 #include <vtkPolygon.h> 60 #include <vtkTriangleStrip.h> 61 #include <vtkFloatArray.h> 62 #include <vtkDataSetAttributes.h> 63 #include <vtkPointData.h> 64 #include <vtkCellData.h> 77 igtl::PolyDataMessage::Pointer retval = igtl::PolyDataMessage::New();
83 polyData = this->encodeCoordinateSystem(in, externalSpace);
84 this->encode_vtkPolyData(polyData, retval);
92 polyData = this->decodeCoordinateSystem(polyData, externalSpace);
94 QString deviceName = in->GetDeviceName();
97 retval->setVtkPolyData(polyData);
98 retval->setAcquisitionTime(timestamp);
112 vtkPolyDataPtr IGTLinkConversionPolyData::encodeCoordinateSystem(
MeshPtr mesh, PATIENT_COORDINATE_SYSTEM externalSpace)
122 vtkPolyDataPtr IGTLinkConversionPolyData::decode_vtkPolyData(igtl::PolyDataMessage* msg)
127 igtl::PolyDataMessage* polyDataMsg = msg;
129 vtkSmartPointer<vtkPolyData> poly = vtkSmartPointer<vtkPolyData>::New();
132 igtl::PolyDataPointArray::Pointer pointsArray = polyDataMsg->GetPoints();
133 int npoints = pointsArray->GetNumberOfPoints();
136 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
137 for (
int i = 0; i < npoints; i ++)
139 igtlFloat32 point[3];
140 pointsArray->GetPoint(i, point);
141 points->InsertNextPoint(point);
143 poly->SetPoints(points);
151 igtl::PolyDataCellArray::Pointer verticesArray = polyDataMsg->GetVertices();
152 int nvertices = verticesArray.IsNotNull() ? verticesArray->GetNumberOfCells() : 0;
155 vtkSmartPointer<vtkCellArray> vertCells = vtkSmartPointer<vtkCellArray>::New();
156 for (
int i = 0; i < nvertices; i ++)
158 vtkSmartPointer<vtkVertex> vertex = vtkSmartPointer<vtkVertex>::New();
160 std::list<igtlUint32> cell;
161 verticesArray->GetCell(i, cell);
164 std::list<igtlUint32>::iterator iter;
166 vertex->GetPointIds()->SetId(i, *iter);
168 vertCells->InsertNextCell(vertex);
170 poly->SetVerts(vertCells);
174 igtl::PolyDataCellArray::Pointer linesArray = polyDataMsg->GetLines();
175 int nlines = linesArray.IsNotNull() ? linesArray->GetNumberOfCells() : 0;
178 vtkSmartPointer<vtkCellArray> lineCells = vtkSmartPointer<vtkCellArray>::New();
179 for(
int i = 0; i < nlines; i++)
181 vtkSmartPointer<vtkPolyLine> polyLine = vtkSmartPointer<vtkPolyLine>::New();
183 std::list<igtlUint32> cell;
184 linesArray->GetCell(i, cell);
185 polyLine->GetPointIds()->SetNumberOfIds(cell.size());
186 std::list<igtlUint32>::iterator iter;
188 for (iter = cell.begin(); iter != cell.end(); iter ++)
190 polyLine->GetPointIds()->SetId(j, *iter);
193 lineCells->InsertNextCell(polyLine);
195 poly->SetLines(lineCells);
199 igtl::PolyDataCellArray::Pointer polygonsArray = polyDataMsg->GetPolygons();
200 int npolygons =polygonsArray.IsNotNull() ? polygonsArray->GetNumberOfCells() : 0;
203 vtkSmartPointer<vtkCellArray> polygonCells = vtkSmartPointer<vtkCellArray>::New();
204 for(
int i = 0; i < npolygons; i++)
206 vtkSmartPointer<vtkPolygon> polygon = vtkSmartPointer<vtkPolygon>::New();
208 std::list<igtlUint32> cell;
209 polygonsArray->GetCell(i, cell);
210 polygon->GetPointIds()->SetNumberOfIds(cell.size());
211 std::list<igtlUint32>::iterator iter;
213 for (iter = cell.begin(); iter != cell.end(); iter ++)
215 polygon->GetPointIds()->SetId(j, *iter);
218 polygonCells->InsertNextCell(polygon);
220 poly->SetPolys(polygonCells);
224 igtl::PolyDataCellArray::Pointer triangleStripsArray = polyDataMsg->GetTriangleStrips();
225 int ntstrips = triangleStripsArray.IsNotNull() ? triangleStripsArray->GetNumberOfCells() : 0;
228 vtkSmartPointer<vtkCellArray> tstripCells = vtkSmartPointer<vtkCellArray>::New();
229 for(
int i = 0; i < ntstrips; i++)
231 vtkSmartPointer<vtkTriangleStrip> tstrip = vtkSmartPointer<vtkTriangleStrip>::New();
233 std::list<igtlUint32> cell;
234 triangleStripsArray->GetCell(i, cell);
235 tstrip->GetPointIds()->SetNumberOfIds(cell.size());
236 std::list<igtlUint32>::iterator iter;
238 for (iter = cell.begin(); iter != cell.end(); iter ++)
240 tstrip->GetPointIds()->SetId(j, *iter);
243 tstripCells->InsertNextCell(tstrip);
245 poly->SetStrips(tstripCells);
249 int nAttributes = polyDataMsg->GetNumberOfAttributes();
250 for (
int i = 0; i < nAttributes; i ++)
252 igtl::PolyDataAttribute::Pointer attribute;
253 attribute = polyDataMsg->GetAttribute(i);
255 vtkSmartPointer<vtkFloatArray> data =
256 vtkSmartPointer<vtkFloatArray>::New();
258 data->SetName(attribute->GetName());
259 int n = attribute->GetSize();
267 switch (attribute->GetType() & 0x0F)
269 case igtl::PolyDataAttribute::POINT_SCALAR:
271 data->SetNumberOfComponents(1);
274 case igtl::PolyDataAttribute::POINT_VECTOR:
275 case igtl::PolyDataAttribute::POINT_NORMAL:
277 data->SetNumberOfComponents(3);
280 case igtl::PolyDataAttribute::POINT_TENSOR:
282 data->SetNumberOfComponents(9);
285 case igtl::PolyDataAttribute::POINT_RGBA:
287 data->SetNumberOfComponents(4);
296 data->SetNumberOfTuples(n);
297 attribute->GetData(static_cast<igtl_float32*>(data->GetPointer(0)));
299 if ((attribute->GetType() & 0xF0) == 0)
301 poly->GetPointData()->AddArray(data);
305 poly->GetCellData()->AddArray(data);
314 void IGTLinkConversionPolyData::encode_vtkPolyData(
vtkPolyDataPtr in, igtl::PolyDataMessage* outMsg)
319 vtkSmartPointer<vtkPolyData> poly = in;
322 vtkSmartPointer<vtkPoints> points = poly->GetPoints();
323 if (points.GetPointer() != NULL)
325 int npoints = points->GetNumberOfPoints();
328 igtl::PolyDataPointArray::Pointer pointArray = igtl::PolyDataPointArray::New();
329 for (
int i = 0; i < npoints; i ++)
331 double *p = points->GetPoint(i);
332 pointArray->AddPoint(static_cast<igtlFloat32>(p[0]),
333 static_cast<igtlFloat32>(p[1]),
334 static_cast<igtlFloat32>(p[2]));
336 outMsg->SetPoints(pointArray);
341 vtkSmartPointer<vtkCellArray> vertCells = poly->GetVerts();
342 if (vertCells.GetPointer() != NULL)
344 igtl::PolyDataCellArray::Pointer verticesArray = igtl::PolyDataCellArray::New();
345 if (this->VTKToIGTLCellArray(vertCells, verticesArray) > 0)
347 outMsg->SetVertices(verticesArray);
352 vtkSmartPointer<vtkCellArray> lineCells = poly->GetLines();
353 if (lineCells.GetPointer() != NULL)
355 igtl::PolyDataCellArray::Pointer linesArray = igtl::PolyDataCellArray::New();
356 if (this->VTKToIGTLCellArray(lineCells, linesArray) > 0)
358 outMsg->SetLines(linesArray);
363 vtkSmartPointer<vtkCellArray> polygonCells = poly->GetPolys();
364 if (polygonCells.GetPointer() != NULL)
366 igtl::PolyDataCellArray::Pointer polygonsArray = igtl::PolyDataCellArray::New();
367 if (this->VTKToIGTLCellArray(polygonCells, polygonsArray) > 0)
369 outMsg->SetPolygons(polygonsArray);
374 vtkSmartPointer<vtkCellArray> triangleStripCells = poly->GetStrips();
375 if (triangleStripCells.GetPointer() != NULL)
377 igtl::PolyDataCellArray::Pointer triangleStripsArray = igtl::PolyDataCellArray::New();
378 if (this->VTKToIGTLCellArray(triangleStripCells, triangleStripsArray) > 0)
380 outMsg->SetTriangleStrips(triangleStripsArray);
385 vtkSmartPointer<vtkPointData> pdata = poly->GetPointData();
386 int nPointAttributes = pdata->GetNumberOfArrays();
387 if (nPointAttributes > 0)
389 for (
int i = 0; i < nPointAttributes; i ++)
391 igtl::PolyDataAttribute::Pointer attribute = igtl::PolyDataAttribute::New();
392 if (this->VTKToIGTLAttribute(pdata, i, attribute) > 0)
394 outMsg->AddAttribute(attribute);
401 vtkSmartPointer<vtkCellData> cdata = poly->GetCellData();
402 int nCellAttributes = cdata->GetNumberOfArrays();
403 if (nCellAttributes > 0)
405 for (
int i = 0; i < nCellAttributes; i ++)
407 igtl::PolyDataAttribute::Pointer attribute = igtl::PolyDataAttribute::New();
408 if (this->VTKToIGTLAttribute(cdata, i, attribute) > 0)
410 outMsg->AddAttribute(attribute);
417 int IGTLinkConversionPolyData::VTKToIGTLCellArray(vtkCellArray* src, igtl::PolyDataCellArray* dest)
421 int ncells = src->GetNumberOfCells();
424 vtkSmartPointer<vtkIdList> idList = vtkSmartPointer<vtkIdList>::New();
425 src->InitTraversal();
426 while (src->GetNextCell(idList))
428 std::list<igtlUint32> cell;
429 int nIds = idList->GetNumberOfIds();
430 for (
int i = 0; i < nIds; i ++)
432 cell.push_back(idList->GetId(i));
448 int IGTLinkConversionPolyData::VTKToIGTLAttribute(vtkDataSetAttributes* src,
int i, igtl::PolyDataAttribute* dest)
452 if ((!src) || (!dest))
458 if (i < 0 || i >= src->GetNumberOfArrays())
468 if (src->IsTypeOf(
"vtkCellData"))
477 vtkSmartPointer<vtkDataArray> array = src->GetArray(i);
478 int ncomps = array->GetNumberOfComponents();
481 dest->SetType(igtl::PolyDataAttribute::POINT_SCALAR | attrTypeBit);
483 else if (ncomps == 3)
486 dest->SetType(igtl::PolyDataAttribute::POINT_NORMAL | attrTypeBit);
488 else if (ncomps == 9)
490 dest->SetType(igtl::PolyDataAttribute::POINT_TENSOR | attrTypeBit);
492 else if (ncomps == 4)
494 dest->SetType(igtl::PolyDataAttribute::POINT_RGBA | attrTypeBit);
496 dest->SetName((array->GetName() ? array->GetName() :
""));
497 int ntuples = array->GetNumberOfTuples();
498 dest->SetSize(ntuples);
500 for (
int j = 0; j < ntuples; j ++)
502 double * tuple = array->GetTuple(j);
504 for (
int k = 0; k < ncomps; k ++)
506 data[k] =
static_cast<igtlFloat32
>(tuple[k]);
508 dest->SetNthData(j, data);
QDateTime decode_timestamp(igtl::MessageBase *msg)
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
cxResource_EXPORT Transform3D createTransformFromReferenceToExternal(PATIENT_COORDINATE_SYSTEM external)
cstring_cast_Placeholder cstring_cast(const T &val)
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
MeshPtr decode(igtl::PolyDataMessage *in, PATIENT_COORDINATE_SYSTEM externalSpace)
igtl::PolyDataMessage::Pointer encode(MeshPtr in, PATIENT_COORDINATE_SYSTEM externalSpace)
void encode_timestamp(QDateTime ts, igtl::MessageBase *msg)
boost::shared_ptr< class Mesh > MeshPtr
Namespace for all CustusX production code.