From 408ac944164b2140e57c4040bf76ec67e120d776 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 25 Apr 2019 14:53:52 -0400 Subject: [PATCH] Fix handling of orphan objects during Page delete --- src/Mod/TechDraw/App/DrawPage.cpp | 29 +++++++++++++++++++-------- src/Mod/TechDraw/App/DrawView.cpp | 1 + src/Mod/TechDraw/App/DrawViewPart.cpp | 6 +++--- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawPage.cpp b/src/Mod/TechDraw/App/DrawPage.cpp index 731e0b8967..0d34b1e44a 100644 --- a/src/Mod/TechDraw/App/DrawPage.cpp +++ b/src/Mod/TechDraw/App/DrawPage.cpp @@ -372,16 +372,29 @@ void DrawPage::unsetupObject() // Remove the Page's views & template from document App::Document* doc = getDocument(); std::string docName = doc->getName(); + std::string pageName = getNameInDocument(); - while (Views.getValues().size() > 0 ) { + try { const std::vector currViews = Views.getValues(); - App::DocumentObject* child = currViews.front(); - std::string viewName = child->getNameInDocument(); - Base::Interpreter().runStringArg("App.getDocument(\"%s\").removeObject(\"%s\")", - docName.c_str(), viewName.c_str()); - } - std::vector emptyViews; //probably superfluous - Views.setValues(emptyViews); + for (auto& v: currViews) { + //NOTE: the order of objects in Page.Views does not reflect the object hierarchy + // this means that a ProjGroup could be deleted before it's child ProjGroupItems. + // this causes problems when removing objects from document + if (v->isAttachedToDocument()) { + std::string viewName = v->getNameInDocument(); + Base::Interpreter().runStringArg("App.getDocument(\"%s\").removeObject(\"%s\")", + docName.c_str(), viewName.c_str()); + } else { + Base::Console().Log("DP::unsetupObject - v(%s) is not in document. skipping\n", pageName.c_str()); + } + } + std::vector emptyViews; //probably superfluous + Views.setValues(emptyViews); + + } + catch (...) { + Base::Console().Warning("DP::unsetupObject - %s - error while deleting children\n", getNameInDocument()); + } App::DocumentObject* tmp = Template.getValue(); if (tmp != nullptr) { diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 4cc7afc3d3..399fa21eaa 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -91,6 +91,7 @@ DrawView::~DrawView() App::DocumentObjectExecReturn *DrawView::execute(void) { +// Base::Console().Message("DV::execute() - %s\n",getNameInDocument()); handleXYLock(); requestPaint(); return App::DocumentObject::execute(); diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index c99f250907..c9c78ae0d6 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -160,7 +160,6 @@ DrawViewPart::~DrawViewPart() TopoDS_Shape DrawViewPart::getSourceShape(void) const { // Base::Console().Message("DVP::getSourceShape() - %s\n", getNameInDocument()); - TopoDS_Shape result; const std::vector& links = Source.getValues(); if (links.empty()) { @@ -276,7 +275,7 @@ TopoDS_Shape DrawViewPart::getSourceShapeFused(void) const App::DocumentObjectExecReturn *DrawViewPart::execute(void) { -// Base::Console().Message("DVP::execute() - %s\n", getNameInDocument()); +// Base::Console().Message("DVP::execute() - %s\n",getNameInDocument()); if (!keepUpdated()) { return App::DocumentObject::StdReturn; } @@ -346,6 +345,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) #endif //#if MOD_TECHDRAW_HANDLE_FACES requestPaint(); +// Base::Console().Message("DVP::execute - %s - exits\n",getNameInDocument()); return App::DocumentObject::StdReturn; } @@ -442,11 +442,11 @@ TechDrawGeometry::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape go->extractGeometry(TechDrawGeometry::ecUVISO, false); } - auto end = chrono::high_resolution_clock::now(); auto diff = end - start; double diffOut = chrono::duration (diff).count(); Base::Console().Log("TIMING - %s DVP spent: %.3f millisecs in GO::extractGeometry\n",getNameInDocument(),diffOut); + const std::vector & edges = go->getEdgeGeometry(); if (edges.empty()) { Base::Console().Log("DVP::buildGO - NO extracted edges!\n");