Esempio n. 1
0
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()));
    }
}
Esempio n. 2
0
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);
}