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