From 0ea0ea807ba0904a0bd9c63213032a2514be4b4b Mon Sep 17 00:00:00 2001 From: marioalexis Date: Sun, 8 Oct 2023 19:01:13 -0300 Subject: [PATCH] Fem: Remove callback added by filters task box and rework marker classes --- src/Mod/Fem/Gui/TaskPostBoxes.cpp | 330 +++++++++++++++--------------- src/Mod/Fem/Gui/TaskPostBoxes.h | 64 +++--- 2 files changed, 200 insertions(+), 194 deletions(-) diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.cpp b/src/Mod/Fem/Gui/TaskPostBoxes.cpp index b53ac9f11c45..b7a1e8ae6d12 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.cpp +++ b/src/Mod/Fem/Gui/TaskPostBoxes.cpp @@ -71,12 +71,13 @@ using namespace Gui; // *************************************************************************** // point marker -PointMarker::PointMarker(Gui::View3DInventorViewer* iv, std::string ObjName) - : view(iv) +PointMarker::PointMarker(Gui::View3DInventorViewer* iv, App::DocumentObject* obj) + : connSelectPoint(QMetaObject::Connection()) + , view(iv) + , obj(obj) , vp(new ViewProviderPointMarker) { view->addViewProvider(vp); - m_name = ObjName; } PointMarker::~PointMarker() @@ -89,121 +90,41 @@ void PointMarker::addPoint(const SbVec3f& pt) { int ct = countPoints(); vp->pCoords->point.set1Value(ct, pt); -} - -int PointMarker::countPoints() const -{ - return vp->pCoords->point.getNum(); + vp->pMarker->numPoints = ct + 1; } void PointMarker::clearPoints() const { + vp->pMarker->numPoints = 0; vp->pCoords->point.setNum(0); } -void PointMarker::customEvent(QEvent*) -{ - const SbVec3f& pt1 = vp->pCoords->point[0]; - const SbVec3f& pt2 = vp->pCoords->point[1]; - - if (!m_name.empty()) { - Q_EMIT PointsChanged(pt1[0], pt1[1], pt1[2], pt2[0], pt2[1], pt2[2]); - Gui::Command::doCommand(Gui::Command::Doc, - "App.ActiveDocument.%s.Point1 = App.Vector(%f, %f, %f)", - m_name.c_str(), - pt1[0], - pt1[1], - pt1[2]); - Gui::Command::doCommand(Gui::Command::Doc, - "App.ActiveDocument.%s.Point2 = App.Vector(%f, %f, %f)", - m_name.c_str(), - pt2[0], - pt2[1], - pt2[2]); - } - Gui::Command::doCommand(Gui::Command::Doc, ObjectInvisible().c_str()); -} - -std::string PointMarker::ObjectInvisible() -{ - return "for amesh in App.activeDocument().Objects:\n\ - if \"Mesh\" in amesh.TypeId:\n\ - aparttoshow = amesh.Name.replace(\"_Mesh\",\"\")\n\ - for apart in App.activeDocument().Objects:\n\ - if aparttoshow == apart.Name:\n\ - apart.ViewObject.Visibility = False\n"; -} - -PROPERTY_SOURCE(FemGui::ViewProviderPointMarker, Gui::ViewProviderDocumentObject) - -ViewProviderPointMarker::ViewProviderPointMarker() -{ - pCoords = new SoCoordinate3(); - pCoords->ref(); - pCoords->point.setNum(0); - - SoGroup* grp = new SoGroup(); - grp->addChild(pCoords); - addDisplayMaskMode(grp, "Base"); - setDisplayMaskMode("Base"); -} - -ViewProviderPointMarker::~ViewProviderPointMarker() -{ - pCoords->unref(); -} - - -// *************************************************************************** -// data marker -DataMarker::DataMarker(Gui::View3DInventorViewer* iv, std::string ObjName) - : view(iv) - , vp(new ViewProviderDataMarker) -{ - view->addViewProvider(vp); - m_name = ObjName; -} - -DataMarker::~DataMarker() +int PointMarker::countPoints() const { - view->removeViewProvider(vp); - delete vp; + return vp->pCoords->point.getNum(); } -void DataMarker::addPoint(const SbVec3f& pt) +SbVec3f PointMarker::getPoint(int idx) const { - int ct = countPoints(); - vp->pCoords->point.set1Value(ct, pt); - vp->pMarker->numPoints = ct + 1; + return vp->pCoords->point[idx]; } -int DataMarker::countPoints() const +void PointMarker::setPoint(int idx, const SbVec3f& pt) const { - return vp->pCoords->point.getNum(); + vp->pCoords->point.set1Value(idx, pt); } -void DataMarker::setPoint(int idx, const SbVec3f& pt) const +Gui::View3DInventorViewer* PointMarker::getView() const { - vp->pCoords->point.set1Value(idx, pt); + return view; } -void DataMarker::customEvent(QEvent*) +App::DocumentObject* PointMarker::getObject() const { - const SbVec3f& pt1 = vp->pCoords->point[0]; - - if (!m_name.empty()) { - Q_EMIT PointsChanged(pt1[0], pt1[1], pt1[2]); - Gui::Command::doCommand(Gui::Command::Doc, - "App.ActiveDocument.%s.Center = App.Vector(%f, %f, %f)", - m_name.c_str(), - pt1[0], - pt1[1], - pt1[2]); - } - Gui::Command::doCommand(Gui::Command::Doc, ObjectInvisible().c_str()); + return obj; } -std::string DataMarker::ObjectInvisible() +std::string PointMarker::ObjectInvisible() { return "for amesh in App.activeDocument().Objects:\n\ if \"Mesh\" in amesh.TypeId:\n\ @@ -213,9 +134,10 @@ std::string DataMarker::ObjectInvisible() apart.ViewObject.Visibility = False\n"; } -PROPERTY_SOURCE(FemGui::ViewProviderDataMarker, Gui::ViewProviderDocumentObject) -ViewProviderDataMarker::ViewProviderDataMarker() +PROPERTY_SOURCE(FemGui::ViewProviderPointMarker, Gui::ViewProviderDocumentObject) + +ViewProviderPointMarker::ViewProviderPointMarker() { pCoords = new SoCoordinate3(); pCoords->ref(); @@ -236,13 +158,63 @@ ViewProviderDataMarker::ViewProviderDataMarker() setDisplayMaskMode("Base"); } -ViewProviderDataMarker::~ViewProviderDataMarker() +ViewProviderPointMarker::~ViewProviderPointMarker() { pCoords->unref(); pMarker->unref(); } +// *************************************************************************** +// DataAlongLine marker +DataAlongLineMarker::DataAlongLineMarker(Gui::View3DInventorViewer* iv, + Fem::FemPostDataAlongLineFilter* obj) + : PointMarker(iv, obj) +{} + +void DataAlongLineMarker::customEvent(QEvent*) +{ + const SbVec3f& pt1 = getPoint(0); + const SbVec3f& pt2 = getPoint(1); + + Q_EMIT PointsChanged(pt1[0], pt1[1], pt1[2], pt2[0], pt2[1], pt2[2]); + Gui::Command::doCommand(Gui::Command::Doc, + "App.ActiveDocument.%s.Point1 = App.Vector(%f, %f, %f)", + getObject()->getNameInDocument(), + pt1[0], + pt1[1], + pt1[2]); + Gui::Command::doCommand(Gui::Command::Doc, + "App.ActiveDocument.%s.Point2 = App.Vector(%f, %f, %f)", + getObject()->getNameInDocument(), + pt2[0], + pt2[1], + pt2[2]); + Gui::Command::doCommand(Gui::Command::Doc, ObjectInvisible().c_str()); +} + + +// *************************************************************************** +// DataAtPoint marker +DataAtPointMarker::DataAtPointMarker(Gui::View3DInventorViewer* iv, + Fem::FemPostDataAtPointFilter* obj) + : PointMarker(iv, obj) +{} + +void DataAtPointMarker::customEvent(QEvent*) +{ + const SbVec3f& pt1 = getPoint(0); + Q_EMIT PointsChanged(pt1[0], pt1[1], pt1[2]); + Gui::Command::doCommand(Gui::Command::Doc, + "App.ActiveDocument.%s.Center = App.Vector(%f, %f, %f)", + getObject()->getNameInDocument(), + pt1[0], + pt1[1], + pt1[2]); + Gui::Command::doCommand(Gui::Command::Doc, ObjectInvisible().c_str()); +} + + // *************************************************************************** // main task dialog TaskPostBox::TaskPostBox(Gui::ViewProviderDocumentObject* view, @@ -602,7 +574,15 @@ TaskPostDataAlongLine::TaskPostDataAlongLine(ViewProviderDocumentObject* view, Q updateEnumerationList(getTypedView()->VectorMode, ui->VectorMode); } -TaskPostDataAlongLine::~TaskPostDataAlongLine() = default; +TaskPostDataAlongLine::~TaskPostDataAlongLine() +{ + if (marker && marker->getView()) { + marker->getView()->setEditing(false); + marker->getView()->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + pointCallback, + marker); + } +} void TaskPostDataAlongLine::setupConnectionsStep1() { @@ -688,28 +668,32 @@ static const char* cursor_triangle[] = {"32 17 3 1", void TaskPostDataAlongLine::onSelectPointsClicked() { Gui::Command::doCommand(Gui::Command::Doc, ObjectVisible().c_str()); - Gui::Document* doc = Gui::Application::Instance->getDocument(getDocument()); - Gui::View3DInventor* view = static_cast(doc->getActiveView()); + auto view = static_cast(getView()->getDocument()->getActiveView()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); viewer->setEditingCursor(QCursor(QPixmap(cursor_triangle), 7, 7)); - // Derives from QObject and we have a parent object, so we don't - // require a delete. - std::string ObjName = getObject()->getNameInDocument(); if (!marker) { - marker = new FemGui::PointMarker(viewer, ObjName); + // Derives from QObject and we have a parent object, so we don't + // require a delete. + auto obj = static_cast(getObject()); + marker = new DataAlongLineMarker(viewer, obj); marker->setParent(this); } - else if (marker->countPoints() == 2) { + else if (marker->countPoints()) { marker->clearPoints(); } - viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), - FemGui::TaskPostDataAlongLine::pointCallback, - marker); - connect(marker, &PointMarker::PointsChanged, this, &TaskPostDataAlongLine::onChange); + if (!marker->connSelectPoint) { + viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAlongLine::pointCallback, + marker); + marker->connSelectPoint = connect(marker, + &DataAlongLineMarker::PointsChanged, + this, + &TaskPostDataAlongLine::onChange); + } } } @@ -764,18 +748,34 @@ void TaskPostDataAlongLine::onChange(double x1, ui->point2Y->blockSignals(false); ui->point2Z->blockSignals(false); point2Changed(0.0); + + if (marker && marker->getView()) { + // leave mode + marker->getView()->setEditing(false); + marker->getView()->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAlongLine::pointCallback, + marker); + disconnect(marker->connSelectPoint); + } } void TaskPostDataAlongLine::point1Changed(double) { try { + SbVec3f vec(ui->point1X->value().getValue(), + ui->point1Y->value().getValue(), + ui->point1Z->value().getValue()); std::string ObjName = getObject()->getNameInDocument(); Gui::cmdAppDocumentArgs(getDocument(), "%s.Point1 = App.Vector(%f, %f, %f)", ObjName, - ui->point1X->value().getValue(), - ui->point1Y->value().getValue(), - ui->point1Z->value().getValue()); + vec[0], + vec[1], + vec[2]); + + if (marker && marker->countPoints() > 0) { + marker->setPoint(0, vec); + } // recompute the feature to fill all fields with data at this point getObject()->recomputeFeature(); @@ -793,13 +793,20 @@ void TaskPostDataAlongLine::point1Changed(double) void TaskPostDataAlongLine::point2Changed(double) { try { + SbVec3f vec(ui->point2X->value().getValue(), + ui->point2Y->value().getValue(), + ui->point2Z->value().getValue()); std::string ObjName = getObject()->getNameInDocument(); Gui::cmdAppDocumentArgs(getDocument(), "%s.Point2 = App.Vector(%f, %f, %f)", ObjName, - ui->point2X->value().getValue(), - ui->point2Y->value().getValue(), - ui->point2Z->value().getValue()); + vec[0], + vec[1], + vec[2]); + + if (marker && marker->countPoints() > 1) { + marker->setPoint(1, vec); + } // recompute the feature to fill all fields with data at this point getObject()->recomputeFeature(); @@ -850,16 +857,16 @@ void TaskPostDataAlongLine::pointCallback(void* ud, SoEventCallback* n) if (pm->countPoints() == 2) { QEvent* e = new QEvent(QEvent::User); QApplication::postEvent(pm, e); - // leave mode - view->setEditing(false); - view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); } } else if (mbe->getButton() != SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); view->setEditing(false); - view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); + view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAlongLine::pointCallback, + ud); + disconnect(pm->connSelectPoint); } } @@ -981,6 +988,12 @@ TaskPostDataAtPoint::~TaskPostDataAtPoint() if (doc) { doc->recompute(); } + if (marker && marker->getView()) { + marker->getView()->setEditing(false); + marker->getView()->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + pointCallback, + marker); + } } void TaskPostDataAtPoint::setupConnections() @@ -998,51 +1011,32 @@ void TaskPostDataAtPoint::setupConnections() void TaskPostDataAtPoint::applyPythonCode() {} -static const char* cursor_star[] = {"32 17 3 1", - " c None", - ". c #FFFFFF", - "+ c #FF0000", - " . ", - " . ", - " . ", - " . ", - " . ", - " ", - "..... ..... ", - " ", - " . ", - " . ", - " . ++ ", - " . + + ", - " . + ++ + ", - " + ++++ + ", - " + ++ ++ + ", - " + ++++++++ + ", - " ++ ++ ++ ++ "}; - void TaskPostDataAtPoint::onSelectPointClicked() { Gui::Command::doCommand(Gui::Command::Doc, ObjectVisible().c_str()); - Gui::Document* doc = Gui::Application::Instance->getDocument(getDocument()); - Gui::View3DInventor* view = static_cast(doc->getActiveView()); + auto view = static_cast(getView()->getDocument()->getActiveView()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); viewer->setEditing(true); - viewer->setEditingCursor(QCursor(QPixmap(cursor_star), 7, 7)); - - // Derives from QObject and we have a parent object, so we don't - // require a delete. - std::string ObjName = getObject()->getNameInDocument(); + viewer->setEditingCursor(QCursor(QPixmap(cursor_triangle), 7, 7)); if (!marker) { - marker = new FemGui::DataMarker(viewer, ObjName); + // Derives from QObject and we have a parent object, so we don't + // require a delete. + auto obj = static_cast(getObject()); + marker = new DataAtPointMarker(viewer, obj); marker->setParent(this); } - viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), - FemGui::TaskPostDataAtPoint::pointCallback, - marker); - connect(marker, &DataMarker::PointsChanged, this, &TaskPostDataAtPoint::onChange); + if (!marker->connSelectPoint) { + viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAtPoint::pointCallback, + marker); + marker->connSelectPoint = connect(marker, + &DataAtPointMarker::PointsChanged, + this, + &TaskPostDataAtPoint::onChange); + } } getTypedView()->DisplayMode.setValue(1); updateEnumerationList(getTypedView()->Field, ui->Field); @@ -1060,7 +1054,6 @@ std::string TaskPostDataAtPoint::ObjectVisible() void TaskPostDataAtPoint::onChange(double x, double y, double z) { - // call centerChanged only once ui->centerX->blockSignals(true); ui->centerY->blockSignals(true); @@ -1072,6 +1065,14 @@ void TaskPostDataAtPoint::onChange(double x, double y, double z) ui->centerY->blockSignals(false); ui->centerZ->blockSignals(false); centerChanged(0.0); + if (marker && marker->getView()) { + // leave mode + marker->getView()->setEditing(false); + marker->getView()->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAtPoint::pointCallback, + marker); + disconnect(marker->connSelectPoint); + } } void TaskPostDataAtPoint::centerChanged(double) @@ -1085,6 +1086,12 @@ void TaskPostDataAtPoint::centerChanged(double) ui->centerY->value().getValue(), ui->centerZ->value().getValue()); + if (marker && marker->countPoints() == 1) { + SbVec3f vec(ui->centerX->value().getValue(), + ui->centerY->value().getValue(), + ui->centerZ->value().getValue()); + marker->setPoint(0, vec); + } // recompute the feature to fill all fields with data at this point getObject()->recomputeFeature(); // show the data dialog by calling on_Field_activated with the field that is currently set @@ -1100,7 +1107,7 @@ void TaskPostDataAtPoint::pointCallback(void* ud, SoEventCallback* n) { const SoMouseButtonEvent* mbe = static_cast(n->getEvent()); Gui::View3DInventorViewer* view = static_cast(n->getUserData()); - DataMarker* pm = static_cast(ud); + PointMarker* pm = static_cast(ud); // Mark all incoming mouse button events as handled, especially, // to deactivate the selection node @@ -1121,18 +1128,19 @@ void TaskPostDataAtPoint::pointCallback(void* ud, SoEventCallback* n) else { pm->setPoint(0, point->getPoint()); } + QEvent* e = new QEvent(QEvent::User); QApplication::postEvent(pm, e); - // leave mode - view->setEditing(false); - view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); } } else if (mbe->getButton() != SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); view->setEditing(false); - view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), pointCallback, ud); + view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), + TaskPostDataAtPoint::pointCallback, + ud); + disconnect(pm->connSelectPoint); } } diff --git a/src/Mod/Fem/Gui/TaskPostBoxes.h b/src/Mod/Fem/Gui/TaskPostBoxes.h index 1f93894612fb..96481da6e462 100644 --- a/src/Mod/Fem/Gui/TaskPostBoxes.h +++ b/src/Mod/Fem/Gui/TaskPostBoxes.h @@ -50,6 +50,11 @@ class SoIndexedLineSet; class SoEventCallback; class SoMarkerSet; +namespace Fem +{ +class FemPostDataAlongLineFilter; +class FemPostDataAtPointFilter; +} // namespace Fem namespace FemGui { @@ -62,26 +67,28 @@ class PointMarker: public QObject Q_OBJECT public: - PointMarker(Gui::View3DInventorViewer* view, std::string ObjName); + PointMarker(Gui::View3DInventorViewer* view, App::DocumentObject* obj); ~PointMarker() override; void addPoint(const SbVec3f&); - int countPoints() const; void clearPoints() const; - -Q_SIGNALS: - void PointsChanged(double x1, double y1, double z1, double x2, double y2, double z2); + int countPoints() const; + SbVec3f getPoint(int idx) const; + void setPoint(int idx, const SbVec3f& pt) const; + Gui::View3DInventorViewer* getView() const; + App::DocumentObject* getObject() const; + QMetaObject::Connection connSelectPoint; protected: - void customEvent(QEvent* e) override; + std::string ObjectInvisible(); private: Gui::View3DInventorViewer* view; + App::DocumentObject* obj; ViewProviderPointMarker* vp; - std::string m_name; - std::string ObjectInvisible(); }; + class FemGuiExport ViewProviderPointMarker: public Gui::ViewProviderDocumentObject { PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderPointMarker); @@ -92,51 +99,42 @@ class FemGuiExport ViewProviderPointMarker: public Gui::ViewProviderDocumentObje protected: SoCoordinate3* pCoords; + SoMarkerSet* pMarker; friend class PointMarker; }; // *************************************************************************** -// data marker -class ViewProviderDataMarker; -class DataMarker: public QObject +// DataAlongLine markers +class DataAlongLineMarker: public PointMarker { Q_OBJECT public: - DataMarker(Gui::View3DInventorViewer* view, std::string ObjName); - ~DataMarker() override; - - void addPoint(const SbVec3f&); - int countPoints() const; - void setPoint(int idx, const SbVec3f& pt) const; + DataAlongLineMarker(Gui::View3DInventorViewer* view, Fem::FemPostDataAlongLineFilter* obj); Q_SIGNALS: - void PointsChanged(double x, double y, double z); + void PointsChanged(double x1, double y1, double z1, double x2, double y2, double z2); protected: void customEvent(QEvent* e) override; - -private: - Gui::View3DInventorViewer* view; - ViewProviderDataMarker* vp; - std::string m_name; - std::string ObjectInvisible(); }; -class FemGuiExport ViewProviderDataMarker: public Gui::ViewProviderDocumentObject +// *************************************************************************** +// DataAtPoint markers +class DataAtPointMarker: public PointMarker { - PROPERTY_HEADER_WITH_OVERRIDE(FemGui::ViewProviderDataMarker); + Q_OBJECT public: - ViewProviderDataMarker(); - ~ViewProviderDataMarker() override; + DataAtPointMarker(Gui::View3DInventorViewer* view, Fem::FemPostDataAtPointFilter* obj); + +Q_SIGNALS: + void PointsChanged(double x, double y, double z); protected: - SoCoordinate3* pCoords; - SoMarkerSet* pMarker; - friend class DataMarker; + void customEvent(QEvent* e) override; }; @@ -318,7 +316,7 @@ class TaskPostDataAlongLine: public TaskPostBox std::string ObjectVisible(); QWidget* proxy; std::unique_ptr ui; - PointMarker* marker; + DataAlongLineMarker* marker; }; @@ -348,7 +346,7 @@ class TaskPostDataAtPoint: public TaskPostBox std::string ObjectVisible(); QWidget* proxy; std::unique_ptr ui; - DataMarker* marker; + DataAtPointMarker* marker; };