From b7049f03cd82bd5f9ef18866cab820c51f76c48b Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Tue, 15 Sep 2026 10:33:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmRender):=20=E7=BB=9F=E4=B8=80=E6=A0=87?= =?UTF-8?q?=E5=87=86=E8=A7=86=E5=9B=BE=E7=9A=84=E6=97=8B=E8=BD=AC=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E9=87=8D=E7=BD=AE=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 标准视图和重置相机后恢复可见边界中心 - 适应窗口继续保留用户设置的旋转中心 - 中心同步失败时隐藏陈旧标记并保持单次渲染 --- .../nmRender/nmWxVTKRenderContainerWidget.h | 5 ++ .../nmRender/nmWxVTKRenderContainerWidget.cpp | 49 +++++++++++++------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Include/nmNum/nmRender/nmWxVTKRenderContainerWidget.h b/Include/nmNum/nmRender/nmWxVTKRenderContainerWidget.h index 3836b4c..6903397 100644 --- a/Include/nmNum/nmRender/nmWxVTKRenderContainerWidget.h +++ b/Include/nmNum/nmRender/nmWxVTKRenderContainerWidget.h @@ -168,6 +168,11 @@ private: double dY, double dZ, bool bShowMarker); + /** + * @brief 将逻辑中心和 Marker 同步到可见边界中心,但不主动渲染。 + * @return 逻辑中心更新成功时返回 true;Marker 同步失败会隐藏标记。 + */ + bool resetRotationCenterStateWithoutRender(); /** @brief 取消模式、恢复光标并同步 QAction,不修改既有中心标记。 */ void cancelRotationCenterPicking(); /** @brief 处理一次拾取事件;返回 true 表示事件必须停止向 VTK 传播。 */ diff --git a/Src/nmNum/nmRender/nmWxVTKRenderContainerWidget.cpp b/Src/nmNum/nmRender/nmWxVTKRenderContainerWidget.cpp index 460c9d7..df02ab3 100644 --- a/Src/nmNum/nmRender/nmWxVTKRenderContainerWidget.cpp +++ b/Src/nmNum/nmRender/nmWxVTKRenderContainerWidget.cpp @@ -381,17 +381,7 @@ bool nmWxVTKRenderContainerWidget::resetRotationCenterWithoutRender() { Q_ASSERT(isGuiThread()); cancelRotationCenterPicking(); - if(!isGuiThread() || m_pCameraController == nullptr || - !m_pCameraController->resetRotationCenter()) { - return false; - } - - double dCenter[3]; - if(!m_pCameraController->getRotationCenter(dCenter)) { - return false; - } - return applyRotationCenter( - dCenter[0], dCenter[1], dCenter[2], true); + return resetRotationCenterStateWithoutRender(); } void nmWxVTKRenderContainerWidget::showReadyState() @@ -457,6 +447,7 @@ void nmWxVTKRenderContainerWidget::resetCamera() cancelRotationCenterPicking(); // 控制器用返回值表示相机是否确实改变,成功时只提交一次渲染。 if(m_pCameraController != nullptr && m_pCameraController->resetCamera()) { + resetRotationCenterStateWithoutRender(); renderView(); } } @@ -465,6 +456,7 @@ void nmWxVTKRenderContainerWidget::setTopView() { cancelRotationCenterPicking(); if(m_pCameraController != nullptr && m_pCameraController->setTopView()) { + resetRotationCenterStateWithoutRender(); renderView(); } } @@ -473,6 +465,7 @@ void nmWxVTKRenderContainerWidget::setFrontView() { cancelRotationCenterPicking(); if(m_pCameraController != nullptr && m_pCameraController->setFrontView()) { + resetRotationCenterStateWithoutRender(); renderView(); } } @@ -481,6 +474,7 @@ void nmWxVTKRenderContainerWidget::setRightView() { cancelRotationCenterPicking(); if(m_pCameraController != nullptr && m_pCameraController->setRightView()) { + resetRotationCenterStateWithoutRender(); renderView(); } } @@ -490,6 +484,7 @@ void nmWxVTKRenderContainerWidget::setIsometricView() cancelRotationCenterPicking(); if(m_pCameraController != nullptr && m_pCameraController->setIsometricView()) { + resetRotationCenterStateWithoutRender(); renderView(); } } @@ -507,9 +502,8 @@ void nmWxVTKRenderContainerWidget::setRotationCenter( void nmWxVTKRenderContainerWidget::resetRotationCenter() { - if(resetRotationCenterWithoutRender()) { - renderView(); - } + resetRotationCenterWithoutRender(); + renderView(); } bool nmWxVTKRenderContainerWidget::applyRotationCenter( @@ -539,6 +533,33 @@ bool nmWxVTKRenderContainerWidget::applyRotationCenter( 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() { Q_ASSERT(isGuiThread());