#include "nmPebiResultSnapshotRenderAdapter.h" #include #include #include #include #include nmPebiResultSnapshotRenderAdapter::nmPebiResultSnapshotRenderAdapter() : m_pRenderGrid(vtkSmartPointer::New()), m_pPressureBuffer(vtkSmartPointer::New()), m_pProducer(vtkSmartPointer::New()), m_eBindingMode(SharedPressureFrame), m_nCurrentFrameIndex(-1) { } nmPebiResultSnapshotRenderAdapter::~nmPebiResultSnapshotRenderAdapter() { clear(); } bool nmPebiResultSnapshotRenderAdapter::initialize( const QSharedPointer& pSnapshot, PressureBindingMode eBindingMode) { clear(); if(pSnapshot.isNull() || !pSnapshot->isComplete() || (eBindingMode != SharedPressureFrame && eBindingMode != CopiedPressureFrame)) { return false; } m_pSnapshot = pSnapshot; m_eBindingMode = eBindingMode; if(!m_pSnapshot->copyResultGridStructure(m_pRenderGrid)) { clear(); return false; } // TrivialProducer 只负责把适配器网格接入管道,不会主动修改输出对象。 m_pProducer->SetOutput(m_pRenderGrid); m_pProducer->Modified(); return true; } void nmPebiResultSnapshotRenderAdapter::clear() { // 先断开管道和 CellData,及时释放对旧快照压力数组的临时 VTK 引用。 if(m_pProducer != NULL) { m_pProducer->SetOutput(NULL); m_pProducer->Modified(); } if(m_pRenderGrid != NULL) { m_pRenderGrid->GetCellData()->Initialize(); m_pRenderGrid->Initialize(); } if(m_pPressureBuffer != NULL) { m_pPressureBuffer->Initialize(); } m_pSnapshot.clear(); m_eBindingMode = SharedPressureFrame; m_nCurrentFrameIndex = -1; } bool nmPebiResultSnapshotRenderAdapter::setPressureFrame(int nFrameIndex) { if(m_pSnapshot.isNull() || m_pRenderGrid == NULL || nFrameIndex < 0 || nFrameIndex >= m_pSnapshot->getPressureFrameCount()) { return false; } bool bBound = false; if(m_eBindingMode == SharedPressureFrame) { bBound = m_pSnapshot->bindPressureFrame( nFrameIndex, m_pRenderGrid); } else { bBound = m_pSnapshot->copyPressureFrame( nFrameIndex, m_pPressureBuffer); if(bBound) { m_pRenderGrid->GetCellData()->SetScalars(m_pPressureBuffer); m_pRenderGrid->Modified(); } } if(!bBound) { return false; } m_nCurrentFrameIndex = nFrameIndex; m_pProducer->Modified(); return true; } vtkAlgorithmOutput* nmPebiResultSnapshotRenderAdapter::getOutputPort() const { return m_pSnapshot.isNull() || m_pProducer == NULL ? NULL : m_pProducer->GetOutputPort(); } int nmPebiResultSnapshotRenderAdapter::getCurrentFrameIndex() const { return m_nCurrentFrameIndex; } vtkIdType nmPebiResultSnapshotRenderAdapter::getCellCount() const { return m_pRenderGrid == NULL ? 0 : m_pRenderGrid->GetNumberOfCells(); } bool nmPebiResultSnapshotRenderAdapter::isUsingSharedPressure() const { return !m_pSnapshot.isNull() && m_eBindingMode == SharedPressureFrame; }