comac_desk_app/PostProcessing/WidgetCutter.h

245 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef PST_WIDGETCUTTER_H
#define PST_WIDGETCUTTER_H
#include <vtkSmartPointer.h>
#include <vtkCommand.h>
#include <vtkPlaneWidget.h>
#include <vtkBoxWidget.h>
#include <vector>
#include <QString>
#include <array>
class vtkDataArray;
class vtkDoubleArray;
class vtkCutter;
class vtkActor;
class vtkPlane;
class vtkPlanes;
class vtkDataSet;
class vtkPolyDataMapper;
class vtkProperty;
class vtkLookupTable;
class vtkScalarBarActor;
class vtkRenderWindowInteractor;
class vtkScalarBarWidget;
/**
* @class PlaneCutter
* @brief 设置一个cutter来切割标量场(只显示切面数据,不更改源数据)。
* 目前包括box和plane两种widget。按i键可以激活/取消激活widget。
* 默认激活plane. 目前一个类只能实现一个切片即plane和box都生成同一个actor.
*/
namespace pst
{
class vtkWidgetCall : public vtkCommand
{
public:
static vtkWidgetCall* New()
{
return new vtkWidgetCall;
}
public:
enum class CallbackWidgetType
{
BOX,
PLANE,
};
public:
void SetCallbackWidgetType(CallbackWidgetType type)
{
m_currentWidgetType = type;
}
virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData)
{
switch (m_currentWidgetType)
{
case CallbackWidgetType::BOX:
{
vtkBoxWidget* widget = vtkBoxWidget::SafeDownCast(caller);
widget->GetPlanes(m_planes);
break;
}
case CallbackWidgetType::PLANE:
{
vtkPlaneWidget* pWidget = vtkPlaneWidget::SafeDownCast(caller);
pWidget->GetPlane(m_singlePlane);
break;
}
default:
break;
}
}
public:
CallbackWidgetType m_currentWidgetType;
vtkPlane* m_singlePlane;
vtkPlanes* m_planes;
};
class WidgetCutter
{
public:
WidgetCutter();
public:
enum class WidgetType
{
BOX,
PLANE,
};
//平面cutter 平面法向朝向
enum class PlaneNormalDirection
{
X,
Y,
Z,
};
enum class PlaneRepresentation
{
// OUTLINE,
WIREFRAME,
SURFACE,
POINTS,
};
enum class StructureType
{
POINTS,
CELLS
};
struct ArrayInformation
{
int arrayIndex;
QString arrayName;
int arrayComponent;
};
public:
void SetInteractor(vtkRenderWindowInteractor* iren);
void SetInputData(vtkDataSet* dataSet);
//获取输入数据的属性表points下标及其对应的数据名称
std::vector<ArrayInformation> GetPointsArrayIndexAndNames();
//获取输入数据属性表cells下标及其对应的数据名称
std::vector<ArrayInformation> GetCellsArrayIndexAndNames();
bool SetActiveScalarAttribute(int index, const StructureType type,
const int compIndex = -1);
//默认使用plane widget
void SetWidgetType(WidgetType type);
//plane widget控制方法
void SetPlaneNormalDirection(PlaneNormalDirection direction);
vtkProperty* GetWidgetPlaneProperty();
vtkProperty* GetWidgetHandelProperty();
vtkPlaneWidget* GetPlaneWidget();
vtkBoxWidget* GetBoxWidget();
void SetRepresentationType(PlaneRepresentation type);
void SetCenter(double x[3]);
void TurnAllWidgetOff();
void TurnWidgetOn();
void Update();
void refreshWidget();
vtkCutter* GetCutter();
vtkPolyDataMapper* GetMapper();
vtkActor* GetCutterActor();
//lookupTable
void SetScalarBarRange(const double min, const double max);
bool SetScalarBarRangeToAuto();
void SetLookupTable(vtkLookupTable* lookupTable);
vtkLookupTable* GetLookupTable();
//scalarBar
void SetScalarBarTitle(const std::string& title);
void SetScalarBarNumberOfLabel(const int num);
void SetScalarBarDisplayPosition(const int x, const int y);
vtkScalarBarActor* GetScalarBar();
//data outline actor
void SetDataOutlineActorColor(const double r, const double g, const double b);
vtkActor* GetDataOutlineActor();
//保存cutter的数据时只保留指定的场数据
//useOrigianl为真时直接保留和原数据对应的所有场此时后面两个参数不起作用
//当useOrigianl为假时使用用户指定的场
void SelectFieldsToSaveForCutter(bool useOrigianl,
const std::vector<ArrayInformation>& selectedPointsFiled = std::vector<ArrayInformation>(),
const std::vector<ArrayInformation>& selectedCellsFiled = std::vector<ArrayInformation>());
//直接将裁剪数据写入本地
void WriteTheCutterData(const std::string& fileName);
//重置widget位置为图像中心
void ResetCurrentWidgetPositon();
private:
void InitPipeLine();
void InitLookupTable();
void GenerateDataOutlineBox();
//提取每个属性的单个分量,最初设计目的是 用于将含有多个成分的属性(如三个组分的数据)设置为标量场属性时,
//提取其中一个单独的组分作为显示。component为-1时返回magnitude。
bool GetSingleComponent(vtkDataArray* array, const int component, vtkDoubleArray* returnArray);
//获取属性表points单元下标及其对应的数据名称
std::vector<ArrayInformation> GetPointsArrayIndexAndNames(vtkDataSet* data);
//获取属性表cells单元下标及其对应的数据名称
std::vector<ArrayInformation> GetCellsArrayIndexAndNames(vtkDataSet* data);
void SelectArrayFromCutterData(const std::vector<ArrayInformation>& selectedPointsFiled,
const std::vector<ArrayInformation>& selectedCellsFiled);
private:
// vtkDataSet* m_inputData{nullptr};
//输入数据,会随选择的矢量分量更改其内容
vtkSmartPointer<vtkDataSet> m_inputData;
//原输入数据备份,用作获取切片数据用
vtkSmartPointer<vtkDataSet> m_inputDataOriginal;
vtkSmartPointer<vtkPlaneWidget> m_planeWidget;
vtkSmartPointer<vtkPlane> m_plane;
vtkSmartPointer<vtkBoxWidget> m_boxWidget;
vtkSmartPointer<vtkPlanes> m_planes;
vtkSmartPointer<vtkCutter> m_cutter;
vtkSmartPointer<vtkPolyDataMapper> m_selectedDataMapper;
vtkSmartPointer<vtkActor> m_cutterDataActor;
vtkSmartPointer<vtkWidgetCall> m_cutterWidgetCall;
vtkSmartPointer<vtkLookupTable> m_lookupTable;
vtkSmartPointer<vtkScalarBarWidget> m_scalarBarWidget;
vtkSmartPointer<vtkScalarBarActor> m_scalarBarActor;
vtkSmartPointer<vtkActor> m_dataOutlineActor;
vtkSmartPointer<vtkRenderWindowInteractor> m_interactor;
vtkSmartPointer<vtkPolyData> m_cutterDataToSave;
WidgetType m_currentWidgetType;
int m_currentAddedPointArrayIndex; //设置标量场属性当多组分array的一个分类被添加后下次设置时用于移除。
int m_currentAddedCellArrayIndex; //设置标量场属性当多组分array的一个分类被添加后下次设置时用于移除。
bool m_isScalarAttributeSet;//是否设置了用于颜色渲染的标量场
std::array<double, 2> m_currentArrayRange; //当前设置的标量场数值范围
};
} //namespace pst
#endif // PST_WIDGETCUTTER_H