3#include <vtkAbstractArray.h>
4#include <vtkCellArray.h>
5#include <vtkDoubleArray.h>
6#include <vtkFieldData.h>
7#include <vtkIdTypeArray.h>
10#include <vtkPolyData.h>
11#include <vtkSmartPointer.h>
12#include <vtkStringArray.h>
13#include <vtkUnstructuredGrid.h>
15#ifdef TTK_ENABLE_MPI_TIME
19 vtkFieldData *fieldData,
21 std::string &errorMsg) {
22 std::string varName = iString;
24 bool varIndexDefined =
false;
27 size_t indexDelimiter0 = iString.find(
'[');
28 size_t indexDelimiter1 = iString.find(
']');
29 if(indexDelimiter0 != std::string::npos
30 && indexDelimiter1 != std::string::npos) {
31 if(indexDelimiter0 > indexDelimiter1
32 || iString.find(
'[', indexDelimiter0 + 1) != std::string::npos
33 || iString.find(
'}', indexDelimiter1 + 1) != std::string::npos) {
34 errorMsg =
"Invalid Syntax:\n" + iString;
38 varName = iString.substr(0, indexDelimiter0);
39 varIndex = stoi(iString.substr(
40 indexDelimiter0 + 1, indexDelimiter1 - indexDelimiter0 - 1));
41 varIndexDefined =
true;
45 auto column = fieldData->GetAbstractArray(varName.data());
46 if(column ==
nullptr) {
47 errorMsg =
"FieldData does not contain array '" + varName +
"'";
51 size_t n = column->GetNumberOfTuples();
52 size_t m = column->GetNumberOfComponents();
55 if(!varIndexDefined) {
57 oString = column->GetVariantValue(0).ToString();
58 for(
int i = 1; i < s; i++)
59 oString +=
"," + column->GetVariantValue(i).ToString();
62 if(varIndex < 0 || varIndex >= s) {
63 errorMsg =
"Index " + std::to_string(varIndex) +
"/" + std::to_string(s)
64 +
" for FieldData Array '" + varName +
"' out of range";
67 oString = column->GetVariantValue(varIndex).ToString();
74 vtkFieldData *fieldData,
76 std::string &errorMsg) {
79 while(oString.find(
'{') != std::string::npos
80 && oString.find(
'}') != std::string::npos) {
81 size_t o = oString.find(
'{');
82 size_t c = oString.find(
'}');
87 size_t oNext = oString.find(
'{', o + 1);
88 while(oNext != std::string::npos && oNext < c) {
90 oNext = oString.find(
'{', o + 1);
96 std::string var = oString.substr(o + 1, c - 1 - o);
102 oString = oString.substr(0, o).append(rVar).append(
103 oString.substr(c + 1, oString.length() - c - 1));
106 if(oString.find(
'{') != std::string::npos
107 || oString.find(
'}') != std::string::npos) {
108 errorMsg =
"Invalid Syntax:\n" + iString;
116 std::vector<std::string> &v) {
121 size_t j = iString.find(
',');
122 while(j != std::string::npos) {
123 v.push_back(iString.substr(i, j - i));
125 j = iString.find(
',', i);
127 if(iString.length() > i)
128 v.push_back(iString.substr(i, iString.length() - i));
134 std::vector<double> &v) {
135 std::vector<std::string> stringVector;
139 size_t n = stringVector.size();
142 for(
size_t i = 0; i < n; i++)
143 v[i] = stod(stringVector[i]);
153 size_t firstComma = line.find(
',', 0);
155 if(firstComma == std::string::npos)
158 std::string arrayName = line.substr(0, firstComma);
160 std::vector<std::string> valuesAsString;
162 line.substr(firstComma + 1, std::string::npos), valuesAsString);
163 size_t nValues = valuesAsString.size();
168 bool isNumeric =
true;
170 std::vector<double> valuesAsDouble(nValues);
172 for(
size_t i = 0; i < nValues; i++)
173 valuesAsDouble[i] = std::stod(valuesAsString[i]);
174 }
catch(
const std::invalid_argument &) {
176 }
catch(
const std::out_of_range &) {
182 array->SetName(arrayName.data());
183 array->SetNumberOfValues(nValues);
184 for(
size_t i = 0; i < nValues; i++)
185 array->SetValue(i, valuesAsDouble[i]);
189 array->SetName(arrayName.data());
190 array->SetNumberOfValues(nValues);
191 for(
size_t i = 0; i < nValues; i++)
192 array->SetValue(i, valuesAsString[i]);
199 size_t firstComma = line.find(
',', 0);
201 if(firstComma == std::string::npos)
204 std::string arrayName = line.substr(0, firstComma);
205 std::string valuesAsString = line.substr(firstComma + 1, std::string::npos);
207 std::vector<double> values;
209 size_t n = values.size();
212 array->SetName(arrayName.data());
213 array->SetNumberOfComponents(1);
214 array->SetNumberOfTuples(n);
215 auto arrayData =
reinterpret_cast<double *
>(
GetVoidPointer(array));
216 for(
size_t i = 0; i < n; i++)
217 arrayData[i] = values[i];
226 void *outPtr =
nullptr;
230 switch(array->GetDataType()) {
232 auto *aosArray = vtkAOSDataArrayTemplate<VTK_TT>::FastDownCast(array);
233 if(aosArray) { outPtr = aosArray->GetVoidPointer(start); });
246 slicedArray->SetName(array->GetName());
247 slicedArray->SetNumberOfComponents(array->GetNumberOfComponents());
248 slicedArray->SetNumberOfTuples(1);
249 slicedArray->SetTuple(0, idx, array);
255 vtkIdType numValues) {
256 void *outPtr =
nullptr;
257 switch(array->GetDataType()) {
258 vtkTemplateMacro(
auto *aosArray
259 = vtkAOSDataArrayTemplate<VTK_TT>::FastDownCast(array);
261 outPtr = aosArray->WriteVoidPointer(valueIdx, numValues);
269 vtkIdType numValues) {
270 void *outPtr =
nullptr;
271 switch(array->GetDataType()) {
273 auto *aosArray = vtkAOSDataArrayTemplate<VTK_TT>::FastDownCast(array);
274 if(aosArray) { outPtr = aosArray->WritePointer(valueIdx, numValues); });
283 switch(array->GetDataType()) {
285 auto *aosArray = vtkAOSDataArrayTemplate<VTK_TT>::FastDownCast(array);
286 if(aosArray) { aosArray->SetVoidArray(data, size, save); }
else {
287 std::cerr <<
"SetVoidArray on incompatible vtkDataArray:" << endl;
288 array->Print(std::cerr);
295 vtkCellArray *cellArray) {
297 vtkNew<vtkIdList> verts;
298 for(vtkIdType cid = 0; cid < ncells; cid++) {
299 const vtkIdType nbVerts = cells[curPos];
300 verts->SetNumberOfIds(nbVerts);
302 for(vtkIdType v = 0; v < nbVerts; v++) {
303 verts->SetId(v, cells[curPos]);
306 cellArray->InsertNextCell(verts);
311 vtkIdType
const *cells_off,
313 vtkCellArray *cellArray) {
315 vtkNew<vtkIdList> verts;
316 for(vtkIdType cid = 0; cid < ncells; cid++) {
317 const vtkIdType nbVerts = cells_off[cid + 1] - cells_off[cid];
318 verts->SetNumberOfIds(nbVerts);
319 for(vtkIdType v = 0; v < nbVerts; v++) {
320 verts->SetId(v, cells_co[curPos]);
323 cellArray->InsertNextCell(verts);
328 vtkPoints *
const points) {
330 if(dataSet ==
nullptr || points ==
nullptr) {
334 if(!dataSet->IsA(
"vtkUnstructuredGrid") && !dataSet->IsA(
"vtkPolyData")) {
338 const size_t nPoints = points->GetNumberOfPoints();
343 vtkNew<vtkCellArray> cells{};
344 cells->InsertNextCell(nPoints);
345 for(
size_t i = 0; i < nPoints; ++i) {
346 cells->InsertCellPoint(i);
349 if(dataSet->IsA(
"vtkUnstructuredGrid")) {
350 const auto vtu{vtkUnstructuredGrid::SafeDownCast(dataSet)};
352 vtu->SetPoints(points);
353 vtu->SetCells(VTK_POLY_VERTEX, cells);
355 }
else if(dataSet->IsA(
"vtkPolyData")) {
356 const auto vtp{vtkPolyData::SafeDownCast(dataSet)};
358 vtp->SetPoints(points);
359 vtp->SetVerts(cells);
static int replaceVariables(const std::string &iString, vtkFieldData *fieldData, std::string &oString, std::string &errorMsg)
static void * GetVoidPointer(vtkDataArray *array, vtkIdType start=0)
static int stringListToDoubleVector(const std::string &iString, std::vector< double > &v)
static vtkSmartPointer< vtkAbstractArray > SliceArray(vtkAbstractArray *array, vtkIdType idx)
static void FillCellArrayFromSingle(vtkIdType const *cells, vtkIdType ncells, vtkCellArray *cellArray)
static void * WritePointer(vtkDataArray *array, vtkIdType start, vtkIdType numValues)
static int replaceVariable(const std::string &iString, vtkFieldData *fieldData, std::string &oString, std::string &errorMsg)
static int CellVertexFromPoints(vtkDataSet *const dataSet, vtkPoints *const points)
static vtkSmartPointer< vtkAbstractArray > csvToVtkArray(const std::string &line)
static vtkSmartPointer< vtkDoubleArray > csvToDoubleArray(const std::string &line)
static void FillCellArrayFromDual(vtkIdType const *cells_co, vtkIdType const *cells_off, vtkIdType ncells, vtkCellArray *cellArray)
static void SetVoidArray(vtkDataArray *array, void *data, vtkIdType size, int save)
static void * WriteVoidPointer(vtkDataArray *array, vtkIdType start, vtkIdType numValues)
static int stringListToVector(const std::string &iString, std::vector< std::string > &v)