#include "medContoursWriters.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const QString medContoursWriter::metaDataFieldPrefix = "medMetaData::"; const QString medContoursWriter::header = "medInria contours"; medContoursWriter::medContoursWriter() : dtkAbstractDataWriter() { } medContoursWriter::~medContoursWriter() { } QString medContoursWriter::description() const { return tr("Writer for Contours (Polygon ROI)"); } QString medContoursWriter::identifier() const { return QString("medContoursWriter"); } QStringList medContoursWriter::supportedFileExtensions() const { return QStringList() << ".ctrb"; } bool medContoursWriter::registered() { return medAbstractDataFactory::instance()->registerDataWriterType("medContoursWriter", medContoursWriter::s_handled(), createMedContoursWriter); } QStringList medContoursWriter::handled() const { return s_handled(); } QStringList medContoursWriter::s_handled() { return QStringList() << QString("medContours"); } bool medContoursWriter::canWrite(const QString& path) { if (!this->data()) { return false; } return dynamic_cast((vtkObject*)(this->data()->data())); } bool medContoursWriter::write(const QString& path) { bool bRes; if (!this->data()) { return false; } medContours* ctr = dynamic_cast(this->data()); if(!ctr) { return false; } vtkMetaDataSet* mesh = dynamic_cast((vtkObject*)(this->data()->data())); if (!mesh) { return false; } if (mesh->GetType() != vtkMetaDataSet::VTK_META_SURFACE_MESH) { qDebug()<< metaObject()->className() << "::write - dataset is not a mesh"; return false; } if ( path.endsWith(".ctr") ) { // TODO ==> operator << to implement in medTagContours bRes = false; // writeASCIIFile(ctr, path, mesh); } else if ( path.endsWith(".ctrb") ) { bRes = writeBinaryFile(path, ctr, mesh); } else { qDebug()<className()<<":: write - xtension not supported."; bRes = false; } return bRes; } bool medContoursWriter::writeBinaryFile(const QString& path, medContours* ctr, vtkMetaDataSet* mesh) { try { QFile file(path); if (file.open(QFile::WriteOnly)) { QDataStream out(&file); qint64 version = EXPORT_VERSION_1; qint64 meshPos = 0; qint64 contoursPos = 0; qint64 endFilePos = 0; out << version << meshPos << contoursPos << endFilePos; meshPos = file.pos(); addMetaDataAsFieldData(mesh); vtkSmartPointer writer = nullptr; writer = vtkSmartPointer::New(); writer->SetInputData(dynamic_cast(mesh->GetDataSet())); writer->SetFileTypeToBinary(); writer->SetWriteToOutputString(1); writer->SetHeader(qPrintable(header)); writer->Write(); // write to output file int writeStatus = out.writeRawData(reinterpret_cast(writer->GetBinaryOutputString()), writer->GetOutputStringLength()); if (writeStatus == -1) { qDebug() << metaObject()->className() << ":: write - unable to write mesh as binary data."; file.close(); return false; } clearMetaDataFieldData(mesh); contoursPos = file.pos(); QVector &contours = ctr->getTagContoursSet(); out<className() << "::write - error writing to "<Write(path.toLocal8Bit().constData()); clearMetaDataFieldData(mesh); QFile file(path); if (file.open(QFile::Append)) { QTextStream out(&file); QVector contoursSet = ctr->getTagContoursSet(); out<<"number of labelList\n"<className() << "::write - error writing to "<metaDataList()) { vtkSmartPointer metaDataArray = vtkSmartPointer::New(); QString arrayName = QString(metaDataFieldPrefix) + key; metaDataArray->SetName(arrayName.toStdString().c_str()); foreach (QString value, data()->metaDataValues(key)) { metaDataArray->InsertNextValue(value.toStdString().c_str()); } dataSet->GetDataSet()->GetFieldData()->AddArray(metaDataArray); } } void medContoursWriter::clearMetaDataFieldData(vtkMetaDataSet* dataSet) { vtkFieldData* fieldData = dataSet->GetDataSet()->GetFieldData(); vtkSmartPointer newFieldData = vtkSmartPointer::New(); for (int i = 0; i < fieldData->GetNumberOfArrays(); i++) { QString arrayName = fieldData->GetArrayName(i); if (!arrayName.startsWith(metaDataFieldPrefix)) { newFieldData->AddArray(fieldData->GetAbstractArray(i)); } } dataSet->GetDataSet()->SetFieldData(newFieldData); } // ///////////////////////////////////////////////////////////////// // Type instantiation // ///////////////////////////////////////////////////////////////// dtkAbstractDataWriter* createMedContoursWriter() { return new medContoursWriter; }