annotate data/fileio/ModelReader.cpp @ 53:4eb9c7e4acf6

DenseThreeDimensionalModel no more used, use instead EditableDenseThreeDimensionalModel
author lbajardsilogic
date Wed, 16 May 2007 12:12:44 +0000
parents 11e298cdb9e7
children e006f4a57f86
rev   line source
lbajardsilogic@15 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@15 2
lbajardsilogic@15 3 /* Sound Access
lbajardsilogic@15 4 EASAIER client application.
lbajardsilogic@15 5 Silogic 2007. Laure Bajard.
lbajardsilogic@15 6
lbajardsilogic@15 7 This program is free software; you can redistribute it and/or
lbajardsilogic@15 8 modify it under the terms of the GNU General Public License as
lbajardsilogic@15 9 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@15 10 License, or (at your option) any later version. See the file
lbajardsilogic@15 11 COPYING included with this distribution for more information.
lbajardsilogic@15 12 */
lbajardsilogic@15 13
lbajardsilogic@15 14 #include "ModelReader.h"
lbajardsilogic@15 15
lbajardsilogic@15 16 #include "document/Document.h"
lbajardsilogic@15 17 #include "layer/Layer.h"
lbajardsilogic@15 18
lbajardsilogic@15 19 #include "data/model/EditableDenseThreeDimensionalModel.h"
lbajardsilogic@15 20 #include "data/model/SparseOneDimensionalModel.h"
lbajardsilogic@15 21 #include "data/model/SparseTimeValueModel.h"
lbajardsilogic@15 22 #include "data/model/NoteModel.h"
lbajardsilogic@15 23 #include "data/model/TextModel.h"
lbajardsilogic@15 24 #include "data/model/IntervalModel.h"
lbajardsilogic@15 25 #include "view/Pane.h"
lbajardsilogic@15 26
lbajardsilogic@15 27 #include <iostream>
lbajardsilogic@15 28
lbajardsilogic@15 29 ModelReader::ModelReader(Document *document, Layer * layer, Pane * pane) :
lbajardsilogic@15 30 m_document(document),
lbajardsilogic@15 31 m_layer(layer),
lbajardsilogic@15 32 m_pane(pane)
lbajardsilogic@15 33 {}
lbajardsilogic@15 34
lbajardsilogic@15 35 bool ModelReader::parse(const QString & filename)
lbajardsilogic@15 36 {
lbajardsilogic@15 37 ModelHandler handler(m_document, m_layer, m_pane);
lbajardsilogic@15 38 QXmlSimpleReader reader;
lbajardsilogic@15 39 reader.setContentHandler(&handler);
lbajardsilogic@15 40 reader.setErrorHandler(&handler);
lbajardsilogic@15 41
lbajardsilogic@15 42 QFile file(filename);
lbajardsilogic@15 43
lbajardsilogic@15 44 if (!file.open(QFile::ReadOnly | QFile::Text)) {
lbajardsilogic@15 45 return false;
lbajardsilogic@15 46 }
lbajardsilogic@15 47
lbajardsilogic@15 48 QXmlInputSource xmlInputSource(&file);
lbajardsilogic@15 49 if (reader.parse(xmlInputSource))
lbajardsilogic@15 50 {
lbajardsilogic@15 51 return true;
lbajardsilogic@15 52 }
lbajardsilogic@15 53
lbajardsilogic@15 54 return false;
lbajardsilogic@15 55 }
lbajardsilogic@15 56
lbajardsilogic@15 57 ModelHandler::ModelHandler(Document *document, Layer * layer, Pane* pane) : QXmlDefaultHandler(),
lbajardsilogic@15 58 m_document(document),
lbajardsilogic@15 59 m_layer(layer),
lbajardsilogic@15 60 m_pane(pane),
lbajardsilogic@15 61 m_model(0),
lbajardsilogic@15 62 m_datasetSeparator(" "),
lbajardsilogic@15 63 m_inData(false),
lbajardsilogic@15 64 m_inRow(false),
lbajardsilogic@15 65 m_rowNumber(0)
lbajardsilogic@15 66 {}
lbajardsilogic@15 67
lbajardsilogic@15 68 bool ModelHandler::startElement(const QString &namespaceURI, const QString &localName,
lbajardsilogic@15 69 const QString &qName, const QXmlAttributes &attributes)
lbajardsilogic@15 70 {
lbajardsilogic@15 71
lbajardsilogic@15 72 QString name = qName.toLower();
lbajardsilogic@15 73
lbajardsilogic@15 74 bool ok = false;
lbajardsilogic@15 75
lbajardsilogic@15 76 // Valid element names:
lbajardsilogic@15 77 //
lbajardsilogic@15 78 // easaier
lbajardsilogic@15 79 // data
lbajardsilogic@15 80 // dataset
lbajardsilogic@15 81 // model
lbajardsilogic@15 82 // point
lbajardsilogic@15 83 // row
lbajardsilogic@15 84 // interval
lbajardsilogic@15 85
lbajardsilogic@15 86 if (name == "easaier") {
lbajardsilogic@15 87
lbajardsilogic@15 88 // nothing needed
lbajardsilogic@15 89 ok = true;
lbajardsilogic@15 90
lbajardsilogic@15 91 } else if (name == "data") {
lbajardsilogic@15 92
lbajardsilogic@15 93 m_inData = true;
lbajardsilogic@15 94 if (m_layer == 0)
lbajardsilogic@15 95 {
lbajardsilogic@15 96 ok = readLayer(attributes);
lbajardsilogic@15 97 } else {
lbajardsilogic@15 98 ok = true;
lbajardsilogic@15 99 }
lbajardsilogic@15 100
lbajardsilogic@15 101 } else if (name == "model") {
lbajardsilogic@15 102
lbajardsilogic@15 103 ok = readModel(attributes);
lbajardsilogic@15 104
lbajardsilogic@15 105 } else if (name == "dataset") {
lbajardsilogic@15 106
lbajardsilogic@15 107 ok = readDatasetStart(attributes);
lbajardsilogic@15 108
lbajardsilogic@15 109 } else if (name == "bin") {
lbajardsilogic@15 110
lbajardsilogic@15 111 ok = addBinToDataset(attributes);
lbajardsilogic@15 112
lbajardsilogic@15 113 } else if (name == "point") {
lbajardsilogic@15 114
lbajardsilogic@15 115 ok = addPointToDataset(attributes);
lbajardsilogic@15 116
lbajardsilogic@15 117 } else if (name == "row") {
lbajardsilogic@15 118
lbajardsilogic@15 119 ok = addRowToDataset(attributes);
lbajardsilogic@15 120
lbajardsilogic@15 121 } else if (name == "interval") {
lbajardsilogic@15 122
lbajardsilogic@15 123 ok = addIntervalToDataset(attributes);
lbajardsilogic@15 124
lbajardsilogic@15 125 }
lbajardsilogic@15 126
lbajardsilogic@15 127 if (!ok) {
lbajardsilogic@15 128 std::cerr << "WARNING: ModelReader-XML: Failed to completely process element \""
lbajardsilogic@15 129 << name.toLocal8Bit().data() << "\"" << std::endl;
lbajardsilogic@15 130 }
lbajardsilogic@15 131
lbajardsilogic@15 132 return true;
lbajardsilogic@15 133 }
lbajardsilogic@15 134
lbajardsilogic@15 135 bool ModelHandler::endElement(const QString &namespaceURI, const QString &localName,
lbajardsilogic@15 136 const QString &qName)
lbajardsilogic@15 137 {
lbajardsilogic@15 138 QString name = qName.toLower();
lbajardsilogic@15 139
lbajardsilogic@15 140 if (name == "dataset")
lbajardsilogic@15 141 {
lbajardsilogic@15 142 if ((m_model) && (m_layer))
lbajardsilogic@15 143 {
lbajardsilogic@15 144 m_document->addImportedModel(m_model);
lbajardsilogic@15 145 m_document->setModel(m_layer, m_model);
lbajardsilogic@15 146 }
lbajardsilogic@15 147 }
lbajardsilogic@15 148 else if (name == "data")
lbajardsilogic@15 149 {
lbajardsilogic@15 150 m_inData = false;
lbajardsilogic@15 151 if (m_pane && m_layer)
lbajardsilogic@15 152 {
lbajardsilogic@15 153 m_document->addLayerToView(m_pane, m_layer);
lbajardsilogic@15 154 }
lbajardsilogic@15 155 }
lbajardsilogic@15 156 else if (name == "row")
lbajardsilogic@15 157 {
lbajardsilogic@15 158 m_inRow = false;
lbajardsilogic@15 159 }
lbajardsilogic@15 160
lbajardsilogic@15 161 return true;
lbajardsilogic@15 162 }
lbajardsilogic@15 163
lbajardsilogic@15 164 bool ModelHandler::characters(const QString &str)
lbajardsilogic@15 165 {
lbajardsilogic@15 166 bool ok = false;
lbajardsilogic@15 167
lbajardsilogic@15 168 if (m_inRow) {
lbajardsilogic@15 169 ok = readRowData(str);
lbajardsilogic@15 170 if (!ok) {
lbajardsilogic@15 171 std::cerr << "WARNING: ModelReader-XML: Failed to read row data content for row " << m_rowNumber << std::endl;
lbajardsilogic@15 172 }
lbajardsilogic@15 173 }
lbajardsilogic@15 174
lbajardsilogic@15 175 return true;
lbajardsilogic@15 176 }
lbajardsilogic@15 177
lbajardsilogic@15 178 bool ModelHandler::error(const QXmlParseException &exception)
lbajardsilogic@15 179 {
lbajardsilogic@15 180 QString errorString;
lbajardsilogic@15 181 errorString += QString("ERROR: ModelReader-XML: %1 at line %2, column %3")
lbajardsilogic@15 182 .arg(exception.message())
lbajardsilogic@15 183 .arg(exception.lineNumber())
lbajardsilogic@15 184 .arg(exception.columnNumber());
lbajardsilogic@15 185 std::cerr << errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@15 186 return QXmlDefaultHandler::error(exception);
lbajardsilogic@15 187 }
lbajardsilogic@15 188
lbajardsilogic@15 189 bool ModelHandler::fatalError(const QXmlParseException &exception)
lbajardsilogic@15 190 {
lbajardsilogic@15 191 QString errorString;
lbajardsilogic@15 192 errorString += QString("FATAL ERROR: ModelReader-XML: %1 at line %2, column %3")
lbajardsilogic@15 193 .arg(exception.message())
lbajardsilogic@15 194 .arg(exception.lineNumber())
lbajardsilogic@15 195 .arg(exception.columnNumber());
lbajardsilogic@15 196 std::cerr << errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@15 197 return QXmlDefaultHandler::fatalError(exception);
lbajardsilogic@15 198 }
lbajardsilogic@15 199
lbajardsilogic@15 200 #define READ_MANDATORY(TYPE, NAME, CONVERSION) \
lbajardsilogic@15 201 TYPE NAME = attributes.value(#NAME).trimmed().CONVERSION(&ok); \
lbajardsilogic@15 202 if (!ok) { \
lbajardsilogic@15 203 std::cerr << "WARNING: ModelReader-XML: Missing or invalid mandatory " #TYPE " attribute \"" #NAME "\"" << std::endl; \
lbajardsilogic@15 204 return false; \
lbajardsilogic@15 205 }
lbajardsilogic@15 206
lbajardsilogic@15 207 bool ModelHandler::readModel(const QXmlAttributes &attributes)
lbajardsilogic@15 208 {
lbajardsilogic@15 209 bool ok = false;
lbajardsilogic@15 210
lbajardsilogic@15 211 READ_MANDATORY(int, id, toInt);
lbajardsilogic@15 212
lbajardsilogic@15 213 QString name = attributes.value("name");
lbajardsilogic@15 214
lbajardsilogic@15 215 if (m_layer->getModelName() == "")
lbajardsilogic@15 216 {
lbajardsilogic@15 217 m_layer->setModelName(name);
lbajardsilogic@15 218 m_layer->setModelId(id);
lbajardsilogic@15 219 }
lbajardsilogic@15 220
lbajardsilogic@15 221 READ_MANDATORY(int, sampleRate, toInt);
lbajardsilogic@15 222
lbajardsilogic@15 223 QString type = attributes.value("type").trimmed();
lbajardsilogic@15 224 bool mainModel = (attributes.value("mainModel").trimmed() == "true");
lbajardsilogic@15 225
lbajardsilogic@15 226 if (type == "dense")
lbajardsilogic@15 227 {
lbajardsilogic@15 228
lbajardsilogic@15 229 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 230
lbajardsilogic@15 231 // Currently the only dense model we support here
lbajardsilogic@15 232 // is the dense 3d model. Dense time-value models
lbajardsilogic@15 233 // are always file-backed waveform data, at this
lbajardsilogic@15 234 // point, and they come in as the wavefile model
lbajardsilogic@15 235 // type above.
lbajardsilogic@15 236
lbajardsilogic@15 237 if (dimensions == 3)
lbajardsilogic@15 238 {
lbajardsilogic@15 239
lbajardsilogic@15 240 READ_MANDATORY(int, windowSize, toInt);
lbajardsilogic@15 241 READ_MANDATORY(int, yBinCount, toInt);
lbajardsilogic@15 242
lbajardsilogic@15 243 EditableDenseThreeDimensionalModel *model =
lbajardsilogic@15 244 new EditableDenseThreeDimensionalModel(sampleRate, windowSize, yBinCount);
lbajardsilogic@15 245
lbajardsilogic@15 246 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@15 247 if (ok) model->setMinimumLevel(minimum);
lbajardsilogic@15 248
lbajardsilogic@15 249 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@15 250 if (ok) model->setMaximumLevel(maximum);
lbajardsilogic@15 251
lbajardsilogic@15 252 m_model = model;
lbajardsilogic@15 253 return true;
lbajardsilogic@15 254
lbajardsilogic@15 255 } else
lbajardsilogic@15 256 {
lbajardsilogic@15 257 std::cerr << "WARNING: ModelReader-XML: Unexpected dense model dimension ("
lbajardsilogic@15 258 << dimensions << ")" << std::endl;
lbajardsilogic@15 259 }
lbajardsilogic@15 260 } else if (type == "sparse")
lbajardsilogic@15 261 {
lbajardsilogic@15 262 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 263
lbajardsilogic@15 264 if (dimensions == 1)
lbajardsilogic@15 265 {
lbajardsilogic@15 266
lbajardsilogic@15 267 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 268 SparseOneDimensionalModel *model = new SparseOneDimensionalModel(sampleRate, resolution);
lbajardsilogic@15 269 m_model = model;
lbajardsilogic@15 270
lbajardsilogic@15 271 return true;
lbajardsilogic@15 272
lbajardsilogic@15 273 } else if (dimensions == 2 || dimensions == 3)
lbajardsilogic@15 274 {
lbajardsilogic@15 275 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 276
lbajardsilogic@15 277 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@15 278 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@15 279 float valueQuantization = attributes.value("valueQuantization").trimmed().toFloat(&ok);
lbajardsilogic@15 280
lbajardsilogic@15 281 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@15 282
lbajardsilogic@15 283 QString units = attributes.value("units");
lbajardsilogic@15 284
lbajardsilogic@15 285 if (dimensions == 2)
lbajardsilogic@15 286 {
lbajardsilogic@15 287 if (attributes.value("subtype") == "text")
lbajardsilogic@15 288 {
lbajardsilogic@15 289 TextModel *model = new TextModel(sampleRate, resolution, notifyOnAdd);
lbajardsilogic@15 290 m_model = model;
lbajardsilogic@15 291 } else
lbajardsilogic@15 292 {
lbajardsilogic@15 293 SparseTimeValueModel *model = new SparseTimeValueModel(sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@15 294 model->setScaleUnits(units);
lbajardsilogic@15 295 m_model = model;
lbajardsilogic@15 296 }
lbajardsilogic@15 297 } else
lbajardsilogic@15 298 {
lbajardsilogic@15 299 NoteModel *model = new NoteModel(sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@15 300 model->setValueQuantization(valueQuantization);
lbajardsilogic@15 301 model->setScaleUnits(units);
lbajardsilogic@15 302 m_model = model;
lbajardsilogic@15 303 }
lbajardsilogic@15 304 return true;
lbajardsilogic@15 305
lbajardsilogic@15 306 } else
lbajardsilogic@15 307 {
lbajardsilogic@15 308 std::cerr << "WARNING: ModelReader-XML: Unexpected sparse model dimension ("
lbajardsilogic@15 309 << dimensions << ")" << std::endl;
lbajardsilogic@15 310 }
lbajardsilogic@15 311 } else if (type == "interval")
lbajardsilogic@15 312 {
lbajardsilogic@15 313 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 314 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 315 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@15 316
lbajardsilogic@15 317 IntervalModel * model = new IntervalModel(sampleRate, resolution, notifyOnAdd);
lbajardsilogic@15 318 m_model = model;
lbajardsilogic@15 319 return true;
lbajardsilogic@15 320
lbajardsilogic@15 321 } else
lbajardsilogic@15 322 {
lbajardsilogic@15 323 std::cerr << "WARNING: ModelReader-XML: Unexpected model type \""
lbajardsilogic@15 324 << type.toLocal8Bit().data() << "\" for model id" << id << std::endl;
lbajardsilogic@15 325 }
lbajardsilogic@15 326
lbajardsilogic@15 327 return false;
lbajardsilogic@15 328 }
lbajardsilogic@15 329
lbajardsilogic@15 330 bool ModelHandler::readDatasetStart(const QXmlAttributes &attributes)
lbajardsilogic@15 331 {
lbajardsilogic@15 332 bool ok = false;
lbajardsilogic@15 333
lbajardsilogic@15 334 READ_MANDATORY(int, id, toInt);
lbajardsilogic@15 335 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 336
lbajardsilogic@15 337 Model *model = m_model;
lbajardsilogic@15 338
lbajardsilogic@15 339 bool good = false;
lbajardsilogic@15 340
lbajardsilogic@15 341 switch (dimensions) {
lbajardsilogic@15 342 case 1:
lbajardsilogic@15 343 if (dynamic_cast<SparseOneDimensionalModel *>(model)) good = true;
lbajardsilogic@15 344 break;
lbajardsilogic@15 345
lbajardsilogic@15 346 case 2:
lbajardsilogic@15 347 if (dynamic_cast<SparseTimeValueModel *>(model)) good = true;
lbajardsilogic@15 348 else if (dynamic_cast<TextModel *>(model)) good = true;
lbajardsilogic@15 349 break;
lbajardsilogic@15 350
lbajardsilogic@15 351 case 3:
lbajardsilogic@15 352 if (dynamic_cast<NoteModel *>(model)) good = true;
lbajardsilogic@53 353 else if (dynamic_cast<EditableDenseThreeDimensionalModel *>(model)) {
lbajardsilogic@15 354 m_datasetSeparator = attributes.value("separator");
lbajardsilogic@15 355 good = true;
lbajardsilogic@15 356 }
lbajardsilogic@15 357 else if (dynamic_cast<IntervalModel *>(model)) good = true;
lbajardsilogic@15 358 break;
lbajardsilogic@15 359
lbajardsilogic@15 360 default:
lbajardsilogic@15 361 break;
lbajardsilogic@15 362 }
lbajardsilogic@15 363
lbajardsilogic@15 364 if (!good) {
lbajardsilogic@15 365 std::cerr << "WARNING: ModelReader-XML: Model id " << /*modelId <<*/ " has wrong number of dimensions for " << dimensions << "-D dataset " << id << std::endl;
lbajardsilogic@15 366 m_model = 0;
lbajardsilogic@15 367 return false;
lbajardsilogic@15 368 }
lbajardsilogic@15 369
lbajardsilogic@15 370 return true;
lbajardsilogic@15 371 }
lbajardsilogic@15 372
lbajardsilogic@15 373 bool ModelHandler::addPointToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 374 {
lbajardsilogic@15 375 bool ok = false;
lbajardsilogic@15 376
lbajardsilogic@15 377 READ_MANDATORY(int, frame, toInt);
lbajardsilogic@15 378
lbajardsilogic@15 379 SparseOneDimensionalModel *sodm = dynamic_cast<SparseOneDimensionalModel *> (m_model);
lbajardsilogic@15 380
lbajardsilogic@15 381 if (sodm)
lbajardsilogic@15 382 {
lbajardsilogic@15 383 QString label = attributes.value("label");
lbajardsilogic@15 384 sodm->addPoint(SparseOneDimensionalModel::Point(frame, label));
lbajardsilogic@15 385 return true;
lbajardsilogic@15 386 }
lbajardsilogic@15 387
lbajardsilogic@15 388 SparseTimeValueModel *stvm = dynamic_cast<SparseTimeValueModel *> (m_model);
lbajardsilogic@15 389
lbajardsilogic@15 390 if (stvm)
lbajardsilogic@15 391 {
lbajardsilogic@15 392 float value = 0.0;
lbajardsilogic@15 393 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 394 QString label = attributes.value("label");
lbajardsilogic@15 395 stvm->addPoint(SparseTimeValueModel::Point(frame, value, label));
lbajardsilogic@15 396 return ok;
lbajardsilogic@15 397 }
lbajardsilogic@15 398
lbajardsilogic@15 399 NoteModel *nm = dynamic_cast<NoteModel *>(m_model);
lbajardsilogic@15 400
lbajardsilogic@15 401 if (nm)
lbajardsilogic@15 402 {
lbajardsilogic@15 403 float value = 0.0;
lbajardsilogic@15 404 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 405 float duration = 0.0;
lbajardsilogic@15 406 duration = attributes.value("duration").trimmed().toFloat(&ok);
lbajardsilogic@15 407 QString label = attributes.value("label");
lbajardsilogic@15 408 nm->addPoint(NoteModel::Point(frame, value, duration, label));
lbajardsilogic@15 409 return ok;
lbajardsilogic@15 410 }
lbajardsilogic@15 411
lbajardsilogic@15 412 TextModel *tm = dynamic_cast<TextModel *>(m_model);
lbajardsilogic@15 413
lbajardsilogic@15 414 if (tm)
lbajardsilogic@15 415 {
lbajardsilogic@15 416 float height = 0.0;
lbajardsilogic@15 417 height = attributes.value("height").trimmed().toFloat(&ok);
lbajardsilogic@15 418 QString label = attributes.value("label");
lbajardsilogic@15 419 tm->addPoint(TextModel::Point(frame, height, label));
lbajardsilogic@15 420 return ok;
lbajardsilogic@15 421 }
lbajardsilogic@15 422
lbajardsilogic@15 423 std::cerr << "WARNING: ModelReader-XML: Point element found in non-point dataset" << std::endl;
lbajardsilogic@15 424
lbajardsilogic@15 425 return false;
lbajardsilogic@15 426 }
lbajardsilogic@15 427
lbajardsilogic@15 428 bool ModelHandler::addBinToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 429 {
lbajardsilogic@53 430 EditableDenseThreeDimensionalModel *dtdm = dynamic_cast<EditableDenseThreeDimensionalModel *>(m_model);
lbajardsilogic@15 431
lbajardsilogic@15 432 if (dtdm) {
lbajardsilogic@15 433
lbajardsilogic@15 434 bool ok = false;
lbajardsilogic@15 435 int n = attributes.value("number").trimmed().toInt(&ok);
lbajardsilogic@15 436 if (!ok) {
lbajardsilogic@15 437 std::cerr << "WARNING: ModelReader-XML: Missing or invalid bin number"
lbajardsilogic@15 438 << std::endl;
lbajardsilogic@15 439 return false;
lbajardsilogic@15 440 }
lbajardsilogic@15 441
lbajardsilogic@15 442 QString name = attributes.value("name");
lbajardsilogic@15 443
lbajardsilogic@15 444 dtdm->setBinName(n, name);
lbajardsilogic@15 445 return true;
lbajardsilogic@15 446 }
lbajardsilogic@15 447
lbajardsilogic@15 448 std::cerr << "WARNING: ModelReader-XML: Bin definition found in incompatible dataset" << std::endl;
lbajardsilogic@15 449
lbajardsilogic@15 450 return false;
lbajardsilogic@15 451 }
lbajardsilogic@15 452
lbajardsilogic@15 453
lbajardsilogic@15 454 bool ModelHandler::addRowToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 455 {
lbajardsilogic@15 456 m_inRow = false;
lbajardsilogic@15 457
lbajardsilogic@15 458 bool ok = false;
lbajardsilogic@15 459 m_rowNumber = attributes.value("n").trimmed().toInt(&ok);
lbajardsilogic@15 460 if (!ok) {
lbajardsilogic@15 461 std::cerr << "WARNING: ModelReader-XML: Missing or invalid row number"
lbajardsilogic@15 462 << std::endl;
lbajardsilogic@15 463 return false;
lbajardsilogic@15 464 }
lbajardsilogic@15 465
lbajardsilogic@15 466 m_inRow = true;
lbajardsilogic@15 467
lbajardsilogic@15 468 return true;
lbajardsilogic@15 469 }
lbajardsilogic@15 470
lbajardsilogic@15 471 bool ModelHandler::addIntervalToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 472 {
lbajardsilogic@15 473 bool ok = false;
lbajardsilogic@15 474
lbajardsilogic@15 475 IntervalModel *im = dynamic_cast<IntervalModel*> (m_model);
lbajardsilogic@15 476 if (im)
lbajardsilogic@15 477 {
lbajardsilogic@15 478 READ_MANDATORY(int, start, toInt);
lbajardsilogic@15 479 READ_MANDATORY(int, end, toInt);
lbajardsilogic@15 480 QString label = attributes.value("label");
lbajardsilogic@15 481 float value = 0.0;
lbajardsilogic@15 482 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 483 im->addInterval(start, end, label, value);
lbajardsilogic@15 484 ok = true;
lbajardsilogic@15 485 }
lbajardsilogic@15 486 return ok;
lbajardsilogic@15 487 }
lbajardsilogic@15 488
lbajardsilogic@15 489 bool ModelHandler::readRowData(const QString &text)
lbajardsilogic@15 490 {
lbajardsilogic@15 491 EditableDenseThreeDimensionalModel *dtdm = dynamic_cast<EditableDenseThreeDimensionalModel *>(m_model);
lbajardsilogic@15 492
lbajardsilogic@15 493 bool warned = false;
lbajardsilogic@15 494
lbajardsilogic@15 495 if (dtdm) {
lbajardsilogic@15 496 QStringList data = text.split(m_datasetSeparator);
lbajardsilogic@15 497
lbajardsilogic@15 498 DenseThreeDimensionalModel::Column values;
lbajardsilogic@15 499
lbajardsilogic@15 500 for (QStringList::iterator i = data.begin(); i != data.end(); ++i) {
lbajardsilogic@15 501
lbajardsilogic@15 502 if (values.size() == dtdm->getHeight()) {
lbajardsilogic@15 503 if (!warned) {
lbajardsilogic@15 504 std::cerr << "WARNING: ModelReader-XML: Too many y-bins in 3-D dataset row "
lbajardsilogic@15 505 << m_rowNumber << std::endl;
lbajardsilogic@15 506 warned = true;
lbajardsilogic@15 507 }
lbajardsilogic@15 508 }
lbajardsilogic@15 509
lbajardsilogic@15 510 bool ok;
lbajardsilogic@15 511 float value = i->toFloat(&ok);
lbajardsilogic@15 512 if (!ok) {
lbajardsilogic@15 513 std::cerr << "WARNING: ModelReader-XML: Bad floating-point value "
lbajardsilogic@15 514 << i->toLocal8Bit().data()
lbajardsilogic@15 515 << " in row data" << std::endl;
lbajardsilogic@15 516 } else {
lbajardsilogic@15 517 values.push_back(value);
lbajardsilogic@15 518 }
lbajardsilogic@15 519 }
lbajardsilogic@15 520
lbajardsilogic@15 521 dtdm->setColumn(m_rowNumber, values);
lbajardsilogic@15 522 return true;
lbajardsilogic@15 523 }
lbajardsilogic@15 524
lbajardsilogic@15 525 std::cerr << "WARNING: ModelReader-XML: Row data found in non-row dataset" << std::endl;
lbajardsilogic@15 526
lbajardsilogic@15 527 return false;
lbajardsilogic@15 528 }
lbajardsilogic@15 529
lbajardsilogic@15 530 bool ModelHandler::readLayer(const QXmlAttributes &attributes)
lbajardsilogic@15 531 {
lbajardsilogic@15 532 QString type = attributes.value("type");
lbajardsilogic@15 533
lbajardsilogic@15 534 m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName(type));
lbajardsilogic@15 535
lbajardsilogic@15 536 if (!m_layer) {
lbajardsilogic@15 537 std::cerr << "WARNING: modelreader-XML: Failed to add layer of type \""
lbajardsilogic@15 538 << type.toLocal8Bit().data()
lbajardsilogic@15 539 << "\"" << std::endl;
lbajardsilogic@15 540 return false;
lbajardsilogic@15 541 }
lbajardsilogic@15 542
lbajardsilogic@15 543 QString name = attributes.value("name");
lbajardsilogic@15 544 m_layer->setObjectName(name);
lbajardsilogic@15 545
lbajardsilogic@15 546 return true;
lbajardsilogic@15 547 }