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