annotate data/fileio/ModelReader.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents ee047fc1a552
children
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@268 26 #include "main/MainWindow.h"
lbajardsilogic@15 27
lbajardsilogic@15 28 #include <iostream>
lbajardsilogic@15 29
lbajardsilogic@15 30 ModelReader::ModelReader(Document *document, Layer * layer, Pane * pane) :
lbajardsilogic@15 31 m_document(document),
lbajardsilogic@15 32 m_layer(layer),
lbajardsilogic@15 33 m_pane(pane)
lbajardsilogic@261 34 {
lbajardsilogic@261 35 }
lbajardsilogic@15 36
lbajardsilogic@15 37 bool ModelReader::parse(const QString & filename)
lbajardsilogic@15 38 {
lbajardsilogic@15 39 ModelHandler handler(m_document, m_layer, m_pane);
lbajardsilogic@15 40 QXmlSimpleReader reader;
lbajardsilogic@15 41 reader.setContentHandler(&handler);
lbajardsilogic@15 42 reader.setErrorHandler(&handler);
lbajardsilogic@15 43
lbajardsilogic@15 44 QFile file(filename);
lbajardsilogic@15 45
lbajardsilogic@15 46 if (!file.open(QFile::ReadOnly | QFile::Text)) {
lbajardsilogic@15 47 return false;
lbajardsilogic@15 48 }
lbajardsilogic@15 49
lbajardsilogic@15 50 QXmlInputSource xmlInputSource(&file);
lbajardsilogic@15 51 if (reader.parse(xmlInputSource))
lbajardsilogic@15 52 {
lbajardsilogic@15 53 return true;
lbajardsilogic@15 54 }
lbajardsilogic@15 55
lbajardsilogic@15 56 return false;
lbajardsilogic@15 57 }
lbajardsilogic@15 58
lbajardsilogic@15 59 ModelHandler::ModelHandler(Document *document, Layer * layer, Pane* pane) : QXmlDefaultHandler(),
lbajardsilogic@15 60 m_document(document),
lbajardsilogic@15 61 m_layer(layer),
lbajardsilogic@15 62 m_pane(pane),
lbajardsilogic@15 63 m_model(0),
lbajardsilogic@251 64 m_inBinding(false),
lbajardsilogic@252 65 m_curBindingName(""),
lbajardsilogic@251 66 m_sampleRate(44100)
lbajardsilogic@268 67 {
lbajardsilogic@268 68 m_sampleRate = MainWindow::instance()->getMainModelSampleRate();
lbajardsilogic@268 69 }
lbajardsilogic@15 70
lbajardsilogic@15 71 bool ModelHandler::startElement(const QString &namespaceURI, const QString &localName,
lbajardsilogic@15 72 const QString &qName, const QXmlAttributes &attributes)
lbajardsilogic@15 73 {
lbajardsilogic@15 74
lbajardsilogic@15 75 QString name = qName.toLower();
lbajardsilogic@15 76
lbajardsilogic@15 77 bool ok = false;
lbajardsilogic@15 78
lbajardsilogic@251 79 if (name == "sparql") {
lbajardsilogic@251 80
lbajardsilogic@251 81 // nothing needed
lbajardsilogic@251 82 ok = true;
lbajardsilogic@251 83
lbajardsilogic@251 84 } else if (name == "head") {
lbajardsilogic@251 85
lbajardsilogic@251 86 // nothing needed
lbajardsilogic@251 87 ok = true;
lbajardsilogic@251 88
lbajardsilogic@251 89 } else if (name == "variable") {
lbajardsilogic@251 90
lbajardsilogic@251 91 // nothing needed
lbajardsilogic@251 92 ok = true;
lbajardsilogic@251 93
lbajardsilogic@251 94 } else if (name == "results") {
lbajardsilogic@251 95
lbajardsilogic@251 96 // nothing needed
lbajardsilogic@251 97 ok = true;
lbajardsilogic@251 98
lbajardsilogic@251 99 } else if (name == "result") {
lbajardsilogic@251 100
lbajardsilogic@251 101 //m_resultsWidget->newResult();
lbajardsilogic@251 102 ok = true;
lbajardsilogic@251 103
lbajardsilogic@251 104 } else if (name == "binding") {
lbajardsilogic@251 105
lbajardsilogic@251 106 m_curBindingName = attributes.value("name");
lbajardsilogic@251 107 ok = true;
lbajardsilogic@251 108
lbajardsilogic@251 109 } else if ( (name == "uri") || (name == "literal") ) {
lbajardsilogic@251 110 m_inBinding = true;
lbajardsilogic@251 111 ok = true;
lbajardsilogic@251 112 }
lbajardsilogic@15 113
lbajardsilogic@15 114 if (!ok) {
lbajardsilogic@15 115 std::cerr << "WARNING: ModelReader-XML: Failed to completely process element \""
lbajardsilogic@15 116 << name.toLocal8Bit().data() << "\"" << std::endl;
lbajardsilogic@15 117 }
lbajardsilogic@15 118
lbajardsilogic@15 119 return true;
lbajardsilogic@15 120 }
lbajardsilogic@15 121
lbajardsilogic@15 122 bool ModelHandler::endElement(const QString &namespaceURI, const QString &localName,
lbajardsilogic@15 123 const QString &qName)
lbajardsilogic@15 124 {
lbajardsilogic@251 125 QString name = qName.toLower();
lbajardsilogic@251 126
lbajardsilogic@251 127 if ( (name == "uri") || (name == "literal") )
lbajardsilogic@251 128 {
lbajardsilogic@251 129 m_inBinding = false;
lbajardsilogic@251 130 m_curBindingName = "";
lbajardsilogic@251 131
lbajardsilogic@251 132 } else if (name == "result")
lbajardsilogic@251 133 {
lbajardsilogic@251 134 addNewData();
lbajardsilogic@251 135 }
lbajardsilogic@15 136
lbajardsilogic@15 137 return true;
lbajardsilogic@15 138 }
lbajardsilogic@15 139
lbajardsilogic@15 140 bool ModelHandler::characters(const QString &str)
lbajardsilogic@15 141 {
lbajardsilogic@251 142 if (m_inBinding)
lbajardsilogic@251 143 {
lbajardsilogic@251 144 m_info[m_curBindingName] = str;
lbajardsilogic@251 145 }
lbajardsilogic@15 146
lbajardsilogic@15 147 return true;
lbajardsilogic@15 148 }
lbajardsilogic@15 149
lbajardsilogic@15 150 bool ModelHandler::error(const QXmlParseException &exception)
lbajardsilogic@15 151 {
lbajardsilogic@15 152 QString errorString;
lbajardsilogic@15 153 errorString += QString("ERROR: ModelReader-XML: %1 at line %2, column %3")
lbajardsilogic@15 154 .arg(exception.message())
lbajardsilogic@15 155 .arg(exception.lineNumber())
lbajardsilogic@15 156 .arg(exception.columnNumber());
lbajardsilogic@15 157 std::cerr << errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@15 158 return QXmlDefaultHandler::error(exception);
lbajardsilogic@15 159 }
lbajardsilogic@15 160
lbajardsilogic@15 161 bool ModelHandler::fatalError(const QXmlParseException &exception)
lbajardsilogic@15 162 {
lbajardsilogic@15 163 QString errorString;
lbajardsilogic@15 164 errorString += QString("FATAL ERROR: ModelReader-XML: %1 at line %2, column %3")
lbajardsilogic@15 165 .arg(exception.message())
lbajardsilogic@15 166 .arg(exception.lineNumber())
lbajardsilogic@15 167 .arg(exception.columnNumber());
lbajardsilogic@15 168 std::cerr << errorString.toLocal8Bit().data() << std::endl;
lbajardsilogic@15 169 return QXmlDefaultHandler::fatalError(exception);
lbajardsilogic@15 170 }
lbajardsilogic@15 171
lbajardsilogic@251 172 void ModelHandler::addNewData()
lbajardsilogic@251 173 {
lbajardsilogic@251 174 m_layer = 0;
lbajardsilogic@251 175 m_model = 0;
lbajardsilogic@251 176
lbajardsilogic@251 177 if (m_info.find("beginsAt") != m_info.end())
lbajardsilogic@251 178 {
lbajardsilogic@251 179 addDataInterval();
lbajardsilogic@251 180 } else if (m_info.find("at") != m_info.end())
lbajardsilogic@251 181 {
lbajardsilogic@251 182 addDataTimeInstants();
lbajardsilogic@251 183 }
lbajardsilogic@251 184
lbajardsilogic@251 185 m_info.clear();
lbajardsilogic@251 186 }
lbajardsilogic@251 187
lbajardsilogic@251 188 void ModelHandler::addDataInterval()
lbajardsilogic@251 189 {
lbajardsilogic@251 190 std::map<QString, QString>::iterator iter;
lbajardsilogic@251 191
lbajardsilogic@251 192 std::map<QString, QString>::iterator iterEventLabel = m_info.find("event_label");
lbajardsilogic@251 193 if (iterEventLabel == m_info.end())
lbajardsilogic@251 194 return;
lbajardsilogic@251 195
lbajardsilogic@251 196 QString eventLabel = iterEventLabel->second;
lbajardsilogic@251 197
lbajardsilogic@251 198 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@251 199 std::set<Layer *>::iterator iterLayer;
lbajardsilogic@251 200 bool findLayer = false;
lbajardsilogic@261 201
lbajardsilogic@251 202 for (iterLayer=layers.begin(); iterLayer != layers.end(); iterLayer++)
lbajardsilogic@251 203 {
lbajardsilogic@251 204 if ((*iterLayer)->objectName() == eventLabel)
lbajardsilogic@251 205 {
lbajardsilogic@251 206 m_layer = (*iterLayer);
lbajardsilogic@251 207 findLayer = true;
lbajardsilogic@251 208 m_model = m_layer->getModel();
lbajardsilogic@251 209 }
lbajardsilogic@251 210 }
lbajardsilogic@251 211
lbajardsilogic@251 212 if (!findLayer)
lbajardsilogic@251 213 {
lbajardsilogic@251 214 //create layer
lbajardsilogic@251 215 m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName("interval"));
lbajardsilogic@251 216
lbajardsilogic@251 217 if (!m_layer) {
lbajardsilogic@251 218 std::cerr << "WARNING: modelreader-XML: Failed to add layer of type interval" << std::endl;
lbajardsilogic@251 219 return ;
lbajardsilogic@251 220 }
lbajardsilogic@251 221 m_layer->setObjectName(eventLabel);
lbajardsilogic@251 222
lbajardsilogic@251 223 m_layer->setModelName(eventLabel);
lbajardsilogic@251 224
lbajardsilogic@261 225 if (m_pane && m_layer)
lbajardsilogic@261 226 {
lbajardsilogic@261 227 m_document->addLayerToViewWithoutCommand(m_pane, m_layer);
lbajardsilogic@261 228 }
lbajardsilogic@261 229 }
lbajardsilogic@261 230
lbajardsilogic@261 231 if (!m_model)
lbajardsilogic@261 232 {
lbajardsilogic@251 233 //create model
lbajardsilogic@251 234 IntervalModel * model = new IntervalModel(m_sampleRate, 1, true);
lbajardsilogic@251 235 m_model = model;
lbajardsilogic@251 236 m_model->setObjectName(eventLabel);
lbajardsilogic@251 237
lbajardsilogic@253 238 //set color and value for interval
lbajardsilogic@253 239 IntervalModel *im = dynamic_cast<IntervalModel*> (m_model);
lbajardsilogic@253 240 if ((m_pane) && (im))
lbajardsilogic@253 241 {
lbajardsilogic@253 242 int modulo = m_pane->getIntervalModulo();
lbajardsilogic@253 243 im->setMeanValue(modulo*0.2+0.2);
lbajardsilogic@253 244 m_layer->setProperty("Colour", modulo + 1);
lbajardsilogic@253 245 }
lbajardsilogic@253 246
lbajardsilogic@251 247 //link model, layer document and view
lbajardsilogic@251 248 if (m_model && m_layer)
lbajardsilogic@251 249 {
lbajardsilogic@251 250 m_document->addImportedModel(m_model);
lbajardsilogic@251 251 m_document->setModel(m_layer, m_model);
lbajardsilogic@251 252 }
lbajardsilogic@261 253 }
lbajardsilogic@251 254
lbajardsilogic@251 255 //add interval
lbajardsilogic@251 256 IntervalModel *im = dynamic_cast<IntervalModel*> (m_model);
lbajardsilogic@251 257 if (im)
lbajardsilogic@251 258 {
lbajardsilogic@251 259 //start
lbajardsilogic@251 260 iter = m_info.find("beginsAt");
lbajardsilogic@251 261 if (iter == m_info.end())
lbajardsilogic@251 262 return;
lbajardsilogic@251 263 QString beginAt = iter->second;
lbajardsilogic@251 264 long start = beginAt.mid(2, beginAt.length()-3).toDouble()*m_sampleRate;
lbajardsilogic@251 265 //end
lbajardsilogic@251 266 iter = m_info.find("duration");
lbajardsilogic@251 267 if (iter == m_info.end())
lbajardsilogic@251 268 return;
lbajardsilogic@251 269 QString duration = iter->second;
lbajardsilogic@268 270 long temp = duration.mid(2, duration.length()-3).toDouble();
lbajardsilogic@268 271 long end = start + duration.mid(2, duration.length()-3).toDouble()*m_sampleRate;
lbajardsilogic@251 272 //label
lbajardsilogic@251 273 QString label = "";
lbajardsilogic@251 274 for (iter = m_info.begin(); iter != m_info.end(); iter++)
lbajardsilogic@251 275 {
lbajardsilogic@251 276 QString propertylabel = iter->first;
lbajardsilogic@251 277 if ((propertylabel != "beginsAt") && (propertylabel != "duration") &&
lbajardsilogic@251 278 (propertylabel != "event_label") && (propertylabel != "signal") )
lbajardsilogic@251 279 label += iter->second + " - ";
lbajardsilogic@251 280 }
lbajardsilogic@251 281 //value
lbajardsilogic@268 282 std::cerr << "modelreader-XML: beginAt = " << beginAt.toStdString() << " duration : " << duration.toStdString() << std::endl;
lbajardsilogic@268 283 std::cerr << "modelreader-XML: temp = " << temp << std::endl;
lbajardsilogic@268 284 std::cerr << "modelreader-XML: start = " << start << " end : " << end << std::endl;
lbajardsilogic@268 285
lbajardsilogic@253 286 float value = im->getMeanValue();
lbajardsilogic@251 287 im->addInterval(start, end, label, value);
lbajardsilogic@251 288 }
lbajardsilogic@251 289 }
lbajardsilogic@251 290
lbajardsilogic@251 291 void ModelHandler::addDataTimeInstants()
lbajardsilogic@251 292 {
lbajardsilogic@251 293 std::map<QString, QString>::iterator iter;
lbajardsilogic@251 294
lbajardsilogic@251 295 std::map<QString, QString>::iterator iterEventLabel = m_info.find("event_label");
lbajardsilogic@251 296 if (iterEventLabel == m_info.end())
lbajardsilogic@251 297 return;
lbajardsilogic@251 298
lbajardsilogic@251 299 QString eventLabel = iterEventLabel->second;
lbajardsilogic@251 300
lbajardsilogic@251 301 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@251 302 std::set<Layer *>::iterator iterLayer;
lbajardsilogic@251 303 bool findLayer = false;
lbajardsilogic@251 304
lbajardsilogic@251 305 for (iterLayer=layers.begin(); iterLayer != layers.end(); iterLayer++)
lbajardsilogic@251 306 {
lbajardsilogic@251 307 if ((*iterLayer)->objectName() == eventLabel)
lbajardsilogic@251 308 {
lbajardsilogic@251 309 m_layer = (*iterLayer);
lbajardsilogic@251 310 findLayer = true;
lbajardsilogic@251 311 m_model = m_layer->getModel();
lbajardsilogic@251 312 }
lbajardsilogic@251 313 }
lbajardsilogic@251 314
lbajardsilogic@251 315 if (!findLayer)
lbajardsilogic@251 316 {
lbajardsilogic@251 317 //create layer
lbajardsilogic@251 318 m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName("timeinstants"));
lbajardsilogic@251 319
lbajardsilogic@251 320 if (!m_layer) {
lbajardsilogic@251 321 std::cerr << "WARNING: modelreader-XML: Failed to add layer of type timeinstants" << std::endl;
lbajardsilogic@251 322 return ;
lbajardsilogic@251 323 }
lbajardsilogic@251 324 m_layer->setObjectName(eventLabel);
lbajardsilogic@251 325
lbajardsilogic@251 326 m_layer->setModelName(eventLabel);
lbajardsilogic@251 327
lbajardsilogic@261 328 if (m_pane && m_layer)
lbajardsilogic@261 329 {
lbajardsilogic@261 330 m_document->addLayerToView(m_pane, m_layer);
lbajardsilogic@261 331 }
lbajardsilogic@261 332 }
lbajardsilogic@261 333
lbajardsilogic@261 334 if (!m_model)
lbajardsilogic@261 335 {
lbajardsilogic@251 336 //create model
lbajardsilogic@251 337 SparseOneDimensionalModel *model = new SparseOneDimensionalModel(m_sampleRate, 512);
lbajardsilogic@251 338 m_model = model;
lbajardsilogic@251 339 m_model->setObjectName(eventLabel);
lbajardsilogic@251 340
lbajardsilogic@251 341 //link model, layer document and view
lbajardsilogic@251 342 if (m_model && m_layer)
lbajardsilogic@251 343 {
lbajardsilogic@251 344 m_document->addImportedModel(m_model);
lbajardsilogic@251 345 m_document->setModel(m_layer, m_model);
lbajardsilogic@261 346 }
lbajardsilogic@261 347 }
lbajardsilogic@251 348
lbajardsilogic@251 349 //add point
lbajardsilogic@251 350 SparseOneDimensionalModel *sodm = dynamic_cast<SparseOneDimensionalModel *> (m_model);
lbajardsilogic@251 351 if (sodm)
lbajardsilogic@251 352 {
lbajardsilogic@251 353 //frame
lbajardsilogic@251 354 iter = m_info.find("at");
lbajardsilogic@251 355 if (iter == m_info.end())
lbajardsilogic@251 356 return;
lbajardsilogic@251 357 QString at = iter->second;
lbajardsilogic@251 358 long frame = at.toDouble()*m_sampleRate;
lbajardsilogic@251 359
lbajardsilogic@251 360 sodm->addPoint(SparseOneDimensionalModel::Point(frame, ""));
lbajardsilogic@251 361 }
lbajardsilogic@251 362
lbajardsilogic@15 363 }