From ae3a95587760dcd52870696a1ce0fee1595df88b Mon Sep 17 00:00:00 2001 From: Wanderer Fan Date: Tue, 19 Jul 2022 21:38:13 -0400 Subject: [PATCH] [TD]add progress reporting framework --- src/Mod/TechDraw/App/DrawView.cpp | 9 ++- src/Mod/TechDraw/App/DrawView.h | 24 ++++--- src/Mod/TechDraw/App/DrawViewPart.cpp | 51 ++++++++++++--- src/Mod/TechDraw/Gui/QGIViewPart.cpp | 4 +- src/Mod/TechDraw/Gui/QGSPage.cpp | 4 +- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 64 +++++++++++++------ .../TechDraw/Gui/ViewProviderDrawingView.h | 9 ++- src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 20 +----- src/Mod/TechDraw/Gui/ViewProviderPage.h | 4 -- 9 files changed, 122 insertions(+), 67 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawView.cpp b/src/Mod/TechDraw/App/DrawView.cpp index 3b2c3c061a..e648fa28f0 100644 --- a/src/Mod/TechDraw/App/DrawView.cpp +++ b/src/Mod/TechDraw/App/DrawView.cpp @@ -581,7 +581,12 @@ void DrawView::requestPaint() signalGuiPaint(this); } -PyObject *DrawView::getPyObject() +void DrawView::showProgressMessage(std::string featureName, std::string text) +{ + signalProgressMessage(this, featureName, text); +} + +PyObject *DrawView::getPyObject(void) { if (PythonObject.is(Py::_None())) { // ref counter is set to 1 @@ -590,6 +595,8 @@ PyObject *DrawView::getPyObject() return Py::new_reference_to(PythonObject); } +#include + // Python Drawing feature --------------------------------------------------------- namespace App { diff --git a/src/Mod/TechDraw/App/DrawView.h b/src/Mod/TechDraw/App/DrawView.h index 8c56069a6f..5921c7477e 100644 --- a/src/Mod/TechDraw/App/DrawView.h +++ b/src/Mod/TechDraw/App/DrawView.h @@ -94,16 +94,22 @@ public: virtual bool checkFit() const; virtual bool checkFit(DrawPage*) const; virtual void setPosition(double x, double y, bool force = false); - virtual bool keepUpdated(); - boost::signals2::signal signalGuiPaint; - virtual double getScale() const; - void checkScale(); - void requestPaint(); - virtual void handleXYLock(); - virtual bool isLocked() const; - virtual bool showLock() const; + virtual bool keepUpdated(void); + + boost::signals2::signal signalGuiPaint; + boost::signals2::signal signalProgressMessage; + void requestPaint(void); + void showProgressMessage(std::string featureName, std::string text); + + virtual double getScale(void) const; + void checkScale(void); + + virtual void handleXYLock(void); + virtual bool isLocked(void) const; + virtual bool showLock(void) const; + + std::vector getLeaders(void) const; - std::vector getLeaders() const; void setScaleAttribute(); protected: diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 1333a06d0e..9fd1c54d96 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -282,6 +282,8 @@ void DrawViewPart::addShapes2d(void) App::DocumentObjectExecReturn *DrawViewPart::execute(void) { +// Base::Console().Message("DVP::execute() - %s\n", getNameInDocument()); + if (!keepUpdated()) { return App::DocumentObject::StdReturn; } @@ -387,7 +389,8 @@ void DrawViewPart::partExec(TopoDS_Shape shape) { // Base::Console().Message("DVP::partExec()\n"); if (waitingForResult()) { -// Base::Console().Message("DVP::partExec - %s - GO is waiting for result\n", getNameInDocument()); + //finish what we are already doing before starting over +// Base::Console().Message("DVP::partExec - %s - waiting for result\n", getNameInDocument()); return; } @@ -395,11 +398,13 @@ void DrawViewPart::partExec(TopoDS_Shape shape) delete geometryObject; geometryObject = nullptr; } + showProgressMessage(getNameInDocument(), "is finding hidden lines"); geometryObject = makeGeometryForShape(shape); } GeometryObject* DrawViewPart::makeGeometryForShape(TopoDS_Shape shape) { +// Base::Console().Message("DVP::makeGeometryForShape()\n"); gp_Pnt inputCenter; Base::Vector3d stdOrg(0.0,0.0,0.0); @@ -435,6 +440,7 @@ GeometryObject* DrawViewPart::makeGeometryForShape(TopoDS_Shape shape) //note: slightly different than routine with same name in DrawProjectSplit TechDraw::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape shape, gp_Ax2 viewAxis) { +// Base::Console().Message("DVP::buildGeometryObject()\n"); TechDraw::GeometryObject* go = new TechDraw::GeometryObject(getNameInDocument(), this); go->setIsoCount(IsoCount.getValue()); go->isPerspective(Perspective.getValue()); @@ -447,6 +453,7 @@ TechDraw::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape shape, onHlrFinished(); //poly algo does not run in separate thread, so we need to invoke //the post hlr processing manually } else { +// Base::Console().Message("DVP::buildGeometryObject - starting projectShape\n"); waitingForHlr(true); QObject::connect(&m_hlrWatcher, SIGNAL(finished()), this, SLOT(onHlrFinished())); m_hlrFuture = QtConcurrent::run(go, &GeometryObject::projectShape, shape, viewAxis); @@ -459,17 +466,27 @@ TechDraw::GeometryObject* DrawViewPart::buildGeometryObject(TopoDS_Shape shape, //continue processing after hlr thread completes void DrawViewPart::onHlrFinished(void) { - waitingForHlr(false); +// Base::Console().Message("DVP::onHlrFinished()\n"); + //the last hlr task is to make a bbox of the results bbox = geometryObject->calcBoundingBox(); + waitingForHlr(false); + QObject::disconnect(&m_hlrWatcher, SIGNAL(finished()), this, SLOT(onHlrFinished())); + + showProgressMessage(getNameInDocument(), "has finished finding hidden lines"); + + postHlrTasks(); + if (handleFaces() && !CoarseView.getValue()) { try { +// Base::Console().Message("DVP::onHlrFinished - starting extractFaces\n"); QObject::connect(&m_faceWatcher, SIGNAL(finished()), this, SLOT(onFacesFinished())); m_faceFuture = QtConcurrent::run(this, &DrawViewPart::extractFaces); m_faceWatcher.setFuture(m_faceFuture); } catch (Standard_Failure& e4) { + waitingForFaces(false); Base::Console().Message("DVP::partExec - extractFaces failed for %s - %s **\n",getNameInDocument(),e4.GetMessageString()); } } @@ -480,28 +497,42 @@ void DrawViewPart::onHlrFinished(void) addReferencesToGeom(); - postHlrTasks(); - requestPaint(); } void DrawViewPart::postHlrTasks(void) { - //nothing to do here. DVDetail and DVSection have special needs. + //DVDetail and DVSection have special needs. + //dimensions and balloons need to be recomputed here to get their references sorted + + std::vector dims = getDimensions(); + for (auto& d : dims) { + d->recomputeFeature(); + } + std::vector bals = getBalloons(); + for (auto& b : bals) { + b->recomputeFeature(); + } } //! make faces from the existing edge geometry void DrawViewPart::extractFaces() { - if (!geometryObject) { +// Base::Console().Message("DVP::extractFaces()\n"); + + if (geometryObject == nullptr) { + //no geometry yet so don't bother +// Base::Console().Message("DVP::extractFaces - GO is null\n"); return; } - if (waitingForFaces()) { - return; - } +// if (waitingForFaces()) { +// Base::Console().Message("DVP::extractFaces - already extracting faces\n"); +// } waitingForFaces(true); + showProgressMessage(getNameInDocument(), "is extracting faces"); + geometryObject->clearFaceGeom(); const std::vector& goEdges = geometryObject->getVisibleFaceEdges(SmoothVisible.getValue(),SeamVisible.getValue()); @@ -635,6 +666,8 @@ void DrawViewPart::onFacesFinished(void) { // Base::Console().Message("DVP::onFacesFinished()\n"); waitingForFaces(false); + QObject::disconnect(&m_faceWatcher, SIGNAL(finished()), this, SLOT(onFacesFinished())); + showProgressMessage(getNameInDocument(), "has finished extracting faces"); requestPaint(); } diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index 647a64282a..d3d85ecc49 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -458,8 +458,7 @@ void QGIViewPart::drawViewPart() removePrimitives(); //clean the slate removeDecorations(); -#if MOD_TECHDRAW_HANDLE_FACES - if (viewPart->handleFaces()) { + if (viewPart->handleFaces() && !viewPart->CoarseView.getValue()) { // Draw Faces std::vector hatchObjs = viewPart->getHatches(); std::vector geomObjs = viewPart->getGeomHatches(); @@ -529,7 +528,6 @@ void QGIViewPart::drawViewPart() newFace->draw(); } } -#endif //#if MOD_TECHDRAW_HANDLE_FACES // Draw Edges QColor edgeColor = PreferencesGui::normalQColor(); diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index 1f2766fa24..0aad35a919 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -1201,11 +1201,11 @@ void QGSPage::postProcessXml(QTemporaryFile& temporaryFile, QString fileName, QS QDomDocument exportDoc(QString::fromUtf8("SvgDoc")); QFile file(temporaryFile.fileName()); if (!file.open(QIODevice::ReadOnly)) { - Base::Console().Message("QGSPage::ppsvg - tempfile open error\n"); + Base::Console().Error("QGSPage::ppsvg - tempfile open error\n"); return; } if (!exportDoc.setContent(&file)) { - Base::Console().Message("QGSPage::ppsvg - xml error\n"); + Base::Console().Error("QGSPage::ppsvg - xml error\n"); file.close(); return; } diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index dcaef06f03..67d75c51a8 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -60,7 +61,6 @@ ViewProviderDrawingView::ViewProviderDrawingView() // Do not show in property editor why? wf WF: because DisplayMode applies only to coin and we // don't use coin. DisplayMode.setStatus(App::Property::Hidden,true); - m_docReady = true; } ViewProviderDrawingView::~ViewProviderDrawingView() @@ -73,9 +73,11 @@ void ViewProviderDrawingView::attach(App::DocumentObject *pcFeat) ViewProviderDocumentObject::attach(pcFeat); auto bnd = boost::bind(&ViewProviderDrawingView::onGuiRepaint, this, bp::_1); + auto bndProgressMessage = boost::bind(&ViewProviderDrawingView::onProgressMessage, this, bp::_1, bp::_2, bp::_3); auto feature = getViewObject(); if (feature) { connectGuiRepaint = feature->signalGuiPaint.connect(bnd); + connectProgressMessage = feature->signalProgressMessage.connect(bndProgressMessage); //TODO: would be good to start the QGIV creation process here, but no guarantee we actually have // MDIVP or QGVP yet. // but parent page might. we may not be part of the document yet though! @@ -152,9 +154,8 @@ QGIView* ViewProviderDrawingView::getQView() TechDraw::DrawView* dv = getViewObject(); if (dv) { Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); - if (guiDoc != nullptr) { - Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); - ViewProviderPage* vpp = dynamic_cast(vp); + if (guiDoc) { + ViewProviderPage* vpp = getViewProviderPage(); if (vpp) { if (vpp->getQGSPage()) { qView = dynamic_cast(vpp->getQGSPage()->findQViewForDocObj(getViewObject())); @@ -172,13 +173,11 @@ bool ViewProviderDrawingView::isShow() const void ViewProviderDrawingView::startRestoring() { - m_docReady = false; Gui::ViewProviderDocumentObject::startRestoring(); } void ViewProviderDrawingView::finishRestoring() { - m_docReady = true; if (Visibility.getValue()) { show(); } else { @@ -201,18 +200,23 @@ void ViewProviderDrawingView::updateData(const App::Property* prop) Gui::ViewProviderDocumentObject::updateData(prop); } -MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const +ViewProviderPage* ViewProviderDrawingView::getViewProviderPage() const { - MDIViewPage* result = nullptr; Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); if (guiDoc) { Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); - ViewProviderPage* vpp = dynamic_cast(vp); - if (vpp) { - result = vpp->getMDIViewPage(); - } + return dynamic_cast(vp); } - return result; + return nullptr; +} + +MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const +{ + ViewProviderPage* vpp = getViewProviderPage(); + if (vpp) { + return vpp->getMDIViewPage(); + } + return nullptr; } Gui::MDIView *ViewProviderDrawingView::getMDIView() const @@ -235,8 +239,7 @@ void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) for (auto& v: views) { if (v == getViewObject()) { //view v belongs to this page p - Gui::ViewProvider* vp = guiDoc->getViewProvider(p); - ViewProviderPage* vpPage = dynamic_cast(vp); + ViewProviderPage* vpPage = getViewProviderPage(); if (vpPage) { if (vpPage->getQGSPage()) { QGIView* qView = dynamic_cast(vpPage->getQGSPage()->findQViewForDocObj(v)); @@ -255,9 +258,8 @@ void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) QGIView* qgiv = getQView(); if (qgiv) { qgiv->updateView(true); - } else { //we are not part of the Gui page yet. ask page to add us. - Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); - ViewProviderPage* vpPage = dynamic_cast(vp); + } else { //we are not part of the Gui page yet. ask page to add us. + ViewProviderPage* vpPage = getViewProviderPage(); if (vpPage) { if (vpPage->getQGSPage()) { vpPage->getQGSPage()->addView(dv); @@ -268,6 +270,32 @@ void ViewProviderDrawingView::onGuiRepaint(const TechDraw::DrawView* dv) } } +//handle status updates from App/DrawView +void ViewProviderDrawingView::onProgressMessage(const TechDraw::DrawView* dv, + const std::string featureName, + const std::string text) +{ +// Q_UNUSED(featureName) + Q_UNUSED(dv) +// Q_UNUSED(text) + showProgressMessage(featureName, text); +} + +void ViewProviderDrawingView::showProgressMessage(const std::string featureName, const std::string text) const +{ + QString msg = QString::fromUtf8("%1 %2") + .arg(Base::Tools::fromStdString(featureName), + Base::Tools::fromStdString(text)); + if (Gui::getMainWindow()) { + //neither of these work! Base::Console().Message() output preempts these messages?? +// Gui::getMainWindow()->showMessage(msg, 3000); +// Gui::getMainWindow()->showStatus(Gui::MainWindow::Msg, msg); + //Temporary implementation. This works, but the messages are queued up and + //not displayed in the report window in real time?? + Base::Console().Message("%s\n", qPrintable(msg)); + } +} + TechDraw::DrawView* ViewProviderDrawingView::getViewObject() const { return dynamic_cast(pcObject); diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h index 0fb90c8499..cb1d0910a2 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.h @@ -76,14 +76,17 @@ public: //@} virtual TechDraw::DrawView* getViewObject() const; + void showProgressMessage(const std::string featureName, const std::string text) const; - void onGuiRepaint(const TechDraw::DrawView* dv); + void onGuiRepaint(const TechDraw::DrawView* dv); + void onProgressMessage(const TechDraw::DrawView* dv, + const std::string featureName, + const std::string text); typedef boost::signals2::scoped_connection Connection; Connection connectGuiRepaint; - + Connection connectProgressMessage; private: - bool m_docReady; //sb MDI + QGraphicsScene ready }; diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index 01bebf09cf..981a5873cd 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -78,7 +78,7 @@ PROPERTY_SOURCE(TechDrawGui::ViewProviderPage, Gui::ViewProviderDocumentObject) ViewProviderPage::ViewProviderPage() : m_mdiView(nullptr), - m_docReady(true), + m_pageName(""), m_graphicsView(nullptr), m_graphicsScene(nullptr) { @@ -416,23 +416,7 @@ std::vector ViewProviderPage::claimChildren(void) const } } -void ViewProviderPage::startRestoring() -{ -// Base::Console().Message("VPP::startRestoring()\n"); - //VPDO::startRestoring hides this VPP - Gui::ViewProviderDocumentObject::startRestoring(); -} - -//note this is called when this ViewProvider has been restored, not -//when the whole document has been restored. -void ViewProviderPage::finishRestoring() -{ -// Base::Console().Message("VPP::finishRestoring() - canUpdate: %d viz: %d\n", -// getDrawPage()->canUpdate(), Visibility.getValue()); - Gui::ViewProviderDocumentObject::finishRestoring(); -} - -bool ViewProviderPage::isShow() const +bool ViewProviderPage::isShow(void) const { return Visibility.getValue(); } diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.h b/src/Mod/TechDraw/Gui/ViewProviderPage.h index d6e7be2c04..95941d919c 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.h +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.h @@ -77,9 +77,6 @@ public: bool onDelete(const std::vector &) override; void onChanged(const App::Property *prop) override; void updateData(const App::Property* prop) override; - void startRestoring() override; - void finishRestoring() override; - bool isRestoring() {return !m_docReady;} TechDraw::DrawPage* getDrawPage() const; @@ -115,7 +112,6 @@ protected: private: QPointer m_mdiView; - bool m_docReady; std::string m_pageName; QGVPage* m_graphicsView; QGSPage* m_graphicsScene;