comac_desk_app/PostProcessing/WidgetCutter.h

245 lines
7.7 KiB
C
Raw Permalink Normal View History

2024-11-21 11:50:43 +08:00
#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两种widgeti键可以激活/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