Developer documentation | Axl-2.5.1

axlEllipsoidReader.cpp
Go to the documentation of this file.
1 /* axlEllipsoidReader.cpp ---
2  *
3  * Author: Meriadeg Perrinel
4  * Copyright (C) 2008-2011 - Meriadeg Perrinel, Inria.
5  * Created: Wed Sep 21 11:36:52 2011 (+0200)
6  * Version: $Id$
7  * Last-Updated: Wed Sep 21 12:11:29 2011 (+0200)
8  * By: Meriadeg Perrinel
9  * Update #: 88
10  */
11 
12 /* Commentary:
13  *
14  */
15 
16 /* Change log:
17  *
18  */
19 
20 #include "axlEllipsoidReader.h"
21 
22 #include <axlCore/axlEllipsoid.h>
23 #include <axlCore/axlPoint.h>
25 
26 #include <dtkCoreSupport/dtkAbstractData.h>
27 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
30 
31 #include <dtkMathSupport/dtkQuaternion.h>
32 
33 // /////////////////////////////////////////////////////////////////
34 // axlEllipsoidReader
35 // /////////////////////////////////////////////////////////////////
36 
38  this->setObjectName(this->description());
39 }
40 
42 }
43 
44 QString axlEllipsoidReader::identifier(void) const {
45  return "axlEllipsoidReader";
46 }
47 
48 QString axlEllipsoidReader::description(void) const {
49  return "axlEllipsoidReader";
50 }
51 
52 QStringList axlEllipsoidReader::handled(void) const {
53  return QStringList() << "axlEllipsoid";
54 }
55 
57  return dtkAbstractDataFactory::instance()->registerDataReaderType("axlEllipsoidReader", QStringList(), createaxlEllipsoidReader);
58 }
59 
60 bool axlEllipsoidReader::accept(const QDomNode& node) {
61  QDomElement element = node.toElement();
62 
63  if(element.tagName() != "ellipsoid")
64  return false;
65 
66  if(!hasChildNode(element, "center"))
67  return false;
68 
69  if(!hasChildNode(element, "semix"))
70  return false;
71 
72  if(!hasChildNode(element, "semiy"))
73  return false;
74 
75  if(!hasChildNode(element, "semiz"))
76  return false;
77 
78  return true;
79 }
80 
81 bool axlEllipsoidReader::reject(const QDomNode& node) {
82  return !this->accept(node);
83 }
84 
85 axlAbstractData *axlEllipsoidReader::read(const QDomNode& node) {
86  QDomElement element = node.toElement();
87 
88  axlEllipsoid *currentEllipsoid = new axlEllipsoid();
89 
90  QString name = element.attribute("name");
91  if(!name.isEmpty()) {
92  currentEllipsoid->setObjectName(name);
93  }
94 
95  QString color = element.attribute("color");
96  if(!color.isEmpty()) {
97  QStringList colorList = color.split(" ");
98  if(colorList.size() > 2) // rgb components
99  currentEllipsoid->setColor(QColor(colorList.at(0).toInt(), colorList.at(1).toInt(), colorList.at(2).toInt()));
100  if(colorList.size() == 4)
101  currentEllipsoid->setOpacity(colorList.at(3).toFloat());
102  }
103 
104  QString shader = element.attribute("shader");
105  QString dirShader;
106  if(!shader.isEmpty()) {
107  // try to read from axelShader.qrc
108  dirShader = ":axlShader/shader/"+shader;
109  if(!QFile::exists(dirShader))
110  {
111  QSettings settings("inria", "dtk");
112  QString defaultPath;
113  settings.beginGroup("shader");
114  dirShader = settings.value("path", defaultPath).toString();
115  //dirShader = this->file().left(this->file().lastIndexOf("axel-data") + 9); // to Remove later
116  dirShader.append("/"+shader);
117  }
118  currentEllipsoid->setShader(dirShader);
119  }
120 
121  QString size = element.attribute("size");
122  if(!size.isEmpty())
123  currentEllipsoid->setSize(size.toFloat());
124 
125  //Center
126  QDomNodeList nodelistcenter = element.elementsByTagName("center") ;
127  QDomElement elementCenter = nodelistcenter.item(0).toElement() ;
128 
129  QStringList centerCoords = elementCenter.text().simplified().split(QRegExp("\\s+"));
130  if (centerCoords.size() == 3) {
131  currentEllipsoid->setCenter(new axlPoint(centerCoords[0].toFloat(), centerCoords[1].toFloat(), centerCoords[2].toFloat()));
132  } else
133  qDebug()<<"Ellispoid data cannot be read correctly : center Coords";
134 
135  //SemiX
136  QDomNodeList nodelistSemiX = element.elementsByTagName("semix") ;
137  QDomElement elementSemiX = nodelistSemiX.item(0).toElement() ;
138 
139  QStringList semiXCoords = elementSemiX.text().simplified().split(QRegExp("\\s+"));
140  if (semiXCoords.size() == 3) {
141  currentEllipsoid->setSemiX(new axlPoint(semiXCoords[0].toFloat(), semiXCoords[1].toFloat(), semiXCoords[2].toFloat()));
142  } else
143  qDebug()<<"Ellispoid data cannot be read correctly : semiX Coords";
144 
145  //SemiY
146  QDomNodeList nodelistSemiY = element.elementsByTagName("semiy") ;
147  QDomElement elementSemiY = nodelistSemiY.item(0).toElement() ;
148 
149  QStringList semiYCoords = elementSemiY.text().simplified().split(QRegExp("\\s+"));
150  if (semiYCoords.size() == 3) {
151  currentEllipsoid->setSemiY(new axlPoint(semiYCoords[0].toFloat(), semiYCoords[1].toFloat(), semiYCoords[2].toFloat()));
152  } else
153  qDebug()<<"Ellispoid data cannot be read correctly : semiY Coords";
154 
155  //SemiZ
156  QDomNodeList nodelistSemiZ = element.elementsByTagName("semiz") ;
157  QDomElement elementSemiZ = nodelistSemiZ.item(0).toElement() ;
158 
159  QStringList semiZCoords = elementSemiZ.text().simplified().split(QRegExp("\\s+"));
160  if (semiZCoords.size() == 3) {
161  currentEllipsoid->setSemiZ(new axlPoint(semiZCoords[0].toFloat(), semiZCoords[1].toFloat(), semiZCoords[2].toFloat()));
162  } else
163  qDebug()<<"Ellispoid data cannot be read correctly : semiZ Coords";
164 
165  //if there are some field, read them thanks to the factory.
166  QDomNodeList nodeListField = element.elementsByTagName("field");
167  if(!nodeListField.isEmpty()){
168  for(int i =0; i < nodeListField.size(); i++){
169  QDomElement fieldElement = nodeListField.at(i).toElement();
170  QString fieldType = fieldElement.attribute("type");
171  if(!fieldType.isEmpty()){
172  axlAbstractDataReader *field_reader = dynamic_cast<axlAbstractDataReader *>(axlFieldReadersFactory::instance()->create(fieldType));
173  axlAbstractField * fieldToAdd = dynamic_cast<axlAbstractField *>(field_reader->read(fieldElement));
174  if(fieldToAdd){
175  QString newName = currentEllipsoid->changeFieldName(fieldToAdd->name());
176  fieldToAdd->setObjectName(newName);
177  currentEllipsoid->addField(fieldToAdd);
178  }
179  }
180  }
181  }
182  return currentEllipsoid;
183 }
184 
185 dtkAbstractDataReader *createaxlEllipsoidReader(void) {
186  return new axlEllipsoidReader;
187 }
QString identifier(void) const
Class axlPoint defines 3D points.
Definition: axlPoint.h:34
axlAbstractData * read(const QDomNode &node)
void setSemiZ(axlPoint *semiZ)
Change semi axes z value of this ellipsoid.
void setShader(const QString &shader)
void setCenter(axlPoint *center)
Change center of this ellipsoid.
QString changeFieldName(QString fieldName)
dtkAbstractDataReader * create(const QString &interface_name)
QString description(void) const
bool reject(const QDomNode &node)
virtual axlAbstractData * read(const QDomNode &node)=0
static bool registered(void)
QStringList handled(void) const
void setSemiX(axlPoint *semiX)
Change semi axes x value of this ellipsoid.
Class axlAbstractField defines an API for arrays of numeric data.
bool hasChildNode(QDomElement element, const QString &tag)
Definition: axlFormat.h:20
void setOpacity(const double &opacity)
bool accept(const QDomNode &node)
static axlFieldReadersFactory * instance(void)
void addField(axlAbstractField *field)
Add a field to the field list of the object.
void setSize(const double &size)
void setColor(double r, double g, double b)
Class axlEllipsoid defines 3D ellipsoids.
Definition: axlEllipsoid.h:35
Class axlAbstractData defines an API for all type of axel data.
dtkAbstractDataReader * createaxlEllipsoidReader(void)
void setSemiY(axlPoint *semiY)
Change semi axes y value of this ellipsoid.