Developer documentation | Axl-2.5.1

axlFieldSpatialWriter.cpp
Go to the documentation of this file.
1 /* axlFieldSpatialWriter.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 "axlFieldSpatialWriter.h"
16 
17 #include <axlCore/axlDouble.h>
22 
23 #include <dtkCoreSupport/dtkAbstractData.h>
24 
26 #include <dtkCoreSupport/dtkAbstractDataFactory.h>
27 
28 // /////////////////////////////////////////////////////////////////
29 // axlFieldSpatialWriter
30 // /////////////////////////////////////////////////////////////////
31 
33 {
34  this->setObjectName(this->description());
35 }
36 
38 {
39 
40 }
41 
43 {
44  return "axlFieldSpatialWriter";
45 }
46 
48 {
49  return "axlFieldSpatialWriter";
50 }
51 
52 QStringList axlFieldSpatialWriter::handled(void) const
53 {
54  return QStringList() << "axlAbstractField";
55 }
56 
58 {
59  return dtkAbstractDataFactory::instance()->registerDataWriterType("axlFieldSpatialWriter", QStringList(), createaxlFieldSpatialWriter);
60 }
61 
62 bool axlFieldSpatialWriter::accept(dtkAbstractData *data)
63 {
64  axlAbstractField *spatialField = dynamic_cast<axlAbstractField *>(data);
65  if(spatialField)
66  return true;
67 
68  return false;
69 }
70 
71 bool axlFieldSpatialWriter::reject(dtkAbstractData *data)
72 {
73  return !this->accept(data);
74 }
75 
76 QDomElement axlFieldSpatialWriter::write(QDomDocument *doc, dtkAbstractData *data)
77 {
78  axlAbstractField *field = dynamic_cast<axlAbstractField *>(data);
79 
80  QDomElement fieldElement = doc->createElement("field");
81  //Three kind of field : discrete, spatial and parametric.
82  if(dynamic_cast<axlAbstractFieldSpatial *>(field))
83  fieldElement.setAttribute("type", "spatial");
84  else if(dynamic_cast<axlAbstractFieldParametric *>(field))
85  fieldElement.setAttribute("type", "parametric");
86  else
87  fieldElement.setAttribute("type", "discrete");
88 
90  fieldElement.setAttribute("name", field->name());
91 
92 
93 
94  //Support
95  int fieldSupport= field->support();
96  if(fieldSupport == 1)
97  fieldElement.setAttribute("support", "point");
98  else if (fieldSupport == 2)
99  fieldElement.setAttribute("support", "cell");
100  else
101  fieldElement.setAttribute("support", "custom");
102 
103  //Kind
104  int fieldKind= field->kind();
105  if(fieldKind == 1)
106  fieldElement.setAttribute("kind", "scalar");
107  else if (fieldKind == 2)
108  fieldElement.setAttribute("kind", "vector");
109  else
110  fieldElement.setAttribute("kind", "tensor");
111 
112  //Type
113  int fieldType= field->type();
114  if(fieldType == 1)
115  fieldElement.setAttribute("type", "int");
116  else if (fieldType == 2)
117  fieldElement.setAttribute("type", "float");
118  else
119  fieldElement.setAttribute("type", "double");
120 
121 
122  //not necessary to write field value except if it is of type field discrete
123  int size = field->size();
124  QString fieldsText;
125  if(axlAbstractFieldDiscrete *fieldD = dynamic_cast<axlAbstractFieldDiscrete *>(field) ){
126 
127  if(fieldKind == 1)
128  for(int i = 0 ; i < size; i++)
129  QTextStream(&fieldsText) << "\n" << QString::number(fieldD->scalar(i));
130  else if(fieldKind == 2)
131  for(int i = 0 ; i < size; i++)
132  QTextStream(&fieldsText) << "\n" << QString::number((fieldD->vector(i))[0]) << " "<< QString::number((fieldD->vector(i))[1]) << " "<< QString::number((fieldD->vector(i))[2]);
133 
134  }
135  QDomText fieldsDomText = doc->createTextNode(fieldsText);
136  fieldElement.appendChild(fieldsDomText);
137 
138  //precise the object name on which the field is applied. (its parent )
139  fieldElement.setAttribute("parent", dynamic_cast<axlAbstractData *>(field->parent())->name());
140 
141  //if parametric field , we need to know the fonction
142  //problem : the BSpline function is not inserted in the object manager.
143  if(axlAbstractFieldParametric *paramField = dynamic_cast<axlAbstractFieldParametric *>(field)){
144  //fieldElement.setAttribute("fonctionBSpline", paramField->getFunctionBSpline()->objectName());
145 
146  //TO DO
147  }
148 
149  //if the field has some parameters.
150  // TO DO
151  int res = dynamic_cast<QMetaObject *>(field)->indexOfMethod("setParameter");
152  fieldElement.setAttribute("res",QString::number(res));
153  if(res == -1)
154  qDebug()<< "no parameter values to write";
155  else{
156  //we must know the number of parameters.
157  int arg_count = 0;
158  }
159 
160  return fieldElement;
161 }
162 
163 
164 
165 QDomElement axlFieldSpatialWriter::elementByWriter(axlAbstractDataWriter *axl_writer, QDomDocument *doc, dtkAbstractData *data)
166 {
167  QDomElement element;
168 
169  if(!axl_writer)
170  return element;
171 
172  if(!axl_writer->accept(data))
173  return element;
174 
175  element = axl_writer->write(doc, data);
176 
177  return element;
178 }
179 
180 dtkAbstractDataWriter *createaxlFieldSpatialWriter(void)
181 {
182  return new axlFieldSpatialWriter;
183 }
184 
185 
QStringList handled(void) const
Class axlAbstractFieldParametric defines an API for parametric field.
virtual bool accept(dtkAbstractData *data)=0
QDomElement write(QDomDocument *doc, dtkAbstractData *data)
QString identifier(void) const
Class axlAbstractFieldDiscrete defines an API for arrays of numeric data.
virtual Kind kind(void)
QString description(void) const
virtual Support support(void)
Class axlAbstractField defines an API for arrays of numeric data.
dtkAbstractDataWriter * createaxlFieldSpatialWriter(void)
virtual Type type(void)
virtual QDomElement write(QDomDocument *doc, dtkAbstractData *data)=0
bool accept(dtkAbstractData *data)
bool reject(dtkAbstractData *data)