fix(nmRender): 统一标准视图的旋转中心重置行为

- 标准视图和重置相机后恢复可见边界中心
- 适应窗口继续保留用户设置的旋转中心
- 中心同步失败时隐藏陈旧标记并保持单次渲染
feature/nmNum-postprocessing-view-20260910
lh 7 hours ago
parent 291aa998c6
commit b7049f03cd

@ -168,6 +168,11 @@ private:
double dY, double dY,
double dZ, double dZ,
bool bShowMarker); bool bShowMarker);
/**
* @brief Marker
* @return trueMarker
*/
bool resetRotationCenterStateWithoutRender();
/** @brief 取消模式、恢复光标并同步 QAction不修改既有中心标记。 */ /** @brief 取消模式、恢复光标并同步 QAction不修改既有中心标记。 */
void cancelRotationCenterPicking(); void cancelRotationCenterPicking();
/** @brief 处理一次拾取事件;返回 true 表示事件必须停止向 VTK 传播。 */ /** @brief 处理一次拾取事件;返回 true 表示事件必须停止向 VTK 传播。 */

@ -381,17 +381,7 @@ bool nmWxVTKRenderContainerWidget::resetRotationCenterWithoutRender()
{ {
Q_ASSERT(isGuiThread()); Q_ASSERT(isGuiThread());
cancelRotationCenterPicking(); cancelRotationCenterPicking();
if(!isGuiThread() || m_pCameraController == nullptr || return resetRotationCenterStateWithoutRender();
!m_pCameraController->resetRotationCenter()) {
return false;
}
double dCenter[3];
if(!m_pCameraController->getRotationCenter(dCenter)) {
return false;
}
return applyRotationCenter(
dCenter[0], dCenter[1], dCenter[2], true);
} }
void nmWxVTKRenderContainerWidget::showReadyState() void nmWxVTKRenderContainerWidget::showReadyState()
@ -457,6 +447,7 @@ void nmWxVTKRenderContainerWidget::resetCamera()
cancelRotationCenterPicking(); cancelRotationCenterPicking();
// 控制器用返回值表示相机是否确实改变,成功时只提交一次渲染。 // 控制器用返回值表示相机是否确实改变,成功时只提交一次渲染。
if(m_pCameraController != nullptr && m_pCameraController->resetCamera()) { if(m_pCameraController != nullptr && m_pCameraController->resetCamera()) {
resetRotationCenterStateWithoutRender();
renderView(); renderView();
} }
} }
@ -465,6 +456,7 @@ void nmWxVTKRenderContainerWidget::setTopView()
{ {
cancelRotationCenterPicking(); cancelRotationCenterPicking();
if(m_pCameraController != nullptr && m_pCameraController->setTopView()) { if(m_pCameraController != nullptr && m_pCameraController->setTopView()) {
resetRotationCenterStateWithoutRender();
renderView(); renderView();
} }
} }
@ -473,6 +465,7 @@ void nmWxVTKRenderContainerWidget::setFrontView()
{ {
cancelRotationCenterPicking(); cancelRotationCenterPicking();
if(m_pCameraController != nullptr && m_pCameraController->setFrontView()) { if(m_pCameraController != nullptr && m_pCameraController->setFrontView()) {
resetRotationCenterStateWithoutRender();
renderView(); renderView();
} }
} }
@ -481,6 +474,7 @@ void nmWxVTKRenderContainerWidget::setRightView()
{ {
cancelRotationCenterPicking(); cancelRotationCenterPicking();
if(m_pCameraController != nullptr && m_pCameraController->setRightView()) { if(m_pCameraController != nullptr && m_pCameraController->setRightView()) {
resetRotationCenterStateWithoutRender();
renderView(); renderView();
} }
} }
@ -490,6 +484,7 @@ void nmWxVTKRenderContainerWidget::setIsometricView()
cancelRotationCenterPicking(); cancelRotationCenterPicking();
if(m_pCameraController != nullptr && if(m_pCameraController != nullptr &&
m_pCameraController->setIsometricView()) { m_pCameraController->setIsometricView()) {
resetRotationCenterStateWithoutRender();
renderView(); renderView();
} }
} }
@ -507,10 +502,9 @@ void nmWxVTKRenderContainerWidget::setRotationCenter(
void nmWxVTKRenderContainerWidget::resetRotationCenter() void nmWxVTKRenderContainerWidget::resetRotationCenter()
{ {
if(resetRotationCenterWithoutRender()) { resetRotationCenterWithoutRender();
renderView(); renderView();
} }
}
bool nmWxVTKRenderContainerWidget::applyRotationCenter( bool nmWxVTKRenderContainerWidget::applyRotationCenter(
double dX, double dX,
@ -539,6 +533,33 @@ bool nmWxVTKRenderContainerWidget::applyRotationCenter(
return true; return true;
} }
bool nmWxVTKRenderContainerWidget::resetRotationCenterStateWithoutRender()
{
Q_ASSERT(isGuiThread());
if(!isGuiThread() || m_pCameraController == nullptr ||
!m_pCameraController->resetRotationCenter()) {
hideRotationCenterMarker();
return false;
}
double dCenter[3];
nmVTKRotationCenterMarkerLayer* pMarkerLayer =
getRotationCenterMarkerLayer();
if(!m_pCameraController->getRotationCenter(dCenter) ||
pMarkerLayer == nullptr ||
!pMarkerLayer->setWorldCenter(
dCenter[0], dCenter[1], dCenter[2])) {
// 逻辑中心与显示副本无法确认一致时,不保留陈旧标记。
hideRotationCenterMarker();
return true;
}
// 由 Ready、能力和 Pick Target 共同决定显隐,不在中心事务中强制显示。
updateRotationCenterMarkerVisibility();
synchronizeRotationCenterMarker();
return true;
}
void nmWxVTKRenderContainerWidget::cancelRotationCenterPicking() void nmWxVTKRenderContainerWidget::cancelRotationCenterPicking()
{ {
Q_ASSERT(isGuiThread()); Q_ASSERT(isGuiThread());

Loading…
Cancel
Save