annotate data/fileio/ModelReader.cpp @ 15:11e298cdb9e7

add - EasaierSessionManager - Easaier menus - Interval model
author lbajardsilogic
date Mon, 14 May 2007 13:10:49 +0000
parents
children 4eb9c7e4acf6
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 //DenseThreeDimensionalModel *model =
lbajardsilogic@15 244 //new DenseThreeDimensionalModel(sampleRate, windowSize, yBinCount);
lbajardsilogic@15 245
lbajardsilogic@15 246 EditableDenseThreeDimensionalModel *model =
lbajardsilogic@15 247 new EditableDenseThreeDimensionalModel(sampleRate, windowSize, yBinCount);
lbajardsilogic@15 248
lbajardsilogic@15 249 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@15 250 if (ok) model->setMinimumLevel(minimum);
lbajardsilogic@15 251
lbajardsilogic@15 252 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@15 253 if (ok) model->setMaximumLevel(maximum);
lbajardsilogic@15 254
lbajardsilogic@15 255 m_model = model;
lbajardsilogic@15 256 return true;
lbajardsilogic@15 257
lbajardsilogic@15 258 } else
lbajardsilogic@15 259 {
lbajardsilogic@15 260 std::cerr << "WARNING: ModelReader-XML: Unexpected dense model dimension ("
lbajardsilogic@15 261 << dimensions << ")" << std::endl;
lbajardsilogic@15 262 }
lbajardsilogic@15 263 } else if (type == "sparse")
lbajardsilogic@15 264 {
lbajardsilogic@15 265 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 266
lbajardsilogic@15 267 if (dimensions == 1)
lbajardsilogic@15 268 {
lbajardsilogic@15 269
lbajardsilogic@15 270 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 271 SparseOneDimensionalModel *model = new SparseOneDimensionalModel(sampleRate, resolution);
lbajardsilogic@15 272 m_model = model;
lbajardsilogic@15 273
lbajardsilogic@15 274 return true;
lbajardsilogic@15 275
lbajardsilogic@15 276 } else if (dimensions == 2 || dimensions == 3)
lbajardsilogic@15 277 {
lbajardsilogic@15 278 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 279
lbajardsilogic@15 280 float minimum = attributes.value("minimum").trimmed().toFloat(&ok);
lbajardsilogic@15 281 float maximum = attributes.value("maximum").trimmed().toFloat(&ok);
lbajardsilogic@15 282 float valueQuantization = attributes.value("valueQuantization").trimmed().toFloat(&ok);
lbajardsilogic@15 283
lbajardsilogic@15 284 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@15 285
lbajardsilogic@15 286 QString units = attributes.value("units");
lbajardsilogic@15 287
lbajardsilogic@15 288 if (dimensions == 2)
lbajardsilogic@15 289 {
lbajardsilogic@15 290 if (attributes.value("subtype") == "text")
lbajardsilogic@15 291 {
lbajardsilogic@15 292 TextModel *model = new TextModel(sampleRate, resolution, notifyOnAdd);
lbajardsilogic@15 293 m_model = model;
lbajardsilogic@15 294 } else
lbajardsilogic@15 295 {
lbajardsilogic@15 296 SparseTimeValueModel *model = new SparseTimeValueModel(sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@15 297 model->setScaleUnits(units);
lbajardsilogic@15 298 m_model = model;
lbajardsilogic@15 299 }
lbajardsilogic@15 300 } else
lbajardsilogic@15 301 {
lbajardsilogic@15 302 NoteModel *model = new NoteModel(sampleRate, resolution, minimum, maximum, notifyOnAdd);
lbajardsilogic@15 303 model->setValueQuantization(valueQuantization);
lbajardsilogic@15 304 model->setScaleUnits(units);
lbajardsilogic@15 305 m_model = model;
lbajardsilogic@15 306 }
lbajardsilogic@15 307 return true;
lbajardsilogic@15 308
lbajardsilogic@15 309 } else
lbajardsilogic@15 310 {
lbajardsilogic@15 311 std::cerr << "WARNING: ModelReader-XML: Unexpected sparse model dimension ("
lbajardsilogic@15 312 << dimensions << ")" << std::endl;
lbajardsilogic@15 313 }
lbajardsilogic@15 314 } else if (type == "interval")
lbajardsilogic@15 315 {
lbajardsilogic@15 316 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 317 READ_MANDATORY(int, resolution, toInt);
lbajardsilogic@15 318 bool notifyOnAdd = (attributes.value("notifyOnAdd") == "true");
lbajardsilogic@15 319
lbajardsilogic@15 320 IntervalModel * model = new IntervalModel(sampleRate, resolution, notifyOnAdd);
lbajardsilogic@15 321 m_model = model;
lbajardsilogic@15 322 return true;
lbajardsilogic@15 323
lbajardsilogic@15 324 } else
lbajardsilogic@15 325 {
lbajardsilogic@15 326 std::cerr << "WARNING: ModelReader-XML: Unexpected model type \""
lbajardsilogic@15 327 << type.toLocal8Bit().data() << "\" for model id" << id << std::endl;
lbajardsilogic@15 328 }
lbajardsilogic@15 329
lbajardsilogic@15 330 return false;
lbajardsilogic@15 331 }
lbajardsilogic@15 332
lbajardsilogic@15 333 bool ModelHandler::readDatasetStart(const QXmlAttributes &attributes)
lbajardsilogic@15 334 {
lbajardsilogic@15 335 bool ok = false;
lbajardsilogic@15 336
lbajardsilogic@15 337 READ_MANDATORY(int, id, toInt);
lbajardsilogic@15 338 READ_MANDATORY(int, dimensions, toInt);
lbajardsilogic@15 339
lbajardsilogic@15 340 Model *model = m_model;
lbajardsilogic@15 341
lbajardsilogic@15 342 bool good = false;
lbajardsilogic@15 343
lbajardsilogic@15 344 switch (dimensions) {
lbajardsilogic@15 345 case 1:
lbajardsilogic@15 346 if (dynamic_cast<SparseOneDimensionalModel *>(model)) good = true;
lbajardsilogic@15 347 break;
lbajardsilogic@15 348
lbajardsilogic@15 349 case 2:
lbajardsilogic@15 350 if (dynamic_cast<SparseTimeValueModel *>(model)) good = true;
lbajardsilogic@15 351 else if (dynamic_cast<TextModel *>(model)) good = true;
lbajardsilogic@15 352 break;
lbajardsilogic@15 353
lbajardsilogic@15 354 case 3:
lbajardsilogic@15 355 if (dynamic_cast<NoteModel *>(model)) good = true;
lbajardsilogic@15 356 else if (dynamic_cast<DenseThreeDimensionalModel *>(model)) {
lbajardsilogic@15 357 m_datasetSeparator = attributes.value("separator");
lbajardsilogic@15 358 good = true;
lbajardsilogic@15 359 }
lbajardsilogic@15 360 else if (dynamic_cast<IntervalModel *>(model)) good = true;
lbajardsilogic@15 361 break;
lbajardsilogic@15 362
lbajardsilogic@15 363 default:
lbajardsilogic@15 364 break;
lbajardsilogic@15 365 }
lbajardsilogic@15 366
lbajardsilogic@15 367 if (!good) {
lbajardsilogic@15 368 std::cerr << "WARNING: ModelReader-XML: Model id " << /*modelId <<*/ " has wrong number of dimensions for " << dimensions << "-D dataset " << id << std::endl;
lbajardsilogic@15 369 m_model = 0;
lbajardsilogic@15 370 return false;
lbajardsilogic@15 371 }
lbajardsilogic@15 372
lbajardsilogic@15 373 return true;
lbajardsilogic@15 374 }
lbajardsilogic@15 375
lbajardsilogic@15 376 bool ModelHandler::addPointToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 377 {
lbajardsilogic@15 378 bool ok = false;
lbajardsilogic@15 379
lbajardsilogic@15 380 READ_MANDATORY(int, frame, toInt);
lbajardsilogic@15 381
lbajardsilogic@15 382 SparseOneDimensionalModel *sodm = dynamic_cast<SparseOneDimensionalModel *> (m_model);
lbajardsilogic@15 383
lbajardsilogic@15 384 if (sodm)
lbajardsilogic@15 385 {
lbajardsilogic@15 386 QString label = attributes.value("label");
lbajardsilogic@15 387 sodm->addPoint(SparseOneDimensionalModel::Point(frame, label));
lbajardsilogic@15 388 return true;
lbajardsilogic@15 389 }
lbajardsilogic@15 390
lbajardsilogic@15 391 SparseTimeValueModel *stvm = dynamic_cast<SparseTimeValueModel *> (m_model);
lbajardsilogic@15 392
lbajardsilogic@15 393 if (stvm)
lbajardsilogic@15 394 {
lbajardsilogic@15 395 float value = 0.0;
lbajardsilogic@15 396 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 397 QString label = attributes.value("label");
lbajardsilogic@15 398 stvm->addPoint(SparseTimeValueModel::Point(frame, value, label));
lbajardsilogic@15 399 return ok;
lbajardsilogic@15 400 }
lbajardsilogic@15 401
lbajardsilogic@15 402 NoteModel *nm = dynamic_cast<NoteModel *>(m_model);
lbajardsilogic@15 403
lbajardsilogic@15 404 if (nm)
lbajardsilogic@15 405 {
lbajardsilogic@15 406 float value = 0.0;
lbajardsilogic@15 407 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 408 float duration = 0.0;
lbajardsilogic@15 409 duration = attributes.value("duration").trimmed().toFloat(&ok);
lbajardsilogic@15 410 QString label = attributes.value("label");
lbajardsilogic@15 411 nm->addPoint(NoteModel::Point(frame, value, duration, label));
lbajardsilogic@15 412 return ok;
lbajardsilogic@15 413 }
lbajardsilogic@15 414
lbajardsilogic@15 415 TextModel *tm = dynamic_cast<TextModel *>(m_model);
lbajardsilogic@15 416
lbajardsilogic@15 417 if (tm)
lbajardsilogic@15 418 {
lbajardsilogic@15 419 float height = 0.0;
lbajardsilogic@15 420 height = attributes.value("height").trimmed().toFloat(&ok);
lbajardsilogic@15 421 QString label = attributes.value("label");
lbajardsilogic@15 422 tm->addPoint(TextModel::Point(frame, height, label));
lbajardsilogic@15 423 return ok;
lbajardsilogic@15 424 }
lbajardsilogic@15 425
lbajardsilogic@15 426 std::cerr << "WARNING: ModelReader-XML: Point element found in non-point dataset" << std::endl;
lbajardsilogic@15 427
lbajardsilogic@15 428 return false;
lbajardsilogic@15 429 }
lbajardsilogic@15 430
lbajardsilogic@15 431 bool ModelHandler::addBinToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 432 {
lbajardsilogic@15 433 //DenseThreeDimensionalModel *dtdm = dynamic_cast<DenseThreeDimensionalModel *> (m_model);
lbajardsilogic@15 434 EditableDenseThreeDimensionalModel *dtdm = dynamic_cast<EditableDenseThreeDimensionalModel *>(m_model);
lbajardsilogic@15 435
lbajardsilogic@15 436 if (dtdm) {
lbajardsilogic@15 437
lbajardsilogic@15 438 bool ok = false;
lbajardsilogic@15 439 int n = attributes.value("number").trimmed().toInt(&ok);
lbajardsilogic@15 440 if (!ok) {
lbajardsilogic@15 441 std::cerr << "WARNING: ModelReader-XML: Missing or invalid bin number"
lbajardsilogic@15 442 << std::endl;
lbajardsilogic@15 443 return false;
lbajardsilogic@15 444 }
lbajardsilogic@15 445
lbajardsilogic@15 446 QString name = attributes.value("name");
lbajardsilogic@15 447
lbajardsilogic@15 448 dtdm->setBinName(n, name);
lbajardsilogic@15 449 return true;
lbajardsilogic@15 450 }
lbajardsilogic@15 451
lbajardsilogic@15 452 std::cerr << "WARNING: ModelReader-XML: Bin definition found in incompatible dataset" << std::endl;
lbajardsilogic@15 453
lbajardsilogic@15 454 return false;
lbajardsilogic@15 455 }
lbajardsilogic@15 456
lbajardsilogic@15 457
lbajardsilogic@15 458 bool ModelHandler::addRowToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 459 {
lbajardsilogic@15 460 m_inRow = false;
lbajardsilogic@15 461
lbajardsilogic@15 462 bool ok = false;
lbajardsilogic@15 463 m_rowNumber = attributes.value("n").trimmed().toInt(&ok);
lbajardsilogic@15 464 if (!ok) {
lbajardsilogic@15 465 std::cerr << "WARNING: ModelReader-XML: Missing or invalid row number"
lbajardsilogic@15 466 << std::endl;
lbajardsilogic@15 467 return false;
lbajardsilogic@15 468 }
lbajardsilogic@15 469
lbajardsilogic@15 470 m_inRow = true;
lbajardsilogic@15 471
lbajardsilogic@15 472 return true;
lbajardsilogic@15 473 }
lbajardsilogic@15 474
lbajardsilogic@15 475 bool ModelHandler::addIntervalToDataset(const QXmlAttributes &attributes)
lbajardsilogic@15 476 {
lbajardsilogic@15 477 bool ok = false;
lbajardsilogic@15 478
lbajardsilogic@15 479 IntervalModel *im = dynamic_cast<IntervalModel*> (m_model);
lbajardsilogic@15 480 if (im)
lbajardsilogic@15 481 {
lbajardsilogic@15 482 READ_MANDATORY(int, start, toInt);
lbajardsilogic@15 483 READ_MANDATORY(int, end, toInt);
lbajardsilogic@15 484 QString label = attributes.value("label");
lbajardsilogic@15 485 float value = 0.0;
lbajardsilogic@15 486 value = attributes.value("value").trimmed().toFloat(&ok);
lbajardsilogic@15 487 im->addInterval(start, end, label, value);
lbajardsilogic@15 488 ok = true;
lbajardsilogic@15 489 }
lbajardsilogic@15 490 return ok;
lbajardsilogic@15 491 }
lbajardsilogic@15 492
lbajardsilogic@15 493 bool ModelHandler::readRowData(const QString &text)
lbajardsilogic@15 494 {
lbajardsilogic@15 495 EditableDenseThreeDimensionalModel *dtdm = dynamic_cast<EditableDenseThreeDimensionalModel *>(m_model);
lbajardsilogic@15 496
lbajardsilogic@15 497 bool warned = false;
lbajardsilogic@15 498
lbajardsilogic@15 499 if (dtdm) {
lbajardsilogic@15 500 QStringList data = text.split(m_datasetSeparator);
lbajardsilogic@15 501
lbajardsilogic@15 502 DenseThreeDimensionalModel::Column values;
lbajardsilogic@15 503
lbajardsilogic@15 504 for (QStringList::iterator i = data.begin(); i != data.end(); ++i) {
lbajardsilogic@15 505
lbajardsilogic@15 506 if (values.size() == dtdm->getHeight()) {
lbajardsilogic@15 507 if (!warned) {
lbajardsilogic@15 508 std::cerr << "WARNING: ModelReader-XML: Too many y-bins in 3-D dataset row "
lbajardsilogic@15 509 << m_rowNumber << std::endl;
lbajardsilogic@15 510 warned = true;
lbajardsilogic@15 511 }
lbajardsilogic@15 512 }
lbajardsilogic@15 513
lbajardsilogic@15 514 bool ok;
lbajardsilogic@15 515 float value = i->toFloat(&ok);
lbajardsilogic@15 516 if (!ok) {
lbajardsilogic@15 517 std::cerr << "WARNING: ModelReader-XML: Bad floating-point value "
lbajardsilogic@15 518 << i->toLocal8Bit().data()
lbajardsilogic@15 519 << " in row data" << std::endl;
lbajardsilogic@15 520 } else {
lbajardsilogic@15 521 values.push_back(value);
lbajardsilogic@15 522 }
lbajardsilogic@15 523 }
lbajardsilogic@15 524
lbajardsilogic@15 525 dtdm->setColumn(m_rowNumber, values);
lbajardsilogic@15 526 return true;
lbajardsilogic@15 527 }
lbajardsilogic@15 528
lbajardsilogic@15 529 std::cerr << "WARNING: ModelReader-XML: Row data found in non-row dataset" << std::endl;
lbajardsilogic@15 530
lbajardsilogic@15 531 return false;
lbajardsilogic@15 532 }
lbajardsilogic@15 533
lbajardsilogic@15 534 bool ModelHandler::readLayer(const QXmlAttributes &attributes)
lbajardsilogic@15 535 {
lbajardsilogic@15 536 QString type = attributes.value("type");
lbajardsilogic@15 537
lbajardsilogic@15 538 m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName(type));
lbajardsilogic@15 539
lbajardsilogic@15 540 if (!m_layer) {
lbajardsilogic@15 541 std::cerr << "WARNING: modelreader-XML: Failed to add layer of type \""
lbajardsilogic@15 542 << type.toLocal8Bit().data()
lbajardsilogic@15 543 << "\"" << std::endl;
lbajardsilogic@15 544 return false;
lbajardsilogic@15 545 }
lbajardsilogic@15 546
lbajardsilogic@15 547 QString name = attributes.value("name");
lbajardsilogic@15 548 m_layer->setObjectName(name);
lbajardsilogic@15 549
lbajardsilogic@15 550 return true;
lbajardsilogic@15 551 }