From b59a1f6230ec7db68589d4c02fe3838fbfc45444 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 18 Feb 2025 14:47:03 +0100 Subject: [PATCH 1/4] TD: Fix crash on selecting 3D edge for dimension Unlike in the bug description of issue 19654 the user doesn't have to preselect an edge in the 3D view but first start the dimension command and then select an edge. This commit adds some security checks to TechDrawHandler::quit(), TechDrawHandler::getPage() and TDHandlerDimension::onSelectionChanged() to be on the safe side that no null pointers are dereferenced. But the ultimative fix for this whole problem is to change activateHandler() and immediately delete the passed TechDrawHandler if it fails to find the appropriate QGVPage. This is needed as otherwise the handler behaves like a ghost object that affects the selection mechanism and disallows to select anything in the 3D view or the tree view. Fixes issue 19654 --- src/Mod/TechDraw/Gui/CommandCreateDims.cpp | 9 +++++++-- src/Mod/TechDraw/Gui/TechDrawHandler.cpp | 8 +++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp index 1351041e06..42a0d6f4d3 100644 --- a/src/Mod/TechDraw/Gui/CommandCreateDims.cpp +++ b/src/Mod/TechDraw/Gui/CommandCreateDims.cpp @@ -120,6 +120,7 @@ void positionDimText(DrawViewDimension* dim, int indexOffset = 0); void activateHandler(TechDrawHandler* newHandler) { + std::unique_ptr ptr(newHandler); auto* mdi = qobject_cast(Gui::getMainWindow()->activeWindow()); if (!mdi) { return; @@ -134,7 +135,7 @@ void activateHandler(TechDrawHandler* newHandler) if (!viewPage) { return; } - viewPage->activateHandler(newHandler); + viewPage->activateHandler(ptr.release()); } //=========================================================================== @@ -517,8 +518,12 @@ public: return; } + App::Document* pageDoc = nullptr; + if (auto page = getPage()) { + pageDoc = page->getDocument(); + } if (msg.Object.getObjectName().empty() - || msg.Object.getDocument() != getPage()->getDocument()) { + || (msg.Object.getDocument() != pageDoc)) { if (msg.Type == Gui::SelectionChanges::AddSelection) { Gui::Selection().rmvSelection(msg.pDocName, msg.pObjectName, msg.pSubName); } diff --git a/src/Mod/TechDraw/Gui/TechDrawHandler.cpp b/src/Mod/TechDraw/Gui/TechDrawHandler.cpp index bd182c4497..9e06322220 100644 --- a/src/Mod/TechDraw/Gui/TechDrawHandler.cpp +++ b/src/Mod/TechDraw/Gui/TechDrawHandler.cpp @@ -109,7 +109,9 @@ void TechDrawHandler::mouseReleaseEvent(QMouseEvent* event) void TechDrawHandler::quit() { - viewPage->deactivateHandler(); + if (viewPage) { + viewPage->deactivateHandler(); + } } QWidget* TechDrawHandler::getCursorWidget() @@ -127,5 +129,5 @@ void TechDrawHandler::setWidgetCursor(QCursor cursor) TechDraw::DrawPage* TechDrawHandler::getPage() { - return viewPage->getDrawPage(); -} \ No newline at end of file + return viewPage ? viewPage->getDrawPage() : nullptr; +} From ae2e71b1538fae81f4fe5a8c3834e95422ba40db Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 13 Apr 2025 17:49:44 +0200 Subject: [PATCH 2/4] TD: Fix loading project files With PR 19941 there is a regression where parts of the document won't be restored. This is caused by overriding the virtual method handleChangedPropertyType() but not calling the method of the base class. While searching for a fix another problem showed up where (due to the incomplete loading) exceptions are thrown but not handled within TD. Therefore the method recompute() is overridden in DrawView to also handle OCC exceptions. --- src/Mod/TechDraw/App/DrawView.cpp | 14 ++++++++++++++ src/Mod/TechDraw/App/DrawView.h | 1 + src/Mod/TechDraw/App/DrawViewPart.cpp | 2 ++ src/Mod/TechDraw/App/DrawViewSection.cpp | 2 ++ 4 files changed, 19 insertions(+) diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index b23adfd5fa..31e4b95f83 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -110,6 +110,20 @@ DrawView::DrawView(): } +App::DocumentObjectExecReturn* DrawView::recompute() +{ + try { + return App::DocumentObject::recompute(); + } + catch (Standard_Failure& e) { + auto ret = new App::DocumentObjectExecReturn(e.GetMessageString()); + if (ret->Why.empty()) { + ret->Why = "Unknown OCC exception"; + } + return ret; + } +} + App::DocumentObjectExecReturn *DrawView::execute() { // Base::Console().message("DV::execute() - %s touched: %d\n", getNameInDocument(), isTouched()); diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index 092f0a14f4..ee8e3878ed 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -65,6 +65,7 @@ public: /** @name methods override Feature */ //@{ + App::DocumentObjectExecReturn* recompute() override; /// recalculate the Feature App::DocumentObjectExecReturn *execute() override; void onDocumentRestored() override; diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 85b91cebc2..f2be301429 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -1537,6 +1537,8 @@ void DrawViewPart::handleChangedPropertyType(Base::XMLReader &reader, const char } return; } + + DrawView::handleChangedPropertyType(reader, TypeName, prop); } // true if owner->element is a cosmetic vertex diff --git a/src/Mod/TechDraw/App/DrawViewSection.cpp b/src/Mod/TechDraw/App/DrawViewSection.cpp index e9155b7f0a..e2452e5f9e 100644 --- a/src/Mod/TechDraw/App/DrawViewSection.cpp +++ b/src/Mod/TechDraw/App/DrawViewSection.cpp @@ -1254,6 +1254,8 @@ void DrawViewSection::handleChangedPropertyType(Base::XMLReader &reader, const c } return; } + + DrawViewPart::handleChangedPropertyType(reader, TypeName, prop); } // checks that SectionNormal and XDirection are perpendicular and that Direction is the same as From 93820d686792b9a75590938c2b09d76e9c84b46d Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 14 May 2025 15:49:25 +0200 Subject: [PATCH 3/4] TD: Fix compiler warnings --- src/Mod/TechDraw/Gui/ViewProviderViewPart.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h index 7ceeec9cbf..32da198788 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderViewPart.h +++ b/src/Mod/TechDraw/Gui/ViewProviderViewPart.h @@ -67,19 +67,19 @@ public: App::PropertyPercent FaceTransparency; void attach(App::DocumentObject *) override; - bool useNewSelectionModel(void) const override {return false;} + bool useNewSelectionModel() const override {return false;} bool onDelete(const std::vector &) override; bool canDelete(App::DocumentObject* obj) const override; bool setEdit(int ModNum) override; bool setDetailEdit(int ModNum, TechDraw::DrawViewDetail* dvd); - bool doubleClicked(void) override; + bool doubleClicked() override; void onChanged(const App::Property *prop) override; void handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property * prop) override; - Base::Color prefSectionColor(void); - Base::Color prefHighlightColor(void); - int prefHighlightStyle(void); + Base::Color prefSectionColor(); + Base::Color prefHighlightColor(); + int prefHighlightStyle(); - std::vector claimChildren(void) const override; + std::vector claimChildren() const override; void fixSceneDependencies() override; TechDraw::DrawViewPart* getViewObject() const override; From 1053a7996a68c705d41eafa0315e5dd9bb54ae3a Mon Sep 17 00:00:00 2001 From: Ladislav Michl Date: Mon, 1 Sep 2025 14:12:58 +0200 Subject: [PATCH 4/4] TD: remove unused clearLineSets() d2ce7f81450f ("TD: Remove calls to now-empty clearLineSets() method") removed last calls to clearLineSets(), so remove it entirely. --- src/Mod/TechDraw/Gui/QGIFace.cpp | 6 ------ src/Mod/TechDraw/Gui/QGIFace.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/Mod/TechDraw/Gui/QGIFace.cpp b/src/Mod/TechDraw/Gui/QGIFace.cpp index fd50c588ce..35b93ab121 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.cpp +++ b/src/Mod/TechDraw/Gui/QGIFace.cpp @@ -228,12 +228,6 @@ void QGIFace::setOutline(const QPainterPath & path) setPath(path); } -/// remove the PAT hatch lines -void QGIFace::clearLineSets() -{ - return; -} - /// add PAT hatch line set void QGIFace::addLineSet(LineSet& ls) { diff --git a/src/Mod/TechDraw/Gui/QGIFace.h b/src/Mod/TechDraw/Gui/QGIFace.h index b27233fc91..8fa6b5931c 100644 --- a/src/Mod/TechDraw/Gui/QGIFace.h +++ b/src/Mod/TechDraw/Gui/QGIFace.h @@ -108,7 +108,6 @@ public: //PAT fill parms & methods void setLineWeight(double weight); - [[deprecated]] void clearLineSets(); void addLineSet(TechDraw::LineSet& ls); void lineSetToFillItems(TechDraw::LineSet& ls);