Developer documentation | Axl-2.5.1

axlReader.cpp
Go to the documentation of this file.
1 /* axlReader.cpp ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008 - Meriadeg Perrinel, Inria.
5  * Created: Wed Mar 16 12:46:11 2011 (+0100)
6  * Version: $Id$
7  * Last-Updated: Wed Sep 21 11:11:59 2011 (+0200)
8  * By: Julien Wintz
9  * Update #: 94
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlReader.h"
21 
22 #include <axlCore/axlCircleArc.h>
24 
27 #include <axlCore/axlConeReader.h>
30 #include <axlCore/axlLineReader.h>
31 #include <axlCore/axlPlaneReader.h>
32 #include <axlCore/axlMesh.h>
33 #include <axlCore/axlMeshReader.h>
35 #include <axlCore/axlPointReader.h>
36 #include <axlCore/axlMesh.h>
37 #include <axlCore/axlMeshReader.h>
38 #include <axlCore/axlTorusReader.h>
40 #include <axlCore/axlShapeReader.h>
41 
42 #include <axlCore/axlLine.h>
43 #include <axlCore/axlSphere.h>
44 #include <axlCore/axlCircleArc.h>
45 #include <axlCore/axlTorus.h>
48 
49 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
50 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
51 #include <dtkCoreSupport/dtkAbstractDataReader.h>
52 
53 #include <axlCore/axlDataDynamic.h>
56 
57 #include <QtWidgets>
58 
59 // /////////////////////////////////////////////////////////////////
60 // axlReaderPrivate
61 // /////////////////////////////////////////////////////////////////
62 
63 class axlReaderPrivate
64 {
65 public:
66  QList<axlAbstractData *> dataList;
67 
68  QString filename;
69 };
70 
71 // /////////////////////////////////////////////////////////////////
72 // axlReader
73 // /////////////////////////////////////////////////////////////////
74 
75 axlReader::axlReader(void) : QObject(), d(new axlReaderPrivate)
76 {
77 }
78 
80 {
81  delete d;
82 
83  d = NULL;
84 }
85 
86 
87 QList<axlAbstractData *> axlReader::dataSet(void){
88  return d->dataList;
89 }
90 
92  if(d->dataList.size() > index){
93  return d->dataList.at(index);
94  }
95  return NULL;
96 }
97 
98 bool axlReader::read(const QString& file)
99 {
100  d->filename = file;
101 
102  d->dataList.clear(); // make sur that the list is empty
103 
104  QDomDocument domdocument("axl");
105 
106  QFile f(file);
107 
108  if(!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
109  QMessageBox::information(0, "Axel", "Error of reading", "&Ok", 0);
110  return 0;
111  }
112 
113  if(!domdocument.setContent(&f)) {
114  QMessageBox::information(0, "Axel", file + " is not a valid Axel file", "&Ok", 0);
115  return 0;
116  }
117 
118  f.close();
119 
120  QDomNode n = domdocument.firstChildElement("axl").firstChild();
121  QDomElement view;
122 
123  bool sameName = false;
124  while (!n.isNull()) {
125 
126 
127  dtkAbstractData *readData = this->read(n);
128  if(axlAbstractData *axldata = dynamic_cast<axlAbstractData *>(readData)){
129 
130 // qDebug()<<"-- read"<<axldata->identifier();
131  if(!d->dataList.isEmpty() && axldata->name() != axldata->identifier() && !sameName){
132  foreach(axlAbstractData *listData, d->dataList){
133  if(listData->name() == axldata->name() ){
134  sameName = true;
135  }
136  if(!sameName && dynamic_cast<axlDataDynamic *>(listData)){
137  axlDataDynamic *dataD = dynamic_cast<axlDataDynamic *>(listData);
138  for(int i = 0; i< dataD->numberOfChannels();i++){
139  if(dataD->outputs(i)->name() == axldata->name()){
140  sameName = true;
141  }
142  }
143  }
144  }
145  }
146 
147  if(!dynamic_cast<axlAbstractField *>(axldata)){
148  d->dataList << axldata;
149 // qDebug()<<"-- data list"<<d->dataList.size();
150  }
151  }
152 
153  if (n.toElement().tagName() == "view")
154  view = n.toElement();
155 
156  n = n.nextSibling();
157  }
158 
159  dtkWarn() << Q_FUNC_INFO << "reads" <<d->dataList.size()<<"object(s)";
160  emit dataSetInserted(d->dataList);
161  int sizeList = d->dataList.size();
162  for(int i = 0; i < sizeList; i++){
163  if(!d->dataList.at(i)->fields().isEmpty()){
164  foreach(axlAbstractField *field, d->dataList.at(i)->fields()){
165  QList<axlAbstractData *>a;
166  a << d->dataList.at(i);
167  emit dataSetFieldsChanged(a, field->name());
168  }
169  }
170  }
171 
172  // emit last the scene (inserted data reset the camera)
173  if (view.tagName() == "view")
174  emit dataSceneRead(view);
175 
176  if(sameName){
177  //QMessageBox::information(0, "Axel", "Two or more objects have the same name: \n geometry may be false" , "&Ok", 0);
178  dtkWarn()<<"\e[1;31m Two or more objects have the same name in"<< file<<" (name changed) \e[0m";
179  }
180 
181  return true;
182 }
183 
184 axlAbstractData *axlReader::read(const QDomNode& node)
185 {
186 
187  axlAbstractData *data = NULL;
188  // test for all reader registered in the factory
189  foreach(QString reader, dtkAbstractDataFactory::instance()->readers()) {
190  dtkWarn()<<"reader"<<reader;
191  axlAbstractDataReader *axl_reader = dynamic_cast<axlAbstractDataReader *>(dtkAbstractDataFactory::instance()->reader(reader));
192  data = this->dataByReader(axl_reader, node);
193  delete axl_reader;
194 
195  if(data){
196  return data;
197  }
198 
199  }
200 
201  // test for particular case
202  axlConeReader *axl_cone_reader = new axlConeReader;
203  data = this->dataByReader(axl_cone_reader, node);
204  delete axl_cone_reader;
205 
206  if(data)
207  return data;
208 
209  axlCylinderReader *axl_cylinder_reader = new axlCylinderReader;
210  data = this->dataByReader(axl_cylinder_reader, node);
211  delete axl_cylinder_reader;
212 
213  if(data)
214  return data;
215 
216  axlTorusReader *axl_torus_reader = new axlTorusReader;
217  data = this->dataByReader(axl_torus_reader, node);
218  delete axl_torus_reader;
219 
220  if(data)
221  return data;
222 
223  axlCircleArcReader *axl_arc_reader = new axlCircleArcReader;
224  data = this->dataByReader(axl_arc_reader, node);
225  delete axl_arc_reader;
226 
227  if(data)
228  return data;
229 
230  axlShapeReader *axl_shape_reader = new axlShapeReader;
231  data = this->dataByReader(axl_shape_reader, node);
232  delete axl_shape_reader;
233 
234  if(data)
235  return data;
236 
237  axlEllipsoidReader *axl_ellipsoid_reader = new axlEllipsoidReader;
238  data = this->dataByReader(axl_ellipsoid_reader, node);
239  delete axl_ellipsoid_reader;
240 
241  if(data)
242  return data;
243 
244 
245  axlLineReader *axl_line_reader = new axlLineReader;
246  data = this->dataByReader(axl_line_reader, node);
247  delete axl_line_reader;
248 
249  if(data)
250  return data;
251 
252 
253  axlPlaneReader *axl_plane_reader = new axlPlaneReader;
254  data = this->dataByReader(axl_plane_reader, node);
255  delete axl_plane_reader;
256 
257  if(data)
258  return data;
259 
260  axlPointReader *axl_point_reader = new axlPointReader;
261  data = this->dataByReader(axl_point_reader, node);
262  delete axl_point_reader;
263 
264  if(data)
265  return data;
266 
267  // test for particular case
268  // axlPointSetReader *axl_pointSet_reader = new axlPointSetReader;
269  // data = this->dataByReader(axl_pointSet_reader, node);
270 
271  // if(data) {
272  // return data;
273  // }
274  // else
275  // delete axl_pointSet_reader;
276 
277  axlSphereReader *axl_sphere_reader = new axlSphereReader;
278  data = this->dataByReader(axl_sphere_reader, node);
279 
280  delete axl_sphere_reader;
281 
282  if(data)
283  return data;
284 
286  data = this->dataByReader(axl_composite_reader, node);
287  delete axl_composite_reader;
288 
289  if(data)
290  return data;
291 
292  axlDataDynamicReader *axl_dynamic_reader = new axlDataDynamicReader;
293  data = this->dataByReader(axl_dynamic_reader, node);
294 
295  if(data){
296  axlDataDynamic *axldata = dynamic_cast<axlDataDynamic *>(data);
297  data = axl_dynamic_reader->readInputs(axldata, node, d->dataList);
298  return data;
299  }
300  delete axl_dynamic_reader;
301 
302  axlMeshReader *axl_mesh_reader = new axlMeshReader;
303  data = this->dataByReader(axl_mesh_reader, node);
304  delete axl_mesh_reader;
305 
306  return data; //Mesh or NULL
307 }
308 
309 axlAbstractData *axlReader::dataByReader(axlAbstractDataReader *axl_reader, const QDomNode& node)
310 {
311  if(!axl_reader)
312  return NULL;
313 
314  if(!axl_reader->accept(node))
315  return NULL;
316 
317  dtkWarn()<<"data accepted";
318 
319  axl_reader->dtkAbstractDataReader::read(d->filename);
320 
321  if(axlAbstractData *data = dynamic_cast<axlAbstractData*>(axl_reader->read(node)))
322  return data;
323 
324  return NULL;
325 }
326 
327 
328 bool axlReader::importOFF(const QString& file)
329 {
330  d->dataList.clear(); // make sur that the list is empty
331 
332  QFile filename(file);
333  if (filename.open(QFile::ReadOnly))
334  {
335  QTextStream in(&filename);
336 
337  QString format = "";
338  int vertexCount = 0;
339  int faceCount = 0;
340  int edgeCount = 0;
341  bool intConvert = false;
342 
343  double vx = 0.0;
344  double vy = 0.0;
345  double vz = 0.0;
346 
347  QVector<int> currentFace;
348  int currentFaceSize = 0;
349  int currentFaceIndex = 0;
350 
351  format = in.readLine(75);
352 
353  if(format.startsWith("OFF") || format.startsWith("off") || format.startsWith("Off"))
354  {
355  axlMesh *mesh = new axlMesh;
356  //format = in.skipWhiteSpace();
357 
358  // head reading
359  while(!intConvert)
360  {
361  in.skipWhiteSpace();
362  in >> format;// skip commentary
363  vertexCount = format.toInt(&intConvert);
364  }
365  in.skipWhiteSpace();
366  in >> faceCount;
367  in.skipWhiteSpace();
368  in >> edgeCount;
369 
370  // vertices reading
371 
372  for(int i = 0 ; i < vertexCount ; i++)
373  {
374  in.skipWhiteSpace();
375  in >> vx;
376  in.skipWhiteSpace();
377  in >> vy;
378  in.skipWhiteSpace();
379  in >> vz;
380 
381  mesh->push_back_vertex(vx, vy, vz);
382  }// vertices are read
383 
384  qDebug()<< "axlReader::importOFF"<< faceCount+edgeCount;
385  // faces reading
386  for(int i = 0 ; i < faceCount+edgeCount ; i++)
387  {
388  currentFace.clear();
389  in.skipWhiteSpace();
390  in >> currentFaceSize;
391 
392  if(currentFaceSize == 1){
393  for(int j = 0 ; j < 2 ; j++)
394  {
395  in.skipWhiteSpace();
396  in >> currentFaceIndex;
397  currentFace << currentFaceIndex;
398  }
399  // skip color information if necessary
400  in.readLine(75);
401  mesh->push_back_edge(currentFace.at(0), currentFace.at(1));
402 
403  }else{
404  // current face reading
405  for(int j = 0 ; j < currentFaceSize ; j++)
406  {
407  in.skipWhiteSpace();
408  in >> currentFaceIndex;
409  currentFace << currentFaceIndex;
410  }
411  // skip color information if necessary
412  in.readLine(75);
413  mesh->push_back_face(currentFace);
414  }
415  }// faces and edges are read
416 
417  d->dataList << mesh;
418 
419 
420  //qDebug()<<"axlMeshReader::read"<< mesh->face_count()<<mesh->edge_count()<< mesh->vertex_count();
421  if(mesh->face_count() != 0)
422  {
423  mesh->face_show() = true;
424  mesh->edge_show() = false;
425  mesh->vertex_show() = false;
426  }
427  if(mesh->edge_count() != 0)
428  {
429  // mesh->face_show() = false;
430  mesh->edge_show() = true;
431  mesh->vertex_show() = false;
432  }
433  else if(mesh->vertex_count() != 0 )
434  {
435  mesh->face_show() = false;
436  mesh->edge_show() = false;
437  mesh->vertex_show() = true;
438  }
439  else
440  {
441  mesh->face_show() = false;
442  mesh->edge_show() = false;
443  mesh->vertex_show() = false;
444  }
445  }
446 
447  }
448 
449  // qDebug()<<"nb element "<<d->dataList.size();
450 
451  emit dataSetInserted(d->dataList);
452 
453 
454  return true;
455 }
bool importOFF(const QString &file)
Definition: axlReader.cpp:328
int face_count(void) const
Definition: axlMesh.cpp:138
bool vertex_show(void) const
Definition: axlMesh.cpp:159
void push_back_edge(int, int)
Definition: axlMesh.cpp:669
virtual int numberOfChannels(void)
Return the number of output(s);.
void dataSceneRead(QDomElement)
axlAbstractData * outputs(void)
Return the first output of the list.
bool edge_show(void) const
Definition: axlMesh.cpp:190
QList< axlAbstractData * > dataSet(void)
Definition: axlReader.cpp:87
Class axlDataDynamic defines a dynamic object.
void dataSetInserted(QList< axlAbstractData * > dataSet)
int edge_count(void) const
Definition: axlMesh.cpp:143
virtual axlAbstractData * read(const QDomNode &node)=0
Class axlAbstractField defines an API for arrays of numeric data.
bool face_show(void) const
Definition: axlMesh.cpp:200
bool read(const QString &file)
Definition: axlReader.cpp:98
void push_back_face(const Face &face)
Definition: axlMesh.cpp:735
axlAbstractData * readInputs(axlDataDynamic *data, const QDomNode &node, const QList< axlAbstractData * > &list)
Construct an axlAbstractData from a node and a list of data.
virtual bool accept(const QDomNode &node)=0
axlReader(void)
Definition: axlReader.cpp:75
axlAbstractData * data(int index)
Definition: axlReader.cpp:91
void dataSetFieldsChanged(QList< axlAbstractData * > dataSet, QString fieldName)
int vertex_count(void) const
Definition: axlMesh.cpp:122
Class axlAbstractData defines an API for all type of axel data.
~axlReader(void)
Definition: axlReader.cpp:79
Class axlMesh defines a piecewise-linear 3D object.
Definition: axlMesh.h:41
void push_back_vertex(const double &x, const double &y, const double &z)
Add a new vertex to the mesh.
Definition: axlMesh.cpp:333