From d470dc81540abac3ff763df248ebbffb07adf619 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Fri, 26 Jun 2026 11:49:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(3d):=20=E5=8F=8C=E5=87=BB=E4=B8=8E=E5=8D=95?= =?UTF-8?q?=E5=87=BB=E9=9A=94=E7=A6=BB=20+=20=E5=BC=82=E5=B8=B8=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E4=B8=8B=E6=8B=89=E8=AF=AF=E6=98=BE=E3=80=8C=E6=9A=82?= =?UTF-8?q?=E6=97=A0=E6=95=B0=E6=8D=AE=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 双击结束时"第一下"会先触发单击(点会移/线多一段/面多一条边)。修:每次单击前快照 pts_,双击时 先回滚那一下(pts_=快照)再 finish → 双击纯结束,不再附带加点/移点。 EmptyAwareComboBox::realItemCount 用 itemData(i,UserRole-1) 取 flags 是错的(非 Qt flags 角色), 对正常项恒判不可选 → 计数恒 0 → 有真实项(异常区)也误插「暂无数据」。改用 model()->flags()。 构建:app 链接通过 --- src/app/EmptyAwareComboBox.cpp | 8 +++++--- src/render/interact/AnomalyDrawTool.cpp | 10 ++++++++-- src/render/interact/AnomalyDrawTool.hpp | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/app/EmptyAwareComboBox.cpp b/src/app/EmptyAwareComboBox.cpp index 5477b37..c2463b7 100644 --- a/src/app/EmptyAwareComboBox.cpp +++ b/src/app/EmptyAwareComboBox.cpp @@ -23,12 +23,14 @@ EmptyAwareComboBox::EmptyAwareComboBox(QWidget* parent) : QComboBox(parent) { int EmptyAwareComboBox::realItemCount() const { int n = 0; + auto* m = model(); for (int i = 0; i < count(); ++i) { // 排除临时「暂无数据」占位项。 if (itemData(i, kEmptyHintRole).toBool()) continue; - // 排除不可选项(禁用 / NoItemFlags),它们不构成「真实可选数据」。 - if (!(itemData(i, Qt::UserRole - 1).value() & Qt::ItemIsSelectable)) - continue; + // 排除不可选项(禁用 / NoItemFlags)。用 model()->flags() 正确取项标志—— + // 原 itemData(i, UserRole-1) 不是 Qt 的 flags 角色,对正常项恒返回不可选 → + // realItemCount 恒 0 → 有真实项也误插「暂无数据」(用户实测:异常区下方多一条暂无数据)。 + if (m && !(m->flags(m->index(i, modelColumn())) & Qt::ItemIsSelectable)) continue; ++n; } return n; diff --git a/src/render/interact/AnomalyDrawTool.cpp b/src/render/interact/AnomalyDrawTool.cpp index 49fb759..7ad9fb2 100644 --- a/src/render/interact/AnomalyDrawTool.cpp +++ b/src/render/interact/AnomalyDrawTool.cpp @@ -50,6 +50,7 @@ void AnomalyDrawTool::start(DrawMode mode, const Vec3& planeOrigin, const Vec3& onFinish_ = std::move(onFinish); onCancel_ = std::move(onCancel); pts_.clear(); + ptsBeforeClick_.clear(); lastClickMs_ = -1.0; hasCursor_ = false; active_ = true; @@ -254,10 +255,15 @@ void AnomalyDrawTool::installObservers() { self->lastClickMs_ = now; self->lastClickX_ = p[0]; self->lastClickY_ = p[1]; - if (dbl) + if (dbl) { + // 隔离单/双击:回滚"双击第一下"那次加点/移点(否则点会移、线多一段、面多一条边),再完成。 + self->pts_ = self->ptsBeforeClick_; + self->updatePreview(); self->finish(); - else + } else { + self->ptsBeforeClick_ = self->pts_; // 快照本次点击前状态,供随后可能的双击回滚 self->addVertex(); + } break; } case vtkCommand::RightButtonPressEvent: diff --git a/src/render/interact/AnomalyDrawTool.hpp b/src/render/interact/AnomalyDrawTool.hpp index 36c4e86..d89ce8e 100644 --- a/src/render/interact/AnomalyDrawTool.hpp +++ b/src/render/interact/AnomalyDrawTool.hpp @@ -55,6 +55,7 @@ private: DrawMode mode_ = DrawMode::Face; Vec3 origin_{{0, 0, 0}}, normal_{{0, 0, 1}}; std::vector pts_; + std::vector ptsBeforeClick_; // 上一次单击前快照:双击时回滚"第一下"加点/移点,隔离单/双击 std::function&)> onFinish_; std::function onCancel_;