lbajardsilogic@15: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@15: lbajardsilogic@15: /* Sound Access lbajardsilogic@15: EASAIER client application. lbajardsilogic@15: Silogic 2007. Laure Bajard. lbajardsilogic@15: lbajardsilogic@15: This program is free software; you can redistribute it and/or lbajardsilogic@15: modify it under the terms of the GNU General Public License as lbajardsilogic@15: published by the Free Software Foundation; either version 2 of the lbajardsilogic@15: License, or (at your option) any later version. See the file lbajardsilogic@15: COPYING included with this distribution for more information. lbajardsilogic@15: */ lbajardsilogic@15: lbajardsilogic@15: #include "ModelReader.h" lbajardsilogic@15: lbajardsilogic@15: #include "document/Document.h" lbajardsilogic@15: #include "layer/Layer.h" lbajardsilogic@15: lbajardsilogic@15: #include "data/model/EditableDenseThreeDimensionalModel.h" lbajardsilogic@15: #include "data/model/SparseOneDimensionalModel.h" lbajardsilogic@15: #include "data/model/SparseTimeValueModel.h" lbajardsilogic@15: #include "data/model/NoteModel.h" lbajardsilogic@15: #include "data/model/TextModel.h" lbajardsilogic@15: #include "data/model/IntervalModel.h" lbajardsilogic@15: #include "view/Pane.h" lbajardsilogic@15: lbajardsilogic@15: #include lbajardsilogic@15: lbajardsilogic@15: ModelReader::ModelReader(Document *document, Layer * layer, Pane * pane) : lbajardsilogic@15: m_document(document), lbajardsilogic@15: m_layer(layer), lbajardsilogic@15: m_pane(pane) lbajardsilogic@15: {} lbajardsilogic@15: lbajardsilogic@15: bool ModelReader::parse(const QString & filename) lbajardsilogic@15: { lbajardsilogic@15: ModelHandler handler(m_document, m_layer, m_pane); lbajardsilogic@15: QXmlSimpleReader reader; lbajardsilogic@15: reader.setContentHandler(&handler); lbajardsilogic@15: reader.setErrorHandler(&handler); lbajardsilogic@15: lbajardsilogic@15: QFile file(filename); lbajardsilogic@15: lbajardsilogic@15: if (!file.open(QFile::ReadOnly | QFile::Text)) { lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: QXmlInputSource xmlInputSource(&file); lbajardsilogic@15: if (reader.parse(xmlInputSource)) lbajardsilogic@15: { lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: ModelHandler::ModelHandler(Document *document, Layer * layer, Pane* pane) : QXmlDefaultHandler(), lbajardsilogic@15: m_document(document), lbajardsilogic@15: m_layer(layer), lbajardsilogic@15: m_pane(pane), lbajardsilogic@15: m_model(0), lbajardsilogic@15: m_datasetSeparator(" "), lbajardsilogic@15: m_inData(false), lbajardsilogic@15: m_inRow(false), lbajardsilogic@15: m_rowNumber(0) lbajardsilogic@15: {} lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::startElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@15: const QString &qName, const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: lbajardsilogic@15: QString name = qName.toLower(); lbajardsilogic@15: lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: // Valid element names: lbajardsilogic@15: // lbajardsilogic@15: // easaier lbajardsilogic@15: // data lbajardsilogic@15: // dataset lbajardsilogic@15: // model lbajardsilogic@15: // point lbajardsilogic@15: // row lbajardsilogic@15: // interval lbajardsilogic@15: lbajardsilogic@15: if (name == "easaier") { lbajardsilogic@15: lbajardsilogic@15: // nothing needed lbajardsilogic@15: ok = true; lbajardsilogic@15: lbajardsilogic@15: } else if (name == "data") { lbajardsilogic@15: lbajardsilogic@15: m_inData = true; lbajardsilogic@15: if (m_layer == 0) lbajardsilogic@15: { lbajardsilogic@15: ok = readLayer(attributes); lbajardsilogic@15: } else { lbajardsilogic@15: ok = true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: } else if (name == "model") { lbajardsilogic@15: lbajardsilogic@15: ok = readModel(attributes); lbajardsilogic@15: lbajardsilogic@15: } else if (name == "dataset") { lbajardsilogic@15: lbajardsilogic@15: ok = readDatasetStart(attributes); lbajardsilogic@15: lbajardsilogic@15: } else if (name == "bin") { lbajardsilogic@15: lbajardsilogic@15: ok = addBinToDataset(attributes); lbajardsilogic@15: lbajardsilogic@15: } else if (name == "point") { lbajardsilogic@15: lbajardsilogic@15: ok = addPointToDataset(attributes); lbajardsilogic@15: lbajardsilogic@15: } else if (name == "row") { lbajardsilogic@15: lbajardsilogic@15: ok = addRowToDataset(attributes); lbajardsilogic@15: lbajardsilogic@15: } else if (name == "interval") { lbajardsilogic@15: lbajardsilogic@15: ok = addIntervalToDataset(attributes); lbajardsilogic@15: lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Failed to completely process element \"" lbajardsilogic@15: << name.toLocal8Bit().data() << "\"" << std::endl; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::endElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@15: const QString &qName) lbajardsilogic@15: { lbajardsilogic@15: QString name = qName.toLower(); lbajardsilogic@15: lbajardsilogic@15: if (name == "dataset") lbajardsilogic@15: { lbajardsilogic@15: if ((m_model) && (m_layer)) lbajardsilogic@15: { lbajardsilogic@15: m_document->addImportedModel(m_model); lbajardsilogic@15: m_document->setModel(m_layer, m_model); lbajardsilogic@15: } lbajardsilogic@15: } lbajardsilogic@15: else if (name == "data") lbajardsilogic@15: { lbajardsilogic@15: m_inData = false; lbajardsilogic@15: if (m_pane && m_layer) lbajardsilogic@15: { lbajardsilogic@15: m_document->addLayerToView(m_pane, m_layer); lbajardsilogic@15: } lbajardsilogic@15: } lbajardsilogic@15: else if (name == "row") lbajardsilogic@15: { lbajardsilogic@15: m_inRow = false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::characters(const QString &str) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: if (m_inRow) { lbajardsilogic@15: ok = readRowData(str); lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Failed to read row data content for row " << m_rowNumber << std::endl; lbajardsilogic@15: } lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::error(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("ERROR: ModelReader-XML: %1 at line %2, column %3") lbajardsilogic@15: .arg(exception.message()) lbajardsilogic@15: .arg(exception.lineNumber()) lbajardsilogic@15: .arg(exception.columnNumber()); lbajardsilogic@15: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@15: return QXmlDefaultHandler::error(exception); lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::fatalError(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("FATAL ERROR: ModelReader-XML: %1 at line %2, column %3") lbajardsilogic@15: .arg(exception.message()) lbajardsilogic@15: .arg(exception.lineNumber()) lbajardsilogic@15: .arg(exception.columnNumber()); lbajardsilogic@15: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@15: return QXmlDefaultHandler::fatalError(exception); lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: #define READ_MANDATORY(TYPE, NAME, CONVERSION) \ lbajardsilogic@15: TYPE NAME = attributes.value(#NAME).trimmed().CONVERSION(&ok); \ lbajardsilogic@15: if (!ok) { \ lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Missing or invalid mandatory " #TYPE " attribute \"" #NAME "\"" << std::endl; \ lbajardsilogic@15: return false; \ lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::readModel(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, id, toInt); lbajardsilogic@15: lbajardsilogic@15: QString name = attributes.value("name"); lbajardsilogic@15: lbajardsilogic@15: if (m_layer->getModelName() == "") lbajardsilogic@15: { lbajardsilogic@15: m_layer->setModelName(name); lbajardsilogic@15: m_layer->setModelId(id); lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, sampleRate, toInt); lbajardsilogic@15: lbajardsilogic@15: QString type = attributes.value("type").trimmed(); lbajardsilogic@15: bool mainModel = (attributes.value("mainModel").trimmed() == "true"); lbajardsilogic@15: lbajardsilogic@15: if (type == "dense") lbajardsilogic@15: { lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, dimensions, toInt); lbajardsilogic@15: lbajardsilogic@15: // Currently the only dense model we support here lbajardsilogic@15: // is the dense 3d model. Dense time-value models lbajardsilogic@15: // are always file-backed waveform data, at this lbajardsilogic@15: // point, and they come in as the wavefile model lbajardsilogic@15: // type above. lbajardsilogic@15: lbajardsilogic@15: if (dimensions == 3) lbajardsilogic@15: { lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, windowSize, toInt); lbajardsilogic@15: READ_MANDATORY(int, yBinCount, toInt); lbajardsilogic@15: lbajardsilogic@15: //DenseThreeDimensionalModel *model = lbajardsilogic@15: //new DenseThreeDimensionalModel(sampleRate, windowSize, yBinCount); lbajardsilogic@15: lbajardsilogic@15: EditableDenseThreeDimensionalModel *model = lbajardsilogic@15: new EditableDenseThreeDimensionalModel(sampleRate, windowSize, yBinCount); lbajardsilogic@15: lbajardsilogic@15: float minimum = attributes.value("minimum").trimmed().toFloat(&ok); lbajardsilogic@15: if (ok) model->setMinimumLevel(minimum); lbajardsilogic@15: lbajardsilogic@15: float maximum = attributes.value("maximum").trimmed().toFloat(&ok); lbajardsilogic@15: if (ok) model->setMaximumLevel(maximum); lbajardsilogic@15: lbajardsilogic@15: m_model = model; lbajardsilogic@15: return true; lbajardsilogic@15: lbajardsilogic@15: } else lbajardsilogic@15: { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Unexpected dense model dimension (" lbajardsilogic@15: << dimensions << ")" << std::endl; lbajardsilogic@15: } lbajardsilogic@15: } else if (type == "sparse") lbajardsilogic@15: { lbajardsilogic@15: READ_MANDATORY(int, dimensions, toInt); lbajardsilogic@15: lbajardsilogic@15: if (dimensions == 1) lbajardsilogic@15: { lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, resolution, toInt); lbajardsilogic@15: SparseOneDimensionalModel *model = new SparseOneDimensionalModel(sampleRate, resolution); lbajardsilogic@15: m_model = model; lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: lbajardsilogic@15: } else if (dimensions == 2 || dimensions == 3) lbajardsilogic@15: { lbajardsilogic@15: READ_MANDATORY(int, resolution, toInt); lbajardsilogic@15: lbajardsilogic@15: float minimum = attributes.value("minimum").trimmed().toFloat(&ok); lbajardsilogic@15: float maximum = attributes.value("maximum").trimmed().toFloat(&ok); lbajardsilogic@15: float valueQuantization = attributes.value("valueQuantization").trimmed().toFloat(&ok); lbajardsilogic@15: lbajardsilogic@15: bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); lbajardsilogic@15: lbajardsilogic@15: QString units = attributes.value("units"); lbajardsilogic@15: lbajardsilogic@15: if (dimensions == 2) lbajardsilogic@15: { lbajardsilogic@15: if (attributes.value("subtype") == "text") lbajardsilogic@15: { lbajardsilogic@15: TextModel *model = new TextModel(sampleRate, resolution, notifyOnAdd); lbajardsilogic@15: m_model = model; lbajardsilogic@15: } else lbajardsilogic@15: { lbajardsilogic@15: SparseTimeValueModel *model = new SparseTimeValueModel(sampleRate, resolution, minimum, maximum, notifyOnAdd); lbajardsilogic@15: model->setScaleUnits(units); lbajardsilogic@15: m_model = model; lbajardsilogic@15: } lbajardsilogic@15: } else lbajardsilogic@15: { lbajardsilogic@15: NoteModel *model = new NoteModel(sampleRate, resolution, minimum, maximum, notifyOnAdd); lbajardsilogic@15: model->setValueQuantization(valueQuantization); lbajardsilogic@15: model->setScaleUnits(units); lbajardsilogic@15: m_model = model; lbajardsilogic@15: } lbajardsilogic@15: return true; lbajardsilogic@15: lbajardsilogic@15: } else lbajardsilogic@15: { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Unexpected sparse model dimension (" lbajardsilogic@15: << dimensions << ")" << std::endl; lbajardsilogic@15: } lbajardsilogic@15: } else if (type == "interval") lbajardsilogic@15: { lbajardsilogic@15: READ_MANDATORY(int, dimensions, toInt); lbajardsilogic@15: READ_MANDATORY(int, resolution, toInt); lbajardsilogic@15: bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true"); lbajardsilogic@15: lbajardsilogic@15: IntervalModel * model = new IntervalModel(sampleRate, resolution, notifyOnAdd); lbajardsilogic@15: m_model = model; lbajardsilogic@15: return true; lbajardsilogic@15: lbajardsilogic@15: } else lbajardsilogic@15: { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Unexpected model type \"" lbajardsilogic@15: << type.toLocal8Bit().data() << "\" for model id" << id << std::endl; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::readDatasetStart(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, id, toInt); lbajardsilogic@15: READ_MANDATORY(int, dimensions, toInt); lbajardsilogic@15: lbajardsilogic@15: Model *model = m_model; lbajardsilogic@15: lbajardsilogic@15: bool good = false; lbajardsilogic@15: lbajardsilogic@15: switch (dimensions) { lbajardsilogic@15: case 1: lbajardsilogic@15: if (dynamic_cast(model)) good = true; lbajardsilogic@15: break; lbajardsilogic@15: lbajardsilogic@15: case 2: lbajardsilogic@15: if (dynamic_cast(model)) good = true; lbajardsilogic@15: else if (dynamic_cast(model)) good = true; lbajardsilogic@15: break; lbajardsilogic@15: lbajardsilogic@15: case 3: lbajardsilogic@15: if (dynamic_cast(model)) good = true; lbajardsilogic@15: else if (dynamic_cast(model)) { lbajardsilogic@15: m_datasetSeparator = attributes.value("separator"); lbajardsilogic@15: good = true; lbajardsilogic@15: } lbajardsilogic@15: else if (dynamic_cast(model)) good = true; lbajardsilogic@15: break; lbajardsilogic@15: lbajardsilogic@15: default: lbajardsilogic@15: break; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: if (!good) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Model id " << /*modelId <<*/ " has wrong number of dimensions for " << dimensions << "-D dataset " << id << std::endl; lbajardsilogic@15: m_model = 0; lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::addPointToDataset(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: READ_MANDATORY(int, frame, toInt); lbajardsilogic@15: lbajardsilogic@15: SparseOneDimensionalModel *sodm = dynamic_cast (m_model); lbajardsilogic@15: lbajardsilogic@15: if (sodm) lbajardsilogic@15: { lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: sodm->addPoint(SparseOneDimensionalModel::Point(frame, label)); lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: SparseTimeValueModel *stvm = dynamic_cast (m_model); lbajardsilogic@15: lbajardsilogic@15: if (stvm) lbajardsilogic@15: { lbajardsilogic@15: float value = 0.0; lbajardsilogic@15: value = attributes.value("value").trimmed().toFloat(&ok); lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: stvm->addPoint(SparseTimeValueModel::Point(frame, value, label)); lbajardsilogic@15: return ok; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: NoteModel *nm = dynamic_cast(m_model); lbajardsilogic@15: lbajardsilogic@15: if (nm) lbajardsilogic@15: { lbajardsilogic@15: float value = 0.0; lbajardsilogic@15: value = attributes.value("value").trimmed().toFloat(&ok); lbajardsilogic@15: float duration = 0.0; lbajardsilogic@15: duration = attributes.value("duration").trimmed().toFloat(&ok); lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: nm->addPoint(NoteModel::Point(frame, value, duration, label)); lbajardsilogic@15: return ok; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: TextModel *tm = dynamic_cast(m_model); lbajardsilogic@15: lbajardsilogic@15: if (tm) lbajardsilogic@15: { lbajardsilogic@15: float height = 0.0; lbajardsilogic@15: height = attributes.value("height").trimmed().toFloat(&ok); lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: tm->addPoint(TextModel::Point(frame, height, label)); lbajardsilogic@15: return ok; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Point element found in non-point dataset" << std::endl; lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::addBinToDataset(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: //DenseThreeDimensionalModel *dtdm = dynamic_cast (m_model); lbajardsilogic@15: EditableDenseThreeDimensionalModel *dtdm = dynamic_cast(m_model); lbajardsilogic@15: lbajardsilogic@15: if (dtdm) { lbajardsilogic@15: lbajardsilogic@15: bool ok = false; lbajardsilogic@15: int n = attributes.value("number").trimmed().toInt(&ok); lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Missing or invalid bin number" lbajardsilogic@15: << std::endl; lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: QString name = attributes.value("name"); lbajardsilogic@15: lbajardsilogic@15: dtdm->setBinName(n, name); lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Bin definition found in incompatible dataset" << std::endl; lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::addRowToDataset(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: m_inRow = false; lbajardsilogic@15: lbajardsilogic@15: bool ok = false; lbajardsilogic@15: m_rowNumber = attributes.value("n").trimmed().toInt(&ok); lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Missing or invalid row number" lbajardsilogic@15: << std::endl; lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: m_inRow = true; lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::addIntervalToDataset(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: IntervalModel *im = dynamic_cast (m_model); lbajardsilogic@15: if (im) lbajardsilogic@15: { lbajardsilogic@15: READ_MANDATORY(int, start, toInt); lbajardsilogic@15: READ_MANDATORY(int, end, toInt); lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: float value = 0.0; lbajardsilogic@15: value = attributes.value("value").trimmed().toFloat(&ok); lbajardsilogic@15: im->addInterval(start, end, label, value); lbajardsilogic@15: ok = true; lbajardsilogic@15: } lbajardsilogic@15: return ok; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::readRowData(const QString &text) lbajardsilogic@15: { lbajardsilogic@15: EditableDenseThreeDimensionalModel *dtdm = dynamic_cast(m_model); lbajardsilogic@15: lbajardsilogic@15: bool warned = false; lbajardsilogic@15: lbajardsilogic@15: if (dtdm) { lbajardsilogic@15: QStringList data = text.split(m_datasetSeparator); lbajardsilogic@15: lbajardsilogic@15: DenseThreeDimensionalModel::Column values; lbajardsilogic@15: lbajardsilogic@15: for (QStringList::iterator i = data.begin(); i != data.end(); ++i) { lbajardsilogic@15: lbajardsilogic@15: if (values.size() == dtdm->getHeight()) { lbajardsilogic@15: if (!warned) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Too many y-bins in 3-D dataset row " lbajardsilogic@15: << m_rowNumber << std::endl; lbajardsilogic@15: warned = true; lbajardsilogic@15: } lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ok; lbajardsilogic@15: float value = i->toFloat(&ok); lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Bad floating-point value " lbajardsilogic@15: << i->toLocal8Bit().data() lbajardsilogic@15: << " in row data" << std::endl; lbajardsilogic@15: } else { lbajardsilogic@15: values.push_back(value); lbajardsilogic@15: } lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: dtdm->setColumn(m_rowNumber, values); lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: std::cerr << "WARNING: ModelReader-XML: Row data found in non-row dataset" << std::endl; lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::readLayer(const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: QString type = attributes.value("type"); lbajardsilogic@15: lbajardsilogic@15: m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName(type)); lbajardsilogic@15: lbajardsilogic@15: if (!m_layer) { lbajardsilogic@15: std::cerr << "WARNING: modelreader-XML: Failed to add layer of type \"" lbajardsilogic@15: << type.toLocal8Bit().data() lbajardsilogic@15: << "\"" << std::endl; lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: QString name = attributes.value("name"); lbajardsilogic@15: m_layer->setObjectName(name); lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: }