22 #ifndef vtkPVChangeOfBasisHelper_h 23 #define vtkPVChangeOfBasisHelper_h 25 #include "vtkObject.h" 26 #include "vtkPVVTKExtensionsCoreModule.h" 28 #include "vtkDataObject.h" 29 #include "vtkDoubleArray.h" 30 #include "vtkFieldData.h" 31 #include "vtkMatrix4x4.h" 33 #include "vtkSmartPointer.h" 34 #include "vtkStringArray.h" 35 #include "vtkVector.h" 47 const vtkVector3d& u,
const vtkVector3d& v,
const vtkVector3d& w)
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();
59 static bool GetBasisVectors(vtkMatrix4x4* matrix, vtkVector3d& u, vtkVector3d& v, vtkVector3d& w)
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++)
71 xaxis[cc] /= xaxis[3];
72 yaxis[cc] /= yaxis[3];
73 zaxis[cc] /= zaxis[3];
75 u = vtkVector3d(xaxis);
76 v = vtkVector3d(yaxis);
77 w = vtkVector3d(zaxis);
82 u = vtkVector3d(1, 0, 0);
83 v = vtkVector3d(0, 1, 0);
84 w = vtkVector3d(0, 0, 1);
95 if (dataObject && matrix)
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());
111 if (dataObject && dataObject->GetFieldData() &&
112 dataObject->GetFieldData()->GetArray(
"ChangeOfBasisMatrix"))
114 vtkDataArray* array = dataObject->GetFieldData()->GetArray(
"ChangeOfBasisMatrix");
115 if (array && array->GetNumberOfComponents() == 16 && array->GetNumberOfTuples() == 1)
117 vtkSmartPointer<vtkMatrix4x4> mat = vtkSmartPointer<vtkMatrix4x4>::New();
118 array->GetTuple(0, &mat->Element[0][0]);
122 return vtkSmartPointer<vtkMatrix4x4>();
130 vtkDataObject* dataObject,
const char* utitle,
const char* vtitle,
const char* wtitle)
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());
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());
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());
166 return (utitle || vtitle || wtitle);
171 vtkDataObject* dataObject,
const char*& utitle,
const char*& vtitle,
const char*& wtitle)
173 utitle = vtitle = wtitle = NULL;
174 if (!dataObject || !dataObject->GetFieldData())
178 if (vtkStringArray* uarray = vtkStringArray::SafeDownCast(
179 dataObject->GetFieldData()->GetAbstractArray(
"AxisTitleForX")))
181 if (uarray->GetNumberOfValues() == 1)
183 utitle = uarray->GetValue(0).c_str();
186 if (vtkStringArray* varray = vtkStringArray::SafeDownCast(
187 dataObject->GetFieldData()->GetAbstractArray(
"AxisTitleForY")))
189 if (varray->GetNumberOfValues() == 1)
191 vtitle = varray->GetValue(0).c_str();
194 if (vtkStringArray* warray = vtkStringArray::SafeDownCast(
195 dataObject->GetFieldData()->GetAbstractArray(
"AxisTitleForZ")))
197 if (warray->GetNumberOfValues() == 1)
199 wtitle = warray->GetValue(0).c_str();
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());
226 if (dataObject && dataObject->GetFieldData() &&
227 dataObject->GetFieldData()->GetArray(
"BoundingBoxInModelCoordinates"))
229 vtkDataArray* array = dataObject->GetFieldData()->GetArray(
"BoundingBoxInModelCoordinates");
230 if (array && array->GetNumberOfTuples() == 1 && array->GetNumberOfComponents() == 6)
232 array->GetTuple(0, bbox);
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.