X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetValidated.cpp;h=55abdb5035e40020379be97f8b0697d81c85d337;hb=39da05659a620750e11c2778a45be6f2dcb17308;hp=94f837e924f515748ea8ca98923f6acdf26af75d;hpb=840655e90a46754f2dd37aac6b888ec32eec69d3;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetValidated.cpp b/src/ModuleBase/ModuleBase_WidgetValidated.cpp index 94f837e92..55abdb503 100644 --- a/src/ModuleBase/ModuleBase_WidgetValidated.cpp +++ b/src/ModuleBase/ModuleBase_WidgetValidated.cpp @@ -24,8 +24,8 @@ ModuleBase_WidgetValidated::ModuleBase_WidgetValidated(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) -: ModuleBase_ModelWidget(theParent, theData, theParentId), isValidateBlocked(false), - myWorkshop(theWorkshop) +: ModuleBase_ModelWidget(theParent, theData, theParentId), + myWorkshop(theWorkshop), myIsInValidate(false) { } @@ -54,38 +54,71 @@ bool ModuleBase_WidgetValidated::setSelection(QList& theVa return isDone; } +//******************************************************************** +ObjectPtr ModuleBase_WidgetValidated::findPresentedObject(const AISObjectPtr& theAIS) const +{ + return myPresentedObject; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::storeAttributeValue() +{ + myIsInValidate = true; +} + +//******************************************************************** +void ModuleBase_WidgetValidated::restoreAttributeValue(const bool theValid) +{ + myIsInValidate = false; +} + //******************************************************************** bool ModuleBase_WidgetValidated::isValidInFilters(const ModuleBase_ViewerPrs& thePrs) { bool aValid = true; Handle(SelectMgr_EntityOwner) anOwner = thePrs.owner(); - // if an owern is null, the selection happens in the Object browser. + // if an owner is null, the selection happens in the Object browser. // creates a selection owner on the base of object shape and the object AIS object if (anOwner.IsNull() && thePrs.owner().IsNull() && thePrs.object().get()) { ResultPtr aResult = myWorkshop->selection()->getResult(thePrs); - if (aResult.get()) { + if (aResult.get() && aResult->shape().get()) { + // some results have no shape, e.g. the parameter one. So, they should not be validated GeomShapePtr aShape = aResult->shape(); - const TopoDS_Shape aTDShape = aShape->impl(); Handle(AIS_InteractiveObject) anIO = myWorkshop->selection()->getIO(thePrs); anOwner = new StdSelect_BRepOwner(aTDShape, anIO); + myPresentedObject = aResult; } + else + aValid = false; // only results with a shape can be filtered } - // finds + // checks the owner by the AIS context activated filters if (!anOwner.IsNull()) { - const SelectMgr_ListOfFilter& aFilters = myWorkshop->viewer()->AISContext()->Filters(); - SelectMgr_ListIteratorOfListOfFilter anIt(aFilters); - for (; anIt.More() && aValid; anIt.Next()) { - Handle(SelectMgr_Filter) aFilter = anIt.Value(); - //if (aFilter == myWorkshop->validatorFilter()) - // continue; - aValid = aFilter->IsOk(anOwner); + // 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); + + Handle(AIS_InteractiveContext) aContext = myWorkshop->viewer()->AISContext(); + if (!aContext.IsNull()) { + const SelectMgr_ListOfFilter& aFilters = aContext->Filters(); + SelectMgr_ListIteratorOfListOfFilter anIt(aFilters); + for (; anIt.More() && aValid; anIt.Next()) { + Handle(SelectMgr_Filter) aFilter = anIt.Value(); + aValid = aFilter->IsOk(anOwner); + } } + if (!isActivated) + activateFilters(false); } + // removes created owner - if (!anOwner.IsNull() && anOwner != thePrs.owner()) + if (!anOwner.IsNull() && anOwner != thePrs.owner()) { anOwner.Nullify(); + myPresentedObject = ObjectPtr(); + } return aValid; } @@ -103,10 +136,6 @@ bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& th return aValid; } - if (isValidateBlocked) - return true; - isValidateBlocked = true; - DataPtr aData = myFeature->data(); AttributePtr anAttribute = myFeature->attribute(attributeID()); @@ -143,7 +172,6 @@ bool ModuleBase_WidgetValidated::isValidSelection(const ModuleBase_ViewerPrs& th aLoop->flush(aRedispEvent); storeValidState(theValue, aValid); - isValidateBlocked = false; return aValid; } @@ -158,24 +186,19 @@ bool ModuleBase_WidgetValidated::isValidAttribute() const { SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - std::list aValidators; - std::list > anArguments; - aFactory->validators(myFeature->getKind(), attributeID(), aValidators, anArguments); - - DataPtr aData = myFeature->data(); AttributePtr anAttribute = myFeature->attribute(attributeID()); + std::string aValidatorID, anError; + return aFactory->validate(anAttribute, aValidatorID, anError); +} - std::list::iterator aValidator = aValidators.begin(); - std::list >::iterator aArgs = anArguments.begin(); - bool aValid = true; - for (; aValidator != aValidators.end() && aValid; aValidator++, aArgs++) { - const ModelAPI_AttributeValidator* aAttrValidator = - dynamic_cast(*aValidator); - if (aAttrValidator) { - aValid = aAttrValidator->isValid(anAttribute, *aArgs); - } - } - return aValid; +bool ModuleBase_WidgetValidated::isFilterActivated() const +{ + bool isActivated = false; + + Handle(SelectMgr_Filter) aSelFilter = myWorkshop->validatorFilter(); + ModuleBase_IViewer* aViewer = myWorkshop->viewer(); + + return aViewer->hasSelectionFilter(aSelFilter); } void ModuleBase_WidgetValidated::activateFilters(const bool toActivate) @@ -241,3 +264,35 @@ void ModuleBase_WidgetValidated::clearValidState() myInvalidPrs.clear(); } +//******************************************************************** +QList ModuleBase_WidgetValidated::getFilteredSelected() +{ + QList aSelected = myWorkshop->selection()->getSelected( + ModuleBase_ISelection::Viewer); + + QList anOBSelected = myWorkshop->selection()->getSelected( + ModuleBase_ISelection::Browser); + // filter the OB presentations + filterPresentations(anOBSelected); + if (!anOBSelected.isEmpty()) + ModuleBase_ISelection::appendSelected(anOBSelected, aSelected); + + return aSelected; +} + +//******************************************************************** +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); + } + if (aValidatedValues.size() != theValues.size()) { + theValues.clear(); + theValues = aValidatedValues; + } +}