X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModuleBase%2FModuleBase_WidgetValidated.cpp;h=3664c25c1d9bd4900ba01180c995eec107fcf874;hb=afbbacca198d72a90472539698aa055bd58c5e56;hp=b6ce46421a2604b77805073d95956e9b2a098fb2;hpb=20bfce4045f146fa9fe16148628ac0b7f4e72a0e;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetValidated.cpp b/src/ModuleBase/ModuleBase_WidgetValidated.cpp index b6ce46421..3664c25c1 100644 --- a/src/ModuleBase/ModuleBase_WidgetValidated.cpp +++ b/src/ModuleBase/ModuleBase_WidgetValidated.cpp @@ -1,9 +1,28 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include -#include +#include #include +#include #include +#include #include #include @@ -13,8 +32,9 @@ #include #include #include -#include +#include #include +#include #include #include @@ -46,6 +66,12 @@ ObjectPtr ModuleBase_WidgetValidated::findPresentedObject(const AISObjectPtr& th return myPresentedObject; } +//******************************************************************** +void ModuleBase_WidgetValidated::deactivate() +{ + clearValidatedCash(); +} + //******************************************************************** void ModuleBase_WidgetValidated::clearValidatedCash() { @@ -89,16 +115,65 @@ bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrsPtr& anOwner = new StdSelect_BRepOwner(aTDShape, anIO); myPresentedObject = aResult; } - else - aValid = false; // only results with a shape can be filtered + else { + //FeaturePtr aFeature = ModelAPI_Feature::feature(thePrs->object()); + FeaturePtr aFeature = std::dynamic_pointer_cast(thePrs->object()); + if (aFeature.get()) { + // Use feature as a reference to all its results + myPresentedObject = aFeature; + AttributePtr anAttr = attribute(); + std::string aType = anAttr->attributeType(); + + // Check that results of Feature is acceptable by filters for selection attribute + if (aType == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = + std::dynamic_pointer_cast(anAttr); + aSelectAttr->setValue(myPresentedObject, GeomShapePtr(), true); + GeomShapePtr aShape = aSelectAttr->value(); + if (!aShape.get() && aSelectAttr->contextFeature().get() && + aSelectAttr->contextFeature()->firstResult().get()) { + aShape = aSelectAttr->contextFeature()->firstResult()->shape(); + } + if (aShape.get()) { + const TopoDS_Shape aTDShape = aShape->impl(); + Handle(AIS_InteractiveObject) anIO = myWorkshop->selection()->getIO(thePrs); + anOwner = new StdSelect_BRepOwner(aTDShape, anIO); + } + else + aValid = false; + //aSelectAttr->setValue(ObjectPtr(), GeomShapePtr(), true); + } + else { + ResultPtr aResult = aFeature->firstResult(); + if (aResult.get()) { + GeomShapePtr aShapePtr = ModelAPI_Tools::shape(aResult); + if (aShapePtr.get()) { + const TopoDS_Shape aTDShape = aShapePtr->impl(); + AISObjectPtr aIOPtr = myWorkshop->findPresentation(aResult); + if (aIOPtr.get()) { + Handle(AIS_InteractiveObject) anIO = aIOPtr->impl(); + anOwner = new StdSelect_BRepOwner(aTDShape, anIO); + } + } + } + aValid = !anOwner.IsNull(); // only results with a shape can be filtered + } + } else + aValid = false; // only results with a shape can be filtered + } } // checks the owner by the AIS context activated filters if (!anOwner.IsNull()) { // the widget validator filter should be active, but during check by preselection // it is not yet activated, so we need to activate/deactivate it manually bool isActivated = isFilterActivated(); - if (!isActivated) - activateFilters(true); + if (!isActivated) { + QIntList aModuleSelectionFilters = myWorkshop->module()->selectionFilters(); + SelectMgr_ListOfFilter aSelectionFilters; + selectionFilters(aModuleSelectionFilters, aSelectionFilters); + /// after validation, the selection filters should be restored + myWorkshop->selectionActivate()->activateSelectionFilters(aSelectionFilters); + } Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); if (!aContext.IsNull()) { @@ -110,7 +185,11 @@ bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrsPtr& } } if (!isActivated) - activateFilters(false); + { + // reset filters set in activateSelectionFilters above + myWorkshop->selectionActivate()->updateSelectionFilters(); + clearValidatedCash(); + } } // removes created owner @@ -118,6 +197,16 @@ bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrsPtr& anOwner.Nullify(); myPresentedObject = ObjectPtr(); } + if (!aValid) { + // Clear attribute if it still has selection + AttributePtr anAttr = attribute(); + std::string aType = anAttr->attributeType(); + if (aType == ModelAPI_AttributeSelection::typeId()) { + AttributeSelectionPtr aSelectAttr = + std::dynamic_pointer_cast(anAttr); + aSelectAttr->removeTemporaryValues(); + } + } return aValid; } @@ -191,7 +280,7 @@ bool ModuleBase_WidgetValidated::isValidSelectionCustom(const ModuleBase_ViewerP } //******************************************************************** -bool ModuleBase_WidgetValidated::isValidAttribute(const AttributePtr& theAttribute) const +bool ModuleBase_WidgetValidated::isValidAttribute(const AttributePtr& theAttribute) { SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); @@ -200,6 +289,7 @@ bool ModuleBase_WidgetValidated::isValidAttribute(const AttributePtr& theAttribu return aFactory->validate(theAttribute, aValidatorID, anError); } +//******************************************************************** bool ModuleBase_WidgetValidated::isFilterActivated() const { bool isActivated = false; @@ -210,21 +300,11 @@ bool ModuleBase_WidgetValidated::isFilterActivated() const return aViewer->hasSelectionFilter(aSelFilter); } -bool ModuleBase_WidgetValidated::activateFilters(const bool toActivate) +//******************************************************************** +void ModuleBase_WidgetValidated::selectionFilters(QIntList& theModuleSelectionFilters, + SelectMgr_ListOfFilter& theSelectionFilters) { - ModuleBase_IViewer* aViewer = myWorkshop->viewer(); - - Handle(SelectMgr_Filter) aSelFilter = myWorkshop->validatorFilter(); - bool aHasSelectionFilter = aViewer->hasSelectionFilter(aSelFilter); - - if (toActivate) - aViewer->addSelectionFilter(aSelFilter); - else { - aViewer->removeSelectionFilter(aSelFilter); - clearValidatedCash(); - } - - return aHasSelectionFilter; + theSelectionFilters.Append(myWorkshop->validatorFilter()); } //******************************************************************** @@ -233,9 +313,21 @@ void ModuleBase_WidgetValidated::blockAttribute(const AttributePtr& theAttribute bool& isFlushesActived, bool& isAttributeSetInitializedBlocked, bool& isAttributeSendUpdatedBlocked) +{ + blockFeatureAttribute(theAttribute, myFeature, theToBlock, isFlushesActived, + isAttributeSetInitializedBlocked, isAttributeSendUpdatedBlocked); +} + +//******************************************************************** +void ModuleBase_WidgetValidated::blockFeatureAttribute(const AttributePtr& theAttribute, + const FeaturePtr& theFeature, + const bool& theToBlock, + bool& isFlushesActived, + bool& isAttributeSetInitializedBlocked, + bool& isAttributeSendUpdatedBlocked) { Events_Loop* aLoop = Events_Loop::loop(); - DataPtr aData = myFeature->data(); + DataPtr aData = theFeature->data(); if (theToBlock) { // blocks the flush signals to avoid the temporary objects visualization in the viewer // they should not be shown in order to do not lose highlight by erasing them @@ -361,12 +453,9 @@ QList ModuleBase_WidgetValidated::getFilteredSelected() void ModuleBase_WidgetValidated::filterPresentations(QList& theValues) { QList aValidatedValues; - - QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); - bool isDone = false; - for (; anIt != aLast; anIt++) { - if (isValidInFilters(*anIt)) - aValidatedValues.append(*anIt); + foreach(ModuleBase_ViewerPrsPtr aPrs, theValues) { + if (isValidInFilters(aPrs)) + aValidatedValues.append(aPrs); } if (aValidatedValues.size() != theValues.size()) { theValues.clear(); @@ -377,31 +466,42 @@ void ModuleBase_WidgetValidated::filterPresentations(QList& theValues) { - std::set aCompSolids; + std::set aFilterOut; // all objects that must be filtered out with their children QList aValidatedValues; // Collect compsolids. QList::const_iterator anIt = theValues.begin(), aLast = theValues.end(); - for (; anIt != aLast; anIt++) { + for(; anIt != aLast; anIt++) { const ModuleBase_ViewerPrsPtr& aViewerPrs = *anIt; ObjectPtr anObject = aViewerPrs->object(); - ResultCompSolidPtr aResultCompSolid = - std::dynamic_pointer_cast(anObject); - if(aResultCompSolid.get()) { - aCompSolids.insert(aResultCompSolid); + ResultBodyPtr aResultCompSolid = + std::dynamic_pointer_cast(anObject); + if (aResultCompSolid.get()) { + for(int aSubIndex = 0; aSubIndex < aResultCompSolid->numberOfSubs(); aSubIndex++) + aFilterOut.insert(aResultCompSolid->subResult(aSubIndex)); + } else { // it could be a whole feature selected, so, add all results of this feature + FeaturePtr aFeature = std::dynamic_pointer_cast(anObject); + if (aFeature.get()) { + std::list::const_iterator aRes = aFeature->results().cbegin(); + for(; aRes != aFeature->results().cend(); aRes++) + aFilterOut.insert(*aRes); + } } } // Filter sub-solids of compsolids. anIt = theValues.begin(); - for (; anIt != aLast; anIt++) { + for(; anIt != aLast; anIt++) { const ModuleBase_ViewerPrsPtr& aViewerPrs = *anIt; ObjectPtr anObject = aViewerPrs->object(); ResultPtr aResult = std::dynamic_pointer_cast(anObject); - ResultCompSolidPtr aResCompSolidPtr = ModelAPI_Tools::compSolidOwner(aResult); - if(aResCompSolidPtr.get() && (aCompSolids.find(aResCompSolidPtr) != aCompSolids.end())) { - // Skip sub-solid of compsolid. - continue; + while(aResult.get()) { + if (aFilterOut.find(aResult) != aFilterOut.end()) // skip if parent is filtered out + break; + aResult = ModelAPI_Tools::bodyOwner(aResult); // iterate all parents + } + if (aResult.get()) { + continue; // skip } else { aValidatedValues.append(*anIt); }