ParaView
vtkPVChangeOfBasisHelper.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ParaView
4  Module: vtkPVChangeOfBasisHelper.h
5 
6  Copyright (c) Kitware, Inc.
7  All rights reserved.
8  See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
22 #ifndef vtkPVChangeOfBasisHelper_h
23 #define vtkPVChangeOfBasisHelper_h
24 
25 #include "vtkObject.h"
26 #include "vtkPVVTKExtensionsCoreModule.h" // needed for export macro
27 
28 #include "vtkDataObject.h"
29 #include "vtkDoubleArray.h"
30 #include "vtkFieldData.h"
31 #include "vtkMatrix4x4.h"
32 #include "vtkNew.h"
33 #include "vtkSmartPointer.h"
34 #include "vtkStringArray.h"
35 #include "vtkVector.h"
36 
37 #include <algorithm>
38 
40 {
41 public:
43 
46  static vtkSmartPointer<vtkMatrix4x4> GetChangeOfBasisMatrix(
47  const vtkVector3d& u, const vtkVector3d& v, const vtkVector3d& w)
48  {
49  vtkSmartPointer<vtkMatrix4x4> cobMatrix = vtkSmartPointer<vtkMatrix4x4>::New();
50  cobMatrix->Identity();
51  std::copy(u.GetData(), u.GetData() + 3, cobMatrix->Element[0]);
52  std::copy(v.GetData(), v.GetData() + 3, cobMatrix->Element[1]);
53  std::copy(w.GetData(), w.GetData() + 3, cobMatrix->Element[2]);
54  cobMatrix->Transpose();
55  return cobMatrix;
56  }
58 
59  static bool GetBasisVectors(vtkMatrix4x4* matrix, vtkVector3d& u, vtkVector3d& v, vtkVector3d& w)
60  {
61  if (matrix)
62  {
63  double xaxis[4] = { 1, 0, 0, 1 };
64  double yaxis[4] = { 0, 1, 0, 1 };
65  double zaxis[4] = { 0, 0, 1, 1 };
66  matrix->MultiplyPoint(xaxis, xaxis);
67  matrix->MultiplyPoint(yaxis, yaxis);
68  matrix->MultiplyPoint(zaxis, zaxis);
69  for (int cc = 0; cc < 3; cc++)
70  {
71  xaxis[cc] /= xaxis[3];
72  yaxis[cc] /= yaxis[3];
73  zaxis[cc] /= zaxis[3];
74  }
75  u = vtkVector3d(xaxis);
76  v = vtkVector3d(yaxis);
77  w = vtkVector3d(zaxis);
78  return true;
79  }
80  else
81  {
82  u = vtkVector3d(1, 0, 0);
83  v = vtkVector3d(0, 1, 0);
84  w = vtkVector3d(0, 0, 1);
85  }
86  return false;
87  }
88 
90 
93  static bool AddChangeOfBasisMatrixToFieldData(vtkDataObject* dataObject, vtkMatrix4x4* matrix)
94  {
95  if (dataObject && matrix)
96  {
97  vtkNew<vtkDoubleArray> cobArray;
98  cobArray->SetName("ChangeOfBasisMatrix");
99  cobArray->SetNumberOfComponents(16);
100  cobArray->SetNumberOfTuples(1);
101  std::copy(&matrix->Element[0][0], (&matrix->Element[0][0]) + 16, cobArray->GetPointer(0));
102  dataObject->GetFieldData()->AddArray(cobArray.GetPointer());
103  return true;
104  }
105  return false;
106  }
108 
109  static vtkSmartPointer<vtkMatrix4x4> GetChangeOfBasisMatrix(vtkDataObject* dataObject)
110  {
111  if (dataObject && dataObject->GetFieldData() &&
112  dataObject->GetFieldData()->GetArray("ChangeOfBasisMatrix"))
113  {
114  vtkDataArray* array = dataObject->GetFieldData()->GetArray("ChangeOfBasisMatrix");
115  if (array && array->GetNumberOfComponents() == 16 && array->GetNumberOfTuples() == 1)
116  {
117  vtkSmartPointer<vtkMatrix4x4> mat = vtkSmartPointer<vtkMatrix4x4>::New();
118  array->GetTuple(0, &mat->Element[0][0]);
119  return mat;
120  }
121  }
122  return vtkSmartPointer<vtkMatrix4x4>();
123  }
124 
126 
129  static bool AddBasisNames(
130  vtkDataObject* dataObject, const char* utitle, const char* vtitle, const char* wtitle)
131  {
132  if (!dataObject)
133  {
134  return false;
135  }
136  if (utitle)
137  {
138  vtkNew<vtkStringArray> uAxisTitle;
139  uAxisTitle->SetName("AxisTitleForX");
140  uAxisTitle->SetNumberOfComponents(1);
141  uAxisTitle->SetNumberOfTuples(1);
142  uAxisTitle->SetValue(0, utitle);
143  uAxisTitle->SetComponentName(0, utitle);
144  dataObject->GetFieldData()->AddArray(uAxisTitle.GetPointer());
145  }
146  if (vtitle)
147  {
148  vtkNew<vtkStringArray> vAxisTitle;
149  vAxisTitle->SetName("AxisTitleForY");
150  vAxisTitle->SetNumberOfComponents(1);
151  vAxisTitle->SetNumberOfTuples(1);
152  vAxisTitle->SetValue(0, vtitle);
153  vAxisTitle->SetComponentName(0, vtitle);
154  dataObject->GetFieldData()->AddArray(vAxisTitle.GetPointer());
155  }
156  if (wtitle)
157  {
158  vtkNew<vtkStringArray> wAxisTitle;
159  wAxisTitle->SetName("AxisTitleForZ");
160  wAxisTitle->SetNumberOfComponents(1);
161  wAxisTitle->SetNumberOfTuples(1);
162  wAxisTitle->SetValue(0, wtitle);
163  wAxisTitle->SetComponentName(0, wtitle);
164  dataObject->GetFieldData()->AddArray(wAxisTitle.GetPointer());
165  }
166  return (utitle || vtitle || wtitle);
167  }
169 
170  static void GetBasisName(
171  vtkDataObject* dataObject, const char*& utitle, const char*& vtitle, const char*& wtitle)
172  {
173  utitle = vtitle = wtitle = NULL;
174  if (!dataObject || !dataObject->GetFieldData())
175  {
176  return;
177  }
178  if (vtkStringArray* uarray = vtkStringArray::SafeDownCast(
179  dataObject->GetFieldData()->GetAbstractArray("AxisTitleForX")))
180  {
181  if (uarray->GetNumberOfValues() == 1)
182  {
183  utitle = uarray->GetValue(0).c_str();
184  }
185  }
186  if (vtkStringArray* varray = vtkStringArray::SafeDownCast(
187  dataObject->GetFieldData()->GetAbstractArray("AxisTitleForY")))
188  {
189  if (varray->GetNumberOfValues() == 1)
190  {
191  vtitle = varray->GetValue(0).c_str();
192  }
193  }
194  if (vtkStringArray* warray = vtkStringArray::SafeDownCast(
195  dataObject->GetFieldData()->GetAbstractArray("AxisTitleForZ")))
196  {
197  if (warray->GetNumberOfValues() == 1)
198  {
199  wtitle = warray->GetValue(0).c_str();
200  }
201  }
202  }
203 
205 
208  static bool AddBoundingBoxInBasis(vtkDataObject* dataObject, const double bbox[6])
209  {
210  if (dataObject)
211  {
212  vtkNew<vtkDoubleArray> bounds;
213  bounds->SetName("BoundingBoxInModelCoordinates");
214  bounds->SetNumberOfComponents(6);
215  bounds->SetNumberOfTuples(1);
216  std::copy(bbox, bbox + 6, bounds->GetPointer(0));
217  dataObject->GetFieldData()->AddArray(bounds.GetPointer());
218  return true;
219  }
220  return false;
221  }
223 
224  static bool GetBoundingBoxInBasis(vtkDataObject* dataObject, double bbox[6])
225  {
226  if (dataObject && dataObject->GetFieldData() &&
227  dataObject->GetFieldData()->GetArray("BoundingBoxInModelCoordinates"))
228  {
229  vtkDataArray* array = dataObject->GetFieldData()->GetArray("BoundingBoxInModelCoordinates");
230  if (array && array->GetNumberOfTuples() == 1 && array->GetNumberOfComponents() == 6)
231  {
232  array->GetTuple(0, bbox);
233  return true;
234  }
235  }
236  return false;
237  }
238 };
239 
240 #endif
241 //****************************************************************************
242 // VTK-HeaderTest-Exclude: vtkPVChangeOfBasisHelper.h
static bool AddBoundingBoxInBasis(vtkDataObject *dataObject, const double bbox[6])
Add bounding box in model space.
static bool GetBasisVectors(vtkMatrix4x4 *matrix, vtkVector3d &u, vtkVector3d &v, vtkVector3d &w)
vtkPVChangeOfBasisHelper is designed for ORNL-SNS use-cases where we needed to add support for differ...
static void GetBasisName(vtkDataObject *dataObject, const char *&utitle, const char *&vtitle, const char *&wtitle)
static vtkSmartPointer< vtkMatrix4x4 > GetChangeOfBasisMatrix(vtkDataObject *dataObject)
static vtkSmartPointer< vtkMatrix4x4 > GetChangeOfBasisMatrix(const vtkVector3d &u, const vtkVector3d &v, const vtkVector3d &w)
Given a set of basis vectors, returns the change-of-basis matrix.
static bool GetBoundingBoxInBasis(vtkDataObject *dataObject, double bbox[6])
static bool AddChangeOfBasisMatrixToFieldData(vtkDataObject *dataObject, vtkMatrix4x4 *matrix)
Add change-of-basis matrix to the field data for the given dataobject.
static bool AddBasisNames(vtkDataObject *dataObject, const char *utitle, const char *vtitle, const char *wtitle)
Add basis titles to field data.