TEST_F(DEMImageNormals_test, NormalsAreNormalized) { auto demNormalFilter = vtkSmartPointer<DEMImageNormals>::New(); demNormalFilter->SetCoordinatesUnitScale(1.0); demNormalFilter->SetElevationUnitScale(1.0); demNormalFilter->SetInputData(dem); ASSERT_TRUE(demNormalFilter->GetExecutive()->Update()); auto normals = demNormalFilter->GetOutput()->GetPointData()->GetNormals(); ASSERT_TRUE(normals); ASSERT_EQ(dem->GetNumberOfPoints(), normals->GetNumberOfTuples()); for (vtkIdType i = 0; i < normals->GetNumberOfTuples(); ++i) { vtkVector3d normal; normals->GetTuple(i, normal.GetData()); ASSERT_FLOAT_EQ(1.f, static_cast<float>(normal.Norm())); } }
std::unique_ptr<DataObject> Loader::readFile(const QString & filename) { { QFile f(filename); if (!f.exists()) { qDebug() << "Loader: trying to open non-existing file: " << filename; return nullptr; } if (!f.open(QIODevice::ReadOnly)) { qDebug() << "Loader: cannot open file for read-only access: " << filename; return nullptr; } } QFileInfo fileInfo{ filename }; QString baseName = fileInfo.baseName(); QString ext = fileInfo.suffix().toLower(); auto getName = [] (vtkDataSet * dataSet) -> QString { auto nameArray = vtkCharArray::SafeDownCast(dataSet->GetFieldData()->GetArray("Name")); if (!nameArray) { return ""; } return QString::fromUtf8( nameArray->GetPointer(0), static_cast<int>(nameArray->GetSize())); }; if (ext == "vti" || ext == "dem") { vtkSmartPointer<vtkImageData> image; if (ext == "vti") { vtkNew<vtkXMLImageDataReader> reader; reader->SetFileName(filename.toUtf8().data()); if (reader->GetExecutive()->Update() == 1) { image = reader->GetOutput(); } if (!image) { qDebug() << "Invalid VTK image file: " << filename; return nullptr; } } else if (ext == "dem") { vtkNew<vtkDEMReader> reader; reader->SetFileName(filename.toUtf8().data()); if (reader->GetExecutive()->Update() == 1) { image = reader->GetOutput(); } if (!image) { qDebug() << "Invalid DEM file: " << filename; return nullptr; } } assert(image); QString dataSetName = getName(image); if (dataSetName.isEmpty()) { vtkDataArray * data = nullptr; if (!(data = image->GetPointData()->GetScalars())) { if (!(data = image->GetPointData()->GetVectors())) { if (!(data = image->GetCellData()->GetScalars())) { data = image->GetCellData()->GetVectors(); } } } if (data && data->GetName()) { dataSetName = QString::fromUtf8(data->GetName()); } } if (dataSetName.isEmpty()) { dataSetName = baseName; } switch (image->GetDataDimension()) { case 2: return std::make_unique<ImageDataObject>(dataSetName, *image); case 3: return std::make_unique<VectorGrid3DDataObject>(dataSetName, *image); default: qDebug() << "VTK image data format not supported."; return nullptr; } } if (ext == "vtp") { auto reader = vtkSmartPointer<vtkXMLPolyDataReader>::New(); reader->SetFileName(filename.toUtf8().data()); vtkSmartPointer<vtkPolyData> polyData; if (reader->GetExecutive()->Update() == 1) { polyData = reader->GetOutput(); } if (!polyData) { qDebug() << "Invalid VTK PolyData file: " << filename; return nullptr; } QString dataSetName = getName(polyData); if (dataSetName.isEmpty()) { vtkDataArray * data = nullptr; if (!(data = polyData->GetCellData()->GetScalars())) { if (!(data = polyData->GetPointData()->GetScalars())) { if (!(data = polyData->GetCellData()->GetVectors())) { data = polyData->GetPointData()->GetVectors(); } } } if (data && data->GetName()) { dataSetName = QString::fromUtf8(data->GetName()); } } if (dataSetName.isEmpty()) { dataSetName = baseName; } auto instance = GenericPolyDataObject::createInstance(dataSetName, *polyData); if (!instance) { qDebug() << "Invalid VTK PolyData file: " << filename; return nullptr; } return std::move(instance); } if (vtkImageFileExts().contains(ext)) { vtkSmartPointer<vtkImageReader2> reader; reader.TakeReference( vtkImageReader2Factory::CreateImageReader2(filename.toUtf8().data())); if (!reader) { qDebug() << "Unsupported image format: " << filename; return nullptr; } vtkImageData * image = nullptr; reader->SetFileName(filename.toUtf8().data()); if (reader->GetExecutive()->Update() == 1) { image = reader->GetOutput(); } if (!image) { qDebug() << "Invalid image file: " << filename; return nullptr; } auto scalars = image->GetPointData()->GetScalars(); // readers set the scalar name to something like "JPEGdata".. if (scalars) { scalars->SetName(baseName.toUtf8().data()); } return std::make_unique<ImageDataObject>(baseName, *image); } { DeformationTimeSeriesTextFileReader deformationReader(filename); const auto state = deformationReader.readInformation(); if (state == DeformationTimeSeriesTextFileReader::validInformation) { if (deformationReader.readData() != DeformationTimeSeriesTextFileReader::validData) { qDebug() << "Invalid deformation file: " << filename; return nullptr; } return deformationReader.generateDataObject(); } qDebug() << "Text file not recognized as valid deformation time series file."; } // handle all other files as our text file format return MetaTextFileReader::read(filename); }