|
|
#include "nmVTKScalarBarLayer.h"
|
|
|
|
|
|
#include <QByteArray>
|
|
|
#include <QCoreApplication>
|
|
|
#include <QThread>
|
|
|
|
|
|
#include <vtkLookupTable.h>
|
|
|
#include <vtkMath.h>
|
|
|
#include <vtkScalarBarActor.h>
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
// ScalarBarActor 和 LookupTable 均只能在 Qt GUI 线程中修改。
|
|
|
bool isScalarBarGuiThread()
|
|
|
{
|
|
|
QCoreApplication* pApplication = QCoreApplication::instance();
|
|
|
return pApplication == nullptr ||
|
|
|
pApplication->thread() == QThread::currentThread();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
nmVTKScalarBarLayer::nmVTKScalarBarLayer(const QString& sLayerId)
|
|
|
: nmVTKRenderLayer(sLayerId),
|
|
|
m_pLookupTable(nullptr),
|
|
|
m_pActor(vtkSmartPointer<vtkScalarBarActor>::New())
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
// vtkScalarBarActor 是二维 Prop,仍通过图层基类统一完成挂载和显隐。
|
|
|
setRenderProp(m_pActor);
|
|
|
}
|
|
|
|
|
|
nmVTKScalarBarLayer::~nmVTKScalarBarLayer()
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
// 先移除二维 Prop,再释放对外部 LookupTable 的共享引用。
|
|
|
detach();
|
|
|
m_pLookupTable = nullptr;
|
|
|
}
|
|
|
|
|
|
void nmVTKScalarBarLayer::setLookupTable(vtkLookupTable* pLookupTable)
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
if(!isScalarBarGuiThread()) {
|
|
|
return;
|
|
|
}
|
|
|
// 智能指针共享 LookupTable,保证外部释放原指针后色标仍可安全显示。
|
|
|
m_pLookupTable = pLookupTable;
|
|
|
m_pActor->SetLookupTable(pLookupTable);
|
|
|
}
|
|
|
|
|
|
vtkLookupTable* nmVTKScalarBarLayer::getLookupTable() const
|
|
|
{
|
|
|
return m_pLookupTable;
|
|
|
}
|
|
|
|
|
|
void nmVTKScalarBarLayer::setTitle(const QString& sTitle)
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
if(!isScalarBarGuiThread()) {
|
|
|
return;
|
|
|
}
|
|
|
m_sTitle = sTitle;
|
|
|
// VTK 7.1 接口接收窄字符串,统一以 UTF-8 临时缓冲传入并由 Actor 复制。
|
|
|
const QByteArray aTitle = sTitle.toUtf8();
|
|
|
m_pActor->SetTitle(aTitle.constData());
|
|
|
}
|
|
|
|
|
|
QString nmVTKScalarBarLayer::getTitle() const
|
|
|
{
|
|
|
return m_sTitle;
|
|
|
}
|
|
|
|
|
|
bool nmVTKScalarBarLayer::setPosition(double dX, double dY)
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
if(!isScalarBarGuiThread() || !vtkMath::IsFinite(dX) ||
|
|
|
!vtkMath::IsFinite(dY)) {
|
|
|
return false;
|
|
|
}
|
|
|
// vtkScalarBarActor 默认使用归一化视口坐标,位置值由上层布局策略决定。
|
|
|
m_pActor->SetPosition(dX, dY);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
bool nmVTKScalarBarLayer::setSize(double dWidth, double dHeight)
|
|
|
{
|
|
|
Q_ASSERT(isScalarBarGuiThread());
|
|
|
if(!isScalarBarGuiThread() || !vtkMath::IsFinite(dWidth) ||
|
|
|
!vtkMath::IsFinite(dHeight) || dWidth <= 0.0 || dHeight <= 0.0) {
|
|
|
return false;
|
|
|
}
|
|
|
// 这里只拒绝非正尺寸,不替业务层限制色标是否超出视口。
|
|
|
m_pActor->SetWidth(dWidth);
|
|
|
m_pActor->SetHeight(dHeight);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
vtkScalarBarActor* nmVTKScalarBarLayer::getActor() const
|
|
|
{
|
|
|
return m_pActor;
|
|
|
}
|