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 } |