|
|
|
|
@ -513,6 +513,8 @@ public:
|
|
|
|
|
|
|
|
|
|
void applyScalarBarState(const nmPebiResultDisplayState& oDisplay)
|
|
|
|
|
{
|
|
|
|
|
// 仅在快照、属性或配色提交成功后替换;普通切帧复用同一份 LUT。
|
|
|
|
|
m_oCurrentDisplayState = oDisplay;
|
|
|
|
|
if(m_pScalarBarLayer == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -626,6 +628,7 @@ public:
|
|
|
|
|
delete m_pAdapter;
|
|
|
|
|
m_pAdapter = nullptr;
|
|
|
|
|
m_pSnapshot.clear();
|
|
|
|
|
m_oCurrentDisplayState = nmPebiResultDisplayState();
|
|
|
|
|
m_listAvailablePropertyIds.clear();
|
|
|
|
|
m_sCurrentPropertyId.clear();
|
|
|
|
|
m_nCurrentFrameIndex = -1;
|
|
|
|
|
@ -694,6 +697,8 @@ public:
|
|
|
|
|
QString m_sCurrentPropertyId;
|
|
|
|
|
/** @brief 按稳定属性 ID 保存的窗口级样式;clear 不删除。 */
|
|
|
|
|
QMap<QString, nmPebiResultDisplaySettings> m_mapDisplaySettings;
|
|
|
|
|
/** @brief 仅缓存当前绑定、当前属性的显示状态,不按帧积累。 */
|
|
|
|
|
nmPebiResultDisplayState m_oCurrentDisplayState;
|
|
|
|
|
nmVTKMeshLayer::DisplayMode m_eMeshDisplayMode; ///< 本窗口显示偏好。
|
|
|
|
|
int m_nCurrentFrameIndex;
|
|
|
|
|
/** @brief 不同快照对象完整提交成功后的单调序号,clear 和失败均不回退。 */
|
|
|
|
|
@ -1030,9 +1035,16 @@ bool nmPebiResultSceneController::applyPropertyFrame(
|
|
|
|
|
m_pPrivate->m_mapDisplaySettings.value(
|
|
|
|
|
sPropertyId, nmPebiResultDisplaySettings());
|
|
|
|
|
nmPebiResultDisplayState oDisplayCandidate;
|
|
|
|
|
if(!nmPebiResultDisplayStateBuilder::build(
|
|
|
|
|
m_pPrivate->m_pSnapshot, sPropertyId, oTargetSettings,
|
|
|
|
|
oDisplayCandidate, pError)) {
|
|
|
|
|
const bool bReuseDisplayState =
|
|
|
|
|
sPropertyId == m_pPrivate->m_sCurrentPropertyId &&
|
|
|
|
|
m_pPrivate->m_oCurrentDisplayState.m_pLookupTable != nullptr &&
|
|
|
|
|
m_pPrivate->m_oCurrentDisplayState.m_oSettings == oTargetSettings;
|
|
|
|
|
if(bReuseDisplayState) {
|
|
|
|
|
// 色域来自整个快照,与帧号无关;快照绑定和配色提交负责刷新缓存。
|
|
|
|
|
oDisplayCandidate = m_pPrivate->m_oCurrentDisplayState;
|
|
|
|
|
} else if(!nmPebiResultDisplayStateBuilder::build(
|
|
|
|
|
m_pPrivate->m_pSnapshot, sPropertyId, oTargetSettings,
|
|
|
|
|
oDisplayCandidate, pError)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -1069,18 +1081,20 @@ bool nmPebiResultSceneController::applyPropertyFrame(
|
|
|
|
|
|
|
|
|
|
m_pPrivate->m_sCurrentPropertyId = sPropertyId;
|
|
|
|
|
m_pPrivate->m_nCurrentFrameIndex = nFrameIndex;
|
|
|
|
|
m_pPrivate->m_mapDisplaySettings.insert(
|
|
|
|
|
sPropertyId, oDisplayCandidate.m_oSettings);
|
|
|
|
|
m_pPrivate->m_dBusinessRange[0] =
|
|
|
|
|
oDisplayCandidate.m_dBusinessRange[0];
|
|
|
|
|
m_pPrivate->m_dBusinessRange[1] =
|
|
|
|
|
oDisplayCandidate.m_dBusinessRange[1];
|
|
|
|
|
m_pPrivate->m_dDisplayRange[0] =
|
|
|
|
|
oDisplayCandidate.m_dVisibleRange[0];
|
|
|
|
|
m_pPrivate->m_dDisplayRange[1] =
|
|
|
|
|
oDisplayCandidate.m_dVisibleRange[1];
|
|
|
|
|
m_pPrivate->m_bHasPropertyRange = true;
|
|
|
|
|
m_pPrivate->applyScalarBarState(oDisplayCandidate);
|
|
|
|
|
if(!bReuseDisplayState) {
|
|
|
|
|
m_pPrivate->m_mapDisplaySettings.insert(
|
|
|
|
|
sPropertyId, oDisplayCandidate.m_oSettings);
|
|
|
|
|
m_pPrivate->m_dBusinessRange[0] =
|
|
|
|
|
oDisplayCandidate.m_dBusinessRange[0];
|
|
|
|
|
m_pPrivate->m_dBusinessRange[1] =
|
|
|
|
|
oDisplayCandidate.m_dBusinessRange[1];
|
|
|
|
|
m_pPrivate->m_dDisplayRange[0] =
|
|
|
|
|
oDisplayCandidate.m_dVisibleRange[0];
|
|
|
|
|
m_pPrivate->m_dDisplayRange[1] =
|
|
|
|
|
oDisplayCandidate.m_dVisibleRange[1];
|
|
|
|
|
m_pPrivate->m_bHasPropertyRange = true;
|
|
|
|
|
m_pPrivate->applyScalarBarState(oDisplayCandidate);
|
|
|
|
|
}
|
|
|
|
|
m_pPrivate->m_pContainer->renderView();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -1115,6 +1129,13 @@ bool nmPebiResultSceneController::applyCurrentDisplaySettings(
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const nmPebiResultDisplaySettings oCurrentSettings =
|
|
|
|
|
m_pPrivate->m_mapDisplaySettings.value(
|
|
|
|
|
sExpectedPropertyId, nmPebiResultDisplaySettings());
|
|
|
|
|
if(oSettings == oCurrentSettings) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nmPebiResultDisplayState oDisplayCandidate;
|
|
|
|
|
if(!nmPebiResultDisplayStateBuilder::build(
|
|
|
|
|
m_pPrivate->m_pSnapshot,
|
|
|
|
|
@ -1125,13 +1146,6 @@ bool nmPebiResultSceneController::applyCurrentDisplaySettings(
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const nmPebiResultDisplaySettings oCurrentSettings =
|
|
|
|
|
m_pPrivate->m_mapDisplaySettings.value(
|
|
|
|
|
sExpectedPropertyId, nmPebiResultDisplaySettings());
|
|
|
|
|
if(oDisplayCandidate.m_oSettings == oCurrentSettings.normalized()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MeshLayer 先完整验证候选 LUT;失败时旧 Mapper 和 ScalarBar 仍共享旧 LUT。
|
|
|
|
|
if(!m_pPrivate->m_pMeshLayer->setLookupTable(
|
|
|
|
|
oDisplayCandidate.m_pLookupTable)) {
|
|
|
|
|
|