Developer documentation | Axl-2.5.1

axlWriter.cpp
Go to the documentation of this file.
1 /* axlWriter.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: Tue Jan 24 11:00:32 2012 (+0100)
8  * By: Julien Wintz
9  * Update #: 14
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlWriter.h"
21 
25 
27 
29 
30 #include "axlConeWriter.h"
31 #include "axlCylinderWriter.h"
33 #include "axlCircleArcWriter.h"
34 #include "axlEllipsoidWriter.h"
35 #include "axlLineWriter.h"
36 #include "axlPlaneWriter.h"
38 #include "axlTorusWriter.h"
40 #include "axlShapeWriter.h"
41 
42 #include "axlPoint.h"
43 #include "axlPointConverter.h"
44 #include "axlPointWriter.h"
45 
46 #include "axlSphereWriter.h"
47 
48 #include "axlMesh.h"
49 #include "axlMeshWriter.h"
50 
51 #include "axlDataDynamic.h"
52 #include "axlDataDynamicWriter.h"
53 
54 #include <dtkCoreSupport/dtkAbstractData.h>
55 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
56 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
57 
58 #include <QDomDocument>
59 #include <QString>
60 
61 #include <QtWidgets>
62 
63 // /////////////////////////////////////////////////////////////////
64 // axlWriterPrivate
65 // /////////////////////////////////////////////////////////////////
66 
67 class axlWriterPrivate
68 {
69 public:
70  QList<dtkAbstractData *> dataList;
71  QDomDocument *domdocument;
72  QList<QDomElement> *elements ;
73 
74  QDomElement *sceneView ;
75 };
76 
77 // /////////////////////////////////////////////////////////////////
78 // axlWriter
79 // /////////////////////////////////////////////////////////////////
80 
81 axlWriter::axlWriter(void) : QObject(), d(new axlWriterPrivate)
82 {
83  d->domdocument = new QDomDocument() ;
84  d->elements = new QList<QDomElement>;
85 
86  d->sceneView = NULL;
87 }
88 
90 {
91  delete d->elements;
92 
93  delete d->domdocument;
94 
95  delete d;
96 
97  d = NULL;
98 }
99 
100 void axlWriter::setDataToWrite(QList<dtkAbstractData *> dataSet)
101 {
102  d->dataList = dataSet;
103 }
104 
105 void axlWriter::addDataToWrite(dtkAbstractData * data)
106 {
107  d->dataList.push_back(data);
108 }
109 
111 {
112  emit dataSetInserted(d->dataList);
113 
114  return 1;
115 }
116 
117 //void axlWriter::setSceneToWrite(axlAbstractView *sceneView)
118 void axlWriter::setSceneToWrite(QDomElement sceneView)
119 {
120  d->sceneView = &sceneView;
121 }
122 
123 bool axlWriter::write(const QString& filename)
124 {
125  QFile file(filename);
126 
127  if( !file.open(QIODevice::WriteOnly | QIODevice::Text)) {
128  QMessageBox::information(0, "Axel","Error of reading","&Ok",0) ;
129  return false;
130  }
131 
132  // run the QDomDocument
133  foreach(dtkAbstractData *data, d->dataList) {
134 
135  bool founded = false;
136 
137  // test for all reader registered in the factory
138  foreach(QString writer, dtkAbstractDataFactory::instance()->writers()) {
139 
140 
141  axlAbstractDataWriter *axl_writer = dynamic_cast<axlAbstractDataWriter *>(dtkAbstractDataFactory::instance()->writer(writer));
142  QDomElement element = this->elementByWriter(axl_writer, data);
143 
144  if(element.hasChildNodes()) {
145  d->elements->append(element);
146 // axlAbstractData *axlData = dynamic_cast<axlAbstractData *>(data);
147 // if (!axlData->fields().isEmpty()){
148 // qDebug() << "axlWriter::write general fields";
149 // axlAbstractDataWriter *axl_writer_field = dynamic_cast<axlAbstractDataWriter *>(dtkAbstractDataFactory::instance()->writer("axlFieldSpatialWriter"));
150 // foreach(axlAbstractField *field , axlData->fields()){
151 // //dtkAbstractData *field2= dtkAbstractDataFactory::instance()->create("axlProcessSpatialZCoordinates");
152 // QDomElement element = this->elementByWriter(axl_writer_field, reinterpret_cast<dtkAbstractData*>(field));
153 // d->elements->append(element);
154 
155 // delete axl_writer_field;
156 // }
157 // }
158  founded = true;
159  }
160 
161  delete axl_writer;
162 
163  }
164 
165  //Atomics data writer
166 
167  if(!founded)
168  {
170  QDomElement element = this->elementByWriter(axl_writer, data);
171 
172  if(element.hasChildNodes()) {
173  d->elements->append(element);
174  founded = true;
175  }
176 
177  delete axl_writer;
178 
179  }
180 
181  if(!founded)
182  {
183  axlConeWriter *axl_writer = new axlConeWriter;
184  QDomElement element = this->elementByWriter(axl_writer, data);
185 
186  if(element.hasChildNodes()) {
187  d->elements->append(element);
188  // qDebug() << "axlWriter::write isCone";
189  // axlAbstractData *axlData = dynamic_cast<axlAbstractData *>(data);
190  // if (!axlData->fields().isEmpty()){
191  // qDebug() << "axlWriter::write fields";
192  // axlFieldSpatialWriter *axl_writer = new axlFieldSpatialWriter;
193  // foreach(axlAbstractField *field , axlData->fields()){
194  // QDomElement element = this->elementByWriter(axl_writer, field);
195  // d->elements->append(element);
196  // }
197  //}
198  founded = true;
199  }
200 
201  delete axl_writer;
202  }
203 
204  if(!founded)
205  {
206  axlCylinderWriter *axl_writer = new axlCylinderWriter;
207  QDomElement element = this->elementByWriter(axl_writer, data);
208 
209  if(element.hasChildNodes()) {
210  d->elements->append(element);
211  founded = true;
212  }
213  }
214 
215  if(!founded)
216  {
217  axlTorusWriter *axl_writer = new axlTorusWriter;
218  QDomElement element = this->elementByWriter(axl_writer, data);
219 
220  if(element.hasChildNodes()) {
221  d->elements->append(element);
222  founded = true;
223  }
224  }
225 
226  if(!founded)
227  {
228  axlCircleArcWriter *axl_writer = new axlCircleArcWriter;
229  QDomElement element = this->elementByWriter(axl_writer, data);
230 
231  if(element.hasChildNodes()) {
232  d->elements->append(element);
233  founded = true;
234  }
235  }
236 
237  if(!founded)
238  {
239  axlEllipsoidWriter *axl_writer = new axlEllipsoidWriter;
240  QDomElement element = this->elementByWriter(axl_writer, data);
241 
242  if(element.hasChildNodes()) {
243  d->elements->append(element);
244  founded = true;
245  }
246 
247  delete axl_writer;
248  }
249 
250 
251  if(!founded)
252  {
253  axlLineWriter *axl_writer = new axlLineWriter;
254  QDomElement element = this->elementByWriter(axl_writer, data);
255 
256  if(element.hasChildNodes()) {
257  d->elements->append(element);
258  founded = true;
259  }
260 
261  delete axl_writer;
262 
263  }
264 
265  if(!founded)
266  {
267  axlPlaneWriter *axl_writer = new axlPlaneWriter;
268  QDomElement element = this->elementByWriter(axl_writer, data);
269 
270  if(element.hasChildNodes()) {
271  d->elements->append(element);
272  founded = true;
273  }
274 
275  delete axl_writer;
276 
277  }
278 
279  if(!founded)
280  {
282  QDomElement element = this->elementByWriter(axl_writer, data);
283 
284  if(element.hasChildNodes()) {
285  d->elements->append(element);
286  founded = true;
287  }
288 
289  delete axl_writer;
290 
291  }
292 
293  if(!founded)
294  {
295  axlPointWriter *axl_writer = new axlPointWriter;
296  QDomElement element = this->elementByWriter(axl_writer, data);
297 
298  if(element.hasChildNodes()) {
299  d->elements->append(element);
300  founded = true;
301  }
302 
303  delete axl_writer;
304 
305  }
306 
307  if(!founded)
308  {
309  axlMeshWriter *axl_writer = new axlMeshWriter;
310  QDomElement element = this->elementByWriter(axl_writer, data);
311 
312  if(element.hasChildNodes()) {
313  d->elements->append(element);
314  founded = true;
315  }
316  }
317 
318 
319  if(!founded)
320  {
321  axlSphereWriter *axl_writer = new axlSphereWriter;
322  QDomElement element = this->elementByWriter(axl_writer, data);
323 
324  if(element.hasChildNodes()) {
325  d->elements->append(element);
326  founded = true;
327  }
328 
329  delete axl_writer;
330 
331  }
332 
333  if(!founded)
334  {
335  axlShapeWriter *axl_writer = new axlShapeWriter;
336  QDomElement element = this->elementByWriter(axl_writer, data);
337 
338  if(element.hasChildNodes()) {
339  d->elements->append(element);
340  founded = true;
341  }
342 
343  delete axl_writer;
344 
345  }
346 
347  if(!founded)
348  {
349  axlDataDynamicWriter *axl_writer = new axlDataDynamicWriter;
350  QDomElement element = this->elementByWriter(axl_writer, data);
351  d->elements->append(element);
352 
353  if(element.hasChildNodes()) {
354  d->elements->append(element);
355  founded = true;
356  }
357 
358  delete axl_writer;
359 
360  }
361 
362  }
363 
364  QDomElement axl = d->domdocument->createElement("axl");
365  d->domdocument->appendChild(axl);
366 
367  foreach(QDomElement e, *(d->elements)){
368  axl.appendChild(e) ;
369  }
370 
371  // when we want to write the scene view
372  if (d->sceneView)
373  axl.appendChild(*(d->sceneView));
374 
375  QTextStream ts( &file );
376  ts << d->domdocument->toString();
377 
378  file.close();
379 
380 
381  return true;
382 }
383 
384 bool axlWriter::exportOFF(const QString& file)
385 {
386  QFile filename(file);
387  QTextStream os( &filename );
388 
389  if( !filename.open(QIODevice::WriteOnly | QIODevice::Text)) {
390  QMessageBox::information(0, "Axel","Error of reading","&Ok",0) ;
391  return false;
392  }
393 
394  // construct the axlMesh;
395  axlMesh *mesh = new axlMesh;
396 
397  for(int i = 0 ; i < d->dataList.size() ; i++)
398  {
399  // bool founded = false;
400 
401  axlMesh *currentMesh = NULL;
402 
403  bool founded = false;
404 
405  // test for all converters registered in the factory
406 
407  foreach(QString converter, dtkAbstractDataFactory::instance()->converters())
408  {
409  if(!founded)
410  {
411  axlAbstractDataConverter *axl_converter = dynamic_cast<axlAbstractDataConverter *>(dtkAbstractDataFactory::instance()->converter(converter));
412  axl_converter->setData(d->dataList.at(i));
413  currentMesh = axl_converter->toMesh();
414  if(currentMesh)
415  founded = true;
416  }
417 
418  }
419 
420 
421  //Atomics data writers
422 
423  if(!founded)
424  {
425  axlPointConverter *axl_converter = new axlPointConverter;
426  axl_converter->setData(d->dataList.at(i));
427  currentMesh = axl_converter->toMesh();
428  if(currentMesh)
429  founded = true;
430  }
431 
432  if(!founded)
433  {
434  if ((currentMesh = dynamic_cast<axlMesh*>(d->dataList.at(i))))
435  founded = true;
436  }
437 
438  if(currentMesh)
439  mesh->append(currentMesh);
440 
441  if(!founded)
442  return false;
443  }
444 
445  if(mesh->vertex_count() == 0)
446  return false;
447 
448  os << "OFF\n";
449  os << "#\n";
450  os << "# "<< file << "\n";
451  os << "# This file was created with axelModeler.\n";
452  os << "# Go to https://axl.inria.fr for more information.\n";
453  os << "#\n";
454 
455  //write of the mesh
456 
457  os << mesh->vertex_count() << " " << mesh->face_count() << " "<< mesh->edge_count()<< "\n";
458 
459  for(int i = 0 ; i < mesh->vertex_count() ; i++)
460  {
461  axlPoint p;
462  mesh->vertex(i, &p);
463  os << p.x() << " " << p.y() << " " << p.z()<< "\n";
464  }
465 
466  for(int i = 0 ; i < mesh->face_count() ; i++)
467  {
468  QVector<int> face = mesh->face(i);
469 
470  os << face.size();
471  for(int j = 0 ; j < face.size(); j++)
472  {
473  os << " " << face.at(j);
474  }
475 
476  os << "\n";
477  }
478 
479 // for(int i = 0 ; i < mesh->edge_count() ; i++)
480 // {
481 // axlMesh::Edge edge = mesh->edge(i);
482 // os << 1 << " " << edge.first << " " << edge.second << "\n";
483 // }
484 
485  filename.close();
486 
487  delete mesh;
488 
489  return true;
490 }
491 
492 bool axlWriter::exportTo_OFF(QString& filename)
493 {
494  QFile file(filename);
495  int num_spline = 0;
496  int number_SurfaceBSpline;
497 
498  QTextStream os( &file );
499 
500  if( !file.open(QIODevice::WriteOnly | QIODevice::Text)) {
501  QMessageBox::information(0, "Axel","Error of reading","&Ok",0) ;
502  return false;
503  }
504 
505  number_SurfaceBSpline = countAxlAbstractDataSurfaceBSpline();
506  // surface number
507  os << number_SurfaceBSpline << "\n";
508 
509  // run the QDomDocument
510  foreach(dtkAbstractData *data, d->dataList)
511  {
512 
513  if(axlAbstractSurfaceBSpline *surface = dynamic_cast<axlAbstractSurfaceBSpline *>(data))
514  {
515  double start_u = surface->startParam_u();
516  double start_v = surface->startParam_v();
517  double end_u = surface->endParam_u();
518  double end_v = surface->endParam_v();
519  double paramCourant_u = start_u;
520  double paramCourant_v = start_v;
521 
522  axlPoint pointCourant;
523 
524  int n_u = surface->numSamples_u();// need to be superior than 1
525  int n_v = surface->numSamples_v();
526 
527  // point number triangle number
528  os << (n_u) * (n_v) << " " << (n_u - 1)*(n_v - 1) * 2 << "\n";
529 
530  double interval_u = (double)(end_u - start_u) / (n_u - 1);
531  double interval_v = (double)(end_v - start_v) / (n_v - 1);
532 
533  // writte point x y z u v num_spline
534  for(int j = 0; j < n_v - 1; j++)
535  {
536  for(int i = 0; i < n_u - 1; i++)
537  {
538  pointCourant = surface->eval(paramCourant_u, paramCourant_v);
539 
540  os << pointCourant.x() << " " << pointCourant.y() << " " << pointCourant.z() << " ";
541  os << paramCourant_u << " " << paramCourant_v << " ";
542  os << num_spline << "\n";
543 
544  paramCourant_u += interval_u;
545  }
546 
547  pointCourant = surface->eval(end_u, paramCourant_v);
548 
549  os << pointCourant.x() << " " << pointCourant.y() << " " << pointCourant.z() << " ";
550  os << paramCourant_u << " " << paramCourant_v << " ";
551  os << num_spline << "\n";
552 
553  paramCourant_u = start_u;
554  paramCourant_v += interval_v;
555  }
556 
557  for(int i = 0; i < n_u - 1; i++)
558  {
559  pointCourant=surface->eval(paramCourant_u, end_v);
560 
561  os << pointCourant.x() << " " << pointCourant.y() << " " << pointCourant.z() << " ";
562  os << paramCourant_u << " " << paramCourant_v << " ";
563  os << num_spline << "\n";
564 
565  paramCourant_u += interval_u;
566  }
567 
568  // writte triangle connections
569  int ind1 = 0;
570  int ind2 = 0;
571 
572  for(int j = 0; j < n_v - 1; j++)
573  {
574  for(int i= 0; i <n_u - 1; i++)
575  {
576  ind1 = j * n_u + i;
577  ind2 = ind1 + n_u;
578 
579  os << ind1 << " " << ind1 + 1 << " " << ind2 << "\n";
580 
581  os << ind1 + 1 << " " << ind2 << " " << ind2 + 1 << "\n";
582  }
583  }
584  num_spline ++;
585  }
586  }
587  file.close();
588  return 1;
589 }
590 
591 int axlWriter::countAxlAbstractDataSurfaceBSpline()
592 {
593  int num_SurfaceBSpline = 0;
594 
595  foreach(dtkAbstractData *data, d->dataList)
596  {
597  if(dynamic_cast<axlAbstractSurfaceBSpline *>(data))
598  {
599  ++ num_SurfaceBSpline;
600  }
601  }
602 
603  return num_SurfaceBSpline;
604 }
605 
606 QDomElement axlWriter::setComposite(axlAbstractDataComposite *composite)
607 {
608  QDomElement compositeElement = d->domdocument->createElement("composite");
609  compositeElement.setAttribute("name",composite->name());
610 
611  QColor qcolor = composite->color();
612  QString color ;
613  QTextStream(&color) << QString::number(qcolor.red()) << " "
614  << QString::number(qcolor.green()) << " "
615  << QString::number(qcolor.blue()) ;
616  compositeElement.setAttribute("color", color);
617  QString shader = composite->shader();
618  QFileInfo shaderFileInfo(shader);
619  compositeElement.setAttribute("shader", shaderFileInfo.fileName());
620 
621  for(int i = 0; i < composite->count(); i ++)
622  {
623  if(axlAbstractCurveBSpline *curve = dynamic_cast<axlAbstractCurveBSpline *>(composite->get(i)))
624  {
625  //compositeElement.appendChild(setBSplineCurve(curve));
626 
627  Q_UNUSED(curve);
628  }
629  else if(axlAbstractSurfaceBSpline *surface = dynamic_cast<axlAbstractSurfaceBSpline *>(composite->get(i)))
630  {
631  //compositeElement.appendChild(setBSplineSurface(surface));
632 
633  Q_UNUSED(surface);
634  }
635  else if(axlAbstractDataComposite *dataComposite = dynamic_cast<axlAbstractDataComposite *>(composite->get(i)))
636  {
637  compositeElement.appendChild(setComposite(dataComposite));
638  }
639  }
640 
641  return compositeElement;
642 }
643 
644 
645 QDomElement axlWriter::elementByWriter(axlAbstractDataWriter *axl_writer, dtkAbstractData *data)
646 {
647  QDomElement element;
648 
649  if(!axl_writer)
650  return element;
651 
652 
653  if(!axl_writer->accept(data))
654  return element;
655 
656  element = axl_writer->write(d->domdocument, data);
657 
658  return element;
659 }
660 
661 
662 QString axlWriter::description(void) const
663 {
664  return "axlWriter";
665 }
void setSceneToWrite(QDomElement sceneView)
Definition: axlWriter.cpp:118
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
int face_count(void) const
Definition: axlMesh.cpp:138
axlWriter(void)
Definition: axlWriter.cpp:81
bool exportOFF(const QString &file)
Definition: axlWriter.cpp:384
virtual bool accept(dtkAbstractData *data)=0
int update(void)
Definition: axlWriter.cpp:110
virtual QString description(void) const
Definition: axlWriter.cpp:662
void append(axlMesh *mesh)
Definition: axlMesh.cpp:814
void addDataToWrite(dtkAbstractData *dataSet)
Definition: axlWriter.cpp:105
virtual ~axlWriter(void)
Definition: axlWriter.cpp:89
void setData(dtkAbstractData *data)
int edge_count(void) const
Definition: axlMesh.cpp:143
void vertex(const int &ind, double vertex[3])
set vertex values of vertices with index ind.
Definition: axlMesh.cpp:322
void setDataToWrite(QList< dtkAbstractData * > dataSet)
Definition: axlWriter.cpp:100
double y
Definition: axlPoint.h:37
double z
Definition: axlPoint.h:38
virtual QDomElement write(QDomDocument *doc, dtkAbstractData *data)=0
bool write(const QString &filename)
Definition: axlWriter.cpp:123
double x
Definition: axlPoint.h:37
virtual axlMesh * toMesh(void)
Mesh conversion.
int vertex_count(void) const
Definition: axlMesh.cpp:122
void dataSetInserted(QList< dtkAbstractData * > dataSet)
Face face(int ind) const
Definition: axlMesh.cpp:709
bool get(dtkAbstractData *data)
Class axlMesh defines a piecewise-linear 3D object.
Definition: axlMesh.h:41
axlMesh * toMesh(void)
bool exportTo_OFF(QString &filename)
Definition: axlWriter.cpp:492