#include "nmVTKScalarBarLayer.h" #include #include #include #include #include #include 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::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; }