245 lines
7.7 KiB
C
245 lines
7.7 KiB
C
|
|
#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
|