Developer documentation | Axl-2.5.1

axlFieldDiscreteReader.cpp
Go to the documentation of this file.
1 /* axlFieldDiscreteReader.cpp ---
2  *
3  * Author: Anais Ducoffe
4  * Copyright (C) 2013 - Anais Ducoffe, Inria.
5  */
6 
7 /* Commentary:
8  *
9  */
10 
11 /* Change log:
12  *
13  */
14 
15 #include "axlFieldDiscreteReader.h"
16 #include <axlCore/axlReader.h>
17 
19 #include "axlFieldDiscrete.h"
20 
21 #include <dtkCoreSupport/dtkAbstractData.h>
22 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
23 #include <dtkCoreSupport/dtkAbstractProcessFactory.h>
24 
25 // /////////////////////////////////////////////////////////////////
26 // axlFieldDiscreteReader
27 // /////////////////////////////////////////////////////////////////
28 
30 {
31  this->setObjectName(this->description());
32 }
33 
35 {
36 
37 }
38 
40 {
41  return "axlFieldDiscreteReader";
42 }
43 
45 {
46  return "axlFieldDiscreteReader";
47 }
48 
49 QStringList axlFieldDiscreteReader::handled(void) const
50 {
51  return QStringList() << "axlFieldDiscrete";
52 }
53 
55 {
56  return dtkAbstractDataFactory::instance()->registerDataReaderType("axlFieldDiscreteReader", QStringList(), createaxlFieldDiscreteReader);
57 }
58 
59 bool axlFieldDiscreteReader::accept(const QDomNode& node)
60 {
61  QDomElement element = node.toElement();
62 
63  if(element.tagName() != "field")
64  return false;
65 
66  return true;
67 }
68 
69 bool axlFieldDiscreteReader::reject(const QDomNode& node)
70 {
71  return !this->accept(node);
72 }
73 
74 
75 //read only one special field :axlFieldDiscrete.
77 {
78 
79  QDomElement element = node.toElement();
80  axlFieldDiscrete *field = NULL;
81 
82  // field type : the type corresponds to the identifier, use factory to initialize field.
83  // QString type = element.attribute("type");
84  // if(!type.isEmpty())
85  // {
86  // field = dynamic_cast<axlFieldDiscrete *>(dtkAbstractDataFactory::instance()->create(type));
87  // }
88 
90  QString count = element.attribute("count");
91  int countNumb = 0;
92  if(!count.isEmpty()){
93  countNumb = count.toInt();
94  //field->setSize(count.toInt());
95  }
96 
98  QString dimension = element.attribute("dimension");
100  if(!dimension.isEmpty()){
101  int dim = dimension.toInt();
102  if(dim == 1){
103  //field->setKind(axlFieldDiscrete::Scalar);
105  }else if(dim == 3){
106  //field->setKind(axlFieldDiscrete::Vector);
108  }else{
109  //field->setKind(axlFieldDiscrete::Tensor);
111  }
112  }
113 
115  QString support = element.attribute("support");
117  if(!support.isEmpty()){
118  if(support == "point"){
119  //field->setSupport(axlFieldDiscrete::Point);
120  supportName = axlFieldDiscrete::Point;
121  }else if(support == "cell"){
122  //field->setSupport(axlFieldDiscrete::Cell);
123  supportName = axlFieldDiscrete::Cell;
124  }else{
125  //field->setSupport(axlFieldDiscrete::Custom);
126  supportName = axlFieldDiscrete::Custom;
127  }
128  }
129 
131  QString name = element.attribute("name");
132  if(name.isEmpty()){
133  name = "axlFieldDiscrete";
134  }
135 
136 
137  field = new axlFieldDiscrete(name,axlFieldDiscrete::Double,kind,supportName, countNumb);
138  field->setSize(countNumb);
139  field->setKind(kind);
140  field->setSupport(supportName);
142 
144  double s = 0.0;
145  double vx = 0.0;
146  double vy = 0.0;
147  double vz = 0.0;
148  double v1 = 0.0;
149  double v2 = 0.0;
150  double v3 = 0.0;
151  double v4 = 0.0;
152  double v5 = 0.0;
153  double v6 = 0.0;
154  double v7 = 0.0;
155  double v8 = 0.0;
156  double v9 = 0.0;
157  QString *text_fields;
158  int size = field->size();
159  text_fields = new QString(element.text());
160 
161  QTextStream in_fields(text_fields);
162 
163  if(field->kind()== axlFieldDiscrete::Scalar)
164  {
165  for(int i = 0 ; i < size ; i++)
166  {
167  in_fields.skipWhiteSpace();
168  in_fields >> s;
169  field->setScalar(i, s);
170  }
171  }
172  else if(field->kind()== axlFieldDiscrete::Vector)
173  {
174  for(int i = 0 ; i < size ; i++)
175  {
176  in_fields.skipWhiteSpace();
177  in_fields >> vx;
178  in_fields.skipWhiteSpace();
179  in_fields >> vy;
180  in_fields.skipWhiteSpace();
181  in_fields >> vz;
182  field->setVector(i, vx, vy, vz);
183  }
184  }else{
185 
186  for(int i = 0 ; i < size ; i++)
187  {
188  in_fields.skipWhiteSpace();
189  in_fields >> v1;
190  in_fields.skipWhiteSpace();
191  in_fields >> v2;
192  in_fields.skipWhiteSpace();
193  in_fields >> v3;
194  in_fields.skipWhiteSpace();
195  in_fields >> v4;
196  in_fields.skipWhiteSpace();
197  in_fields >> v5;
198  in_fields.skipWhiteSpace();
199  in_fields >> v6;
200  in_fields.skipWhiteSpace();
201  in_fields >> v7;
202  in_fields.skipWhiteSpace();
203  in_fields >> v8;
204  in_fields.skipWhiteSpace();
205  in_fields >> v9;
206  field->setTensor(i, v1, v2, v3, v4, v5, v6, v7, v8, v9);
207  }
208  }
209 
210  field->update();
211  delete text_fields;
212  return field;
213 
214 }
215 
216 //dtkAbstractData *axlFieldDiscreteReader::dataByReader(axlAbstractDataReader *axl_reader, const QDomNode& node)
217 //{
218 // if(!axl_reader)
219 // return NULL;
220 
221 // if(!axl_reader->accept(node))
222 // return NULL;
223 
224 // axl_reader->dtkAbstractDataReader::read(this->file());
225 
226 // if(dtkAbstractData *data = axl_reader->read(node))
227 // return data;
228 
229 
230 // return NULL;
231 //}
232 
233 
234 
235 dtkAbstractDataReader *createaxlFieldDiscreteReader(void)
236 {
237  return new axlFieldDiscreteReader;
238 }
virtual int size(void)
virtual void update(void)
QStringList handled(void) const
virtual Kind kind(void)
virtual void setVector(int index, double v1, double v2, double v3)
bool reject(const QDomNode &node)
virtual void setScalar(int index, double v1)
axlAbstractData * read(const QDomNode &node)
virtual void setSize(int size)
dtkAbstractDataReader * createaxlFieldDiscreteReader(void)
Class axlFieldDiscrete defines an API for arrays of numeric data.
virtual void setType(Type type)
Sets the type of the field which can be either int, float or double.
virtual void setSupport(Support support)
QString identifier(void) const
virtual void setTensor(int index, double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8, double v9)
bool accept(const QDomNode &node)
virtual void setKind(Kind kind)
Sets the kind of the field which can be either scalar, vector or tensor.
QString description(void) const
Class axlAbstractData defines an API for all type of axel data.