From: dbv Date: Fri, 26 Feb 2016 12:09:52 +0000 (+0300) Subject: Bug #1341: selected point on circle X-Git-Tag: V_2.2.0~61 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=682438a4bfd569dd672e736f30e325345c49943e;p=modules%2Fshaper.git Bug #1341: selected point on circle --- diff --git a/src/PartSet/PartSet_Filters.cpp b/src/PartSet/PartSet_Filters.cpp index 31f1872c7..f2c82f246 100644 --- a/src/PartSet/PartSet_Filters.cpp +++ b/src/PartSet/PartSet_Filters.cpp @@ -8,14 +8,15 @@ #include #include "ModuleBase_IModule.h" +#include #include #include #include -#include #include #include +#include IMPLEMENT_STANDARD_HANDLE(PartSet_GlobalFilter, ModuleBase_ShapeDocumentFilter); @@ -50,7 +51,7 @@ Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)& else { FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); if (aFeature) { - aValid = aFeature->getKind() != FeaturesPlugin_Group::ID(); + aValid = aFeature->getKind() != "Group"; } else aValid = Standard_True; } @@ -64,3 +65,66 @@ Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)& #endif return aValid; } + +IMPLEMENT_STANDARD_HANDLE(PartSet_CirclePointFilter, SelectMgr_Filter); +IMPLEMENT_STANDARD_RTTIEXT(PartSet_CirclePointFilter, SelectMgr_Filter); + +Standard_Boolean PartSet_CirclePointFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + ModuleBase_Operation* anOperation = myWorkshop->module()->currentOperation(); + if(!anOperation) { + return Standard_True; + } + + if(theOwner->HasSelectable() == Standard_False) { + return Standard_True; + } + + Handle(StdSelect_BRepOwner) aBrepOwner = Handle(StdSelect_BRepOwner)::DownCast(theOwner); + if(aBrepOwner.IsNull()) { + return Standard_True; + } + + const TopoDS_Shape& aShape = aBrepOwner->Shape(); + if(aShape.IsNull() || aShape.ShapeType() != TopAbs_VERTEX) { + return Standard_True; + } + + Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast(theOwner->Selectable()); + if(aResultPrs.IsNull()) { + return Standard_True; + } + + std::shared_ptr aGeomAISObj(new GeomAPI_AISObject()); + aGeomAISObj->setImpl(new Handle(AIS_InteractiveObject)(aResultPrs)); + ObjectPtr anObj = myWorkshop->findPresentedObject(aGeomAISObj); + if(!anObj.get()) { + return Standard_True; + } + + ResultPtr aResult = std::dynamic_pointer_cast(anObj); + if(!aResult.get()) { + return Standard_True; + } + + DocumentPtr aDocument = aResult->document(); + if(!aDocument.get()) { + return Standard_True; + } + + FeaturePtr aFeature = aDocument->feature(aResult); + if(!aFeature.get() || aFeature->getKind() != "SketchCircle") { + return Standard_True; + } + + const TopoDS_Shape anOwnerShape = aResultPrs->Shape(); + if(anOwnerShape.ShapeType() == TopAbs_EDGE) { + return Standard_False; + } + +#ifdef DEBUG_FILTERS + qDebug(QString("PartSet_ShapeDocumentFilter::IsOk = %1").arg(aValid).toStdString().c_str()); +#endif + + return Standard_True; +} diff --git a/src/PartSet/PartSet_Filters.h b/src/PartSet/PartSet_Filters.h index aba48302f..c4e727035 100644 --- a/src/PartSet/PartSet_Filters.h +++ b/src/PartSet/PartSet_Filters.h @@ -31,4 +31,32 @@ public: DEFINE_STANDARD_RTTI(PartSet_GlobalFilter) }; + +/// \class PartSet_CirclePointFilter +/// \ingroup GUI +/// \brief A filter which provide filtering of selection in 3d viewer. +/// Installing of this filter disables selection of point on circle in sketch +DEFINE_STANDARD_HANDLE(PartSet_CirclePointFilter, SelectMgr_Filter); +class PartSet_CirclePointFilter: public SelectMgr_Filter +{ +public: + + /// Constructor + /// \param theWorkshop instance of workshop interface + Standard_EXPORT PartSet_CirclePointFilter(ModuleBase_IWorkshop* theWorkshop): + SelectMgr_Filter(), + myWorkshop(theWorkshop) {}; + + /// Returns True if the given owner is acceptable for selection + /// \param theOwner the selected owner + Standard_EXPORT virtual Standard_Boolean IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const; + + DEFINE_STANDARD_RTTI(PartSet_CirclePointFilter) + +private: + + /// Reference to workshop + ModuleBase_IWorkshop* myWorkshop; +}; + #endif \ No newline at end of file diff --git a/src/PartSet/PartSet_SketcherMgr.cpp b/src/PartSet/PartSet_SketcherMgr.cpp index b261c2ca4..4c2b63a6f 100755 --- a/src/PartSet/PartSet_SketcherMgr.cpp +++ b/src/PartSet/PartSet_SketcherMgr.cpp @@ -864,6 +864,12 @@ void PartSet_SketcherMgr::startSketch(ModuleBase_Operation* theOperation) aFeature->setDisplayed(true); } + if(myCirclePointFilter.IsNull()) { + myCirclePointFilter = new PartSet_CirclePointFilter(myModule->workshop()); + } + + myModule->workshop()->viewer()->addSelectionFilter(myCirclePointFilter); + if (myPlaneFilter.IsNull()) myPlaneFilter = new ModuleBase_ShapeInPlaneFilter(); @@ -898,6 +904,8 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) XGUI_Displayer* aDisplayer = aConnector->workshop()->displayer(); // The sketch was aborted myCurrentSketch = CompositeFeaturePtr(); + // TODO: move this outside of if-else + myModule->workshop()->viewer()->removeSelectionFilter(myCirclePointFilter); myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter); // Erase all sketcher objects @@ -940,6 +948,8 @@ void PartSet_SketcherMgr::stopSketch(ModuleBase_Operation* theOperation) myCurrentSketch->setDisplayed(true); myCurrentSketch = CompositeFeaturePtr(); + + myModule->workshop()->viewer()->removeSelectionFilter(myCirclePointFilter); myModule->workshop()->viewer()->removeSelectionFilter(myPlaneFilter); Events_Loop::loop()->flush(aDispEvent); diff --git a/src/PartSet/PartSet_SketcherMgr.h b/src/PartSet/PartSet_SketcherMgr.h index 113abadd2..ef5fb511a 100644 --- a/src/PartSet/PartSet_SketcherMgr.h +++ b/src/PartSet/PartSet_SketcherMgr.h @@ -9,6 +9,7 @@ #include "PartSet.h" +#include "PartSet_Filters.h" #include "PartSet_Tools.h" #include @@ -356,6 +357,7 @@ private: CompositeFeaturePtr myCurrentSketch; + Handle(PartSet_CirclePointFilter) myCirclePointFilter; Handle(ModuleBase_ShapeInPlaneFilter) myPlaneFilter; FeatureToSelectionMap myCurrentSelection; bool myPreviousUpdateViewerEnabled;