From 36a9b277899567c39eeb02fe2e8e510768d4a740 Mon Sep 17 00:00:00 2001 From: vsv Date: Wed, 8 Apr 2015 17:38:24 +0300 Subject: [PATCH] Issue #429: Activation of operations on selection --- src/PartSet/PartSet_Module.cpp | 1 + src/PartSet/PartSet_Validators.cpp | 61 +++++++++++++++++++----------- src/PartSet/PartSet_Validators.h | 8 ++++ src/SketchPlugin/plugin-Sketch.xml | 32 ++++++++-------- src/XGUI/XGUI_ActionsMgr.cpp | 46 ++++++++++++---------- 5 files changed, 91 insertions(+), 57 deletions(-) diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index b33326687..b81a64bb3 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -139,6 +139,7 @@ void PartSet_Module::registerValidators() aFactory->registerValidator("PartSet_CoincidentSelection", new PartSet_CoincidentSelection); aFactory->registerValidator("PartSet_HVDirSelection", new PartSet_HVDirSelection); aFactory->registerValidator("PartSet_TangentSelection", new PartSet_TangentSelection); + aFactory->registerValidator("PartSet_FilletSelection", new PartSet_FilletSelection); aFactory->registerValidator("PartSet_DifferentObjects", new PartSet_DifferentObjectsValidator); aFactory->registerValidator("PartSet_DifferentShapes", new ModelAPI_ShapeValidator); diff --git a/src/PartSet/PartSet_Validators.cpp b/src/PartSet/PartSet_Validators.cpp index 2837ba7bf..55f0157b0 100644 --- a/src/PartSet/PartSet_Validators.cpp +++ b/src/PartSet/PartSet_Validators.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #ifdef _DEBUG @@ -127,37 +128,53 @@ bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection) return (aCount == 1); } +bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection) const +{ + int aCount = shapesNbLines(theSelection); + return (aCount > 0) && (aCount < 3); +} + bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection) const { QList aList = theSelection->getSelected(); - ModuleBase_ViewerPrs aPrs; - if (aList.size() != 2) + if ((aList.size() == 0) || (aList.size() > 2)) return false; - ModuleBase_ViewerPrs aPrs1 = aList.first(); - ModuleBase_ViewerPrs aPrs2 = aList.last(); - - const TopoDS_Shape& aShape1 = aPrs1.shape(); - const TopoDS_Shape& aShape2 = aPrs2.shape(); - if (aShape1.IsNull() || aShape2.IsNull()) + ModuleBase_ViewerPrs aPrs = aList.first(); + const TopoDS_Shape& aShape = aPrs.shape(); + if (aShape.IsNull()) return false; - if ((aShape1.ShapeType() != TopAbs_EDGE) || (aShape2.ShapeType() != TopAbs_EDGE)) + if (aShape.ShapeType() != TopAbs_EDGE) return false; - TopoDS_Edge aEdge1 = TopoDS::Edge(aShape1); - TopoDS_Edge aEdge2 = TopoDS::Edge(aShape2); - - Standard_Real aStart, aEnd; - Handle(Geom_Curve) aCurve1 = BRep_Tool::Curve(aEdge1, aStart, aEnd); - Handle(Geom_Curve) aCurve2 = BRep_Tool::Curve(aEdge2, aStart, aEnd); - - GeomAdaptor_Curve aAdaptor1(aCurve1); - GeomAdaptor_Curve aAdaptor2(aCurve2); - if (aAdaptor1.GetType() == GeomAbs_Circle) - return aAdaptor2.GetType() == GeomAbs_Line; - else if (aAdaptor2.GetType() == GeomAbs_Circle) - return aAdaptor1.GetType() == GeomAbs_Line; + std::shared_ptr aShapePtr(new GeomAPI_Shape); + aShapePtr->setImpl(new TopoDS_Shape(aShape)); + GeomAPI_Edge aEdge1(aShapePtr); + + if (aEdge1.isLine() || aEdge1.isArc()) { + if (aList.size() == 2) { + // Check second selection + aPrs = aList.last(); + const TopoDS_Shape& aShape2 = aPrs.shape(); + if (aShape2.IsNull()) + return false; + + if (aShape2.ShapeType() != TopAbs_EDGE) + return false; + + std::shared_ptr aShapePtr2(new GeomAPI_Shape); + aShapePtr2->setImpl(new TopoDS_Shape(aShape2)); + GeomAPI_Edge aEdge2(aShapePtr2); + if (aEdge1.isLine() && aEdge2.isArc()) + return true; + else if (aEdge1.isArc() && aEdge2.isLine()) + return true; + else + return false; + } else + return true; + } return false; } diff --git a/src/PartSet/PartSet_Validators.h b/src/PartSet/PartSet_Validators.h index 101bba5f9..7d78aeb10 100644 --- a/src/PartSet/PartSet_Validators.h +++ b/src/PartSet/PartSet_Validators.h @@ -90,6 +90,14 @@ class PartSet_TangentSelection : public ModuleBase_SelectionValidator PARTSET_EXPORT virtual bool isValid(const ModuleBase_ISelection* theSelection) const; }; +//! \ingroup Validators +//! A class to validate a selection for Fillet constraints operation +class PartSet_FilletSelection : public ModuleBase_SelectionValidator +{ + public: + PARTSET_EXPORT virtual bool isValid(const ModuleBase_ISelection* theSelection) const; +}; + ////////////// Attribute validators //////////////// diff --git a/src/SketchPlugin/plugin-Sketch.xml b/src/SketchPlugin/plugin-Sketch.xml index 323120ce9..03a092c82 100644 --- a/src/SketchPlugin/plugin-Sketch.xml +++ b/src/SketchPlugin/plugin-Sketch.xml @@ -204,21 +204,6 @@ - - - - - - - - @@ -235,6 +220,23 @@ + + + + + + + + + + diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 9e7ce02ae..129fdb2cf 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -131,35 +131,41 @@ void XGUI_ActionsMgr::updateOnViewSelection() if (!myOperationMgr->hasOperation()) return; - ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); - FeaturePtr anActiveFeature = anOperation->feature(); - if(!anActiveFeature.get()) + QStringList aIdList = myOperationMgr->operationList(); + //ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + //FeaturePtr anActiveFeature = anOperation->feature(); + //if(!anActiveFeature.get()) + if (aIdList.isEmpty()) return; - QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); + //QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); XGUI_Selection* aSelection = myWorkshop->selector()->selection(); if (aSelection->getSelected().size() == 0) { - foreach(QString aId, nestedCommands(aFeatureId)) { - setActionEnabled(aId, true); + foreach(QString aFeatureId, aIdList) { + foreach(QString aId, nestedCommands(aFeatureId)) { + setActionEnabled(aId, true); + } } } else { SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - foreach(QString aId, nestedCommands(aFeatureId)) { - std::list aValidators; - std::list > anArguments; - aFactory->validators(aId.toStdString(), aValidators, anArguments); - std::list::iterator aValidator = aValidators.begin(); - std::list >::iterator aValidatorArgs = anArguments.begin(); - for (; aValidator != aValidators.end(); aValidator++, aValidatorArgs++) { - if (!(*aValidator)) - continue; - const ModuleBase_SelectionValidator* aSelValidator = - dynamic_cast(*aValidator); - if (!aSelValidator) - continue; - setActionEnabled(aId, aSelValidator->isValid(aSelection, *aValidatorArgs)); + foreach(QString aFeatureId, aIdList) { + foreach(QString aId, nestedCommands(aFeatureId)) { + std::list aValidators; + std::list > anArguments; + aFactory->validators(aId.toStdString(), aValidators, anArguments); + std::list::iterator aValidator = aValidators.begin(); + std::list >::iterator aValidatorArgs = anArguments.begin(); + for (; aValidator != aValidators.end(); aValidator++, aValidatorArgs++) { + if (!(*aValidator)) + continue; + const ModuleBase_SelectionValidator* aSelValidator = + dynamic_cast(*aValidator); + if (!aSelValidator) + continue; + setActionEnabled(aId, aSelValidator->isValid(aSelection, *aValidatorArgs)); + } } } } -- 2.39.2