https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MeshBaseImageSampler.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12// MOOSE includes
13#include "FileRangeBuilder.h"
14#include "ConsoleStream.h"
15
16#include "libmesh/bounding_box.h"
17#include "libmesh/mesh_base.h"
18
19// VTK includes
20#ifdef LIBMESH_HAVE_VTK
21
22// Some VTK header files have extra semi-colons in them, and clang
23// loves to warn about it...
24#include "libmesh/ignore_warnings.h"
25
26// If VTK is built without an external nlohmann, then it assumes it
27// will never be compiled against another nlohmann, and it includes
28// its own copy but modified with macro tricks. We have probably
29// already included nlohmann headers, which we didn't tamper with
30// because OF COURSE NOT, but now we need to take care not to let the
31// include guards prevent them from including their copy with their
32// different namespace.
33#ifndef MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS
34#define MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS 0
35// Detect if VTK built with external nlohmann
36#ifdef __has_include
37#if __has_include("vtk_nlohmannjson.h")
38#include "vtk_nlohmannjson.h"
39#if !VTK_MODULE_USE_EXTERNAL_vtknlohmannjson
40#undef MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS
41#define MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS 1
42#endif // !VTK_MODULE_USE_EXTERNAL_vtknlohmannjson
43#endif // __has_include("vtk_nlohmannjson.h")
44#else // __has_include
45#error "Could not auto-detect whether VTK built with external nlohmann json. \
46Define MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS=1 if built with vendored nlohmann \
47, otherwise define MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS=0"
48#endif // __has_include
49#endif // MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS
50
51#if MOOSE_VTK_UNDEF_NLOHMANNJSON_HEADER_GUARDS && !defined(MOOSE_VTK_NLOHMANN_INCLUDED)
52#undef INCLUDE_NLOHMANN_JSON_FWD_HPP_
53#define MOOSE_VTK_NLOHMANN_INCLUDED
54#endif
55
56#include "vtkSmartPointer.h"
57#include "vtkPNGReader.h"
58#include "vtkTIFFReader.h"
59#include "vtkImageData.h"
60#include "vtkStringArray.h"
61#include "vtkImageNormalize.h"
62#include "vtkImageCast.h"
63#include "vtkImageShiftScale.h"
64#include "vtkImageMagnitude.h"
65#include "vtkImageFlip.h"
66
67// Compatibility with both older and new VTK
68#if LIBMESH_DETECTED_VTK_VERSION_MAJOR < 9 || \
69 (LIBMESH_DETECTED_VTK_VERSION_MAJOR == 9 && LIBMESH_DETECTED_VTK_VERSION_MINOR < 7)
70#include "vtkImageThreshold.h"
71#define mooseVtkImageBinaryThreshold vtkImageThreshold
72#else
73#include "vtkImageBinaryThreshold.h"
74#define mooseVtkImageBinaryThreshold vtkImageBinaryThreshold
75#endif
76
77// If VTK is built without an external nlohmann, then it assumes it
78// will never be compiled against another nlohmann, and it defines an
79// nlohmann macro to point to its vtknlohmann copy. In MOOSE their
80// assumption is wrong.
81#undef nlohmann
82
83#include "libmesh/restore_warnings.h"
84
85#endif
86
91{
92public:
102
103 MeshBaseImageSampler(const InputParameters & parameters);
104
109 virtual libMesh::Real sample(const libMesh::Point & p);
110
115
116protected:
120 void vtkShiftAndScale();
121
125 void vtkThreshold();
126
132 void vtkMagnitude();
133
139 void vtkFlip();
140
141private:
142#ifdef LIBMESH_HAVE_VTK
143
145 vtkSmartPointer<vtkStringArray> _files;
146
148 vtkImageData * _data;
149
151 vtkAlgorithmOutput * _algorithm;
152
154 vtkSmartPointer<vtkImageReader2> _image;
155
157 vtkSmartPointer<mooseVtkImageBinaryThreshold> _image_threshold;
158
160 vtkSmartPointer<vtkImageShiftScale> _shift_scale_filter;
161
163 vtkSmartPointer<vtkImageMagnitude> _magnitude_filter;
164
166 vtkSmartPointer<vtkImageFlip> _flip_filter;
167#endif
168
174#ifdef LIBMESH_HAVE_VTK
175 vtkSmartPointer<vtkImageFlip> imageFlip(const int & axis);
176#endif
177
180
182 std::vector<int> _dims;
183
186
188 std::vector<double> _voxel;
189
191#ifdef LIBMESH_HAVE_VTK
192 unsigned int _component;
193#endif
194
197
200
203};
A helper class for re-directing output streams to Console output objects form MooseObjects.
To be called in the validParams functions of classes that need to operate on ranges of files.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
A helper class for reading and sampling images using VTK, but with a Meshbase object.
vtkSmartPointer< mooseVtkImageBinaryThreshold > _image_threshold
Pointer to thresholding filter.
std::vector< int > _dims
Pixel dimension of image.
virtual libMesh::Real sample(const libMesh::Point &p)
Return the pixel value for the given point.
libMesh::Point _physical_dims
Physical dimensions of image.
std::vector< double > _voxel
Physical pixel size.
static InputParameters validParams()
Constructor.
vtkAlgorithmOutput * _algorithm
VTK-6 seems to work better in terms of "algorithm outputs" rather than vtkImageData pointers....
virtual void setupImageSampler(libMesh::MeshBase &mesh)
Perform initialization of image data.
vtkSmartPointer< vtkImageShiftScale > _shift_scale_filter
Pointer to the shift and scaling filter.
vtkSmartPointer< vtkImageReader2 > _image
Complete image data.
const InputParameters & _is_pars
Parameters for interface.
unsigned int _component
Component to extract.
vtkSmartPointer< vtkStringArray > _files
List of file names to extract data.
vtkSmartPointer< vtkImageMagnitude > _magnitude_filter
Pointer to the magnitude filter.
libMesh::Point _origin
Origin of image.
ConsoleStream _is_console
Create a console stream object for this helper class.
void vtkThreshold()
Perform thresholding.
vtkImageData * _data
Complete image data.
vtkSmartPointer< vtkImageFlip > _flip_filter
Pointers to image flipping filter. May be used for x, y, or z.
void vtkMagnitude()
Convert the image to greyscale.
void vtkFlip()
Perform image flipping.
vtkSmartPointer< vtkImageFlip > imageFlip(const int &axis)
Helper method for flipping image.
void vtkShiftAndScale()
Apply image re-scaling using the vtkImageShiftAndRescale object.
libMesh::BoundingBox _bounding_box
Bounding box for testing points.
MeshBase & mesh
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real