跳转至

读写矩阵

vtkSmartPointer<vtkMatrix4x4> QtResourceSupport::LoadMatrixWithQtResourceSupport(const QString & pathOrResource)
{
    QString realPath = pathOrResource;

    QTemporaryFile tmp;
    if (pathOrResource.startsWith(":/")) {
        QFile f(pathOrResource);
        if (!f.open(QIODevice::ReadOnly)) {
            return nullptr;
        }
        tmp.setFileTemplate(QDir::tempPath() + "/XXXXXX");
        if (!tmp.open()) {
            return nullptr;
        }
        tmp.write(f.readAll());
        tmp.flush();
        realPath = tmp.fileName();
    }

    QFile file(realPath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        return nullptr;
    }

    QTextStream in(&file);
    in.setRealNumberNotation(QTextStream::SmartNotation);
    in.setRealNumberPrecision(15);

    double vals[16];
    for (int k = 0; k < 16; ++k) {
        if (in.atEnd()) {
            file.close();
            return nullptr;
        }
        in >> vals[k];
    }
    file.close();

    vtkSmartPointer<vtkMatrix4x4> mat = vtkSmartPointer<vtkMatrix4x4>::New();
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            mat->SetElement(i, j, vals[4 * i + j]);
        }
    }
    return mat;
}

bool QtResourceSupport::SaveMatrixWithQtResourceSupport(const QString & pathOrResource, vtkSmartPointer<vtkMatrix4x4> mat)
{
    QString realPath = pathOrResource;
    QTemporaryFile tmp;
    bool wroteToTemp = false;
    if (pathOrResource.startsWith(":/")) {
        tmp.setFileTemplate(QDir::tempPath() + "/XXXXXX");
        if (!tmp.open()) {
            return false;
        }
        realPath = tmp.fileName();
        wroteToTemp = true;
    }

    QFile file(realPath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        return false;
    }

    QTextStream out(&file);
    out.setRealNumberNotation(QTextStream::FixedNotation);
    out.setRealNumberPrecision(15);

    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            out << mat->GetElement(i, j);
            if (!(i == 3 && j == 3)) {
                out << ' ';
            }
        }
    }
    out << '\n';
    file.close();

    (void)wroteToTemp;
    return true;
}