-// Copyright (C) 2014-2017 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
//
// 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
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include <ModuleBase_WidgetValidated.h>
#include <ModelAPI_Events.h>
#include <ModelAPI_ResultBody.h>
#include <ModelAPI_Tools.h>
+#include <ModelAPI_AttributeSelection.h>
#include <SelectMgr_ListIteratorOfListOfFilter.hxx>
#include <SelectMgr_EntityOwner.hxx>
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<ModelAPI_Feature>(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<ModelAPI_AttributeSelection>(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<TopoDS_Shape>();
+ 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<TopoDS_Shape>();
+ AISObjectPtr aIOPtr = myWorkshop->findPresentation(aResult);
+ if (aIOPtr.get()) {
+ Handle(AIS_InteractiveObject) anIO = aIOPtr->impl<Handle(AIS_InteractiveObject)>();
+ 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()) {
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<ModelAPI_AttributeSelection>(anAttr);
+ aSelectAttr->removeTemporaryValues();
+ }
+ }
return aValid;
}
void ModuleBase_WidgetValidated::filterPresentations(QList<ModuleBase_ViewerPrsPtr>& theValues)
{
QList<ModuleBase_ViewerPrsPtr> aValidatedValues;
-
- QList<ModuleBase_ViewerPrsPtr>::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();
//********************************************************************
void ModuleBase_WidgetValidated::filterCompSolids(QList<ModuleBase_ViewerPrsPtr>& theValues)
{
- std::set<ResultBodyPtr> aCompSolids;
+ std::set<ResultPtr> aFilterOut; // all objects that must be filtered out with their children
QList<ModuleBase_ViewerPrsPtr> aValidatedValues;
// Collect compsolids.
QList<ModuleBase_ViewerPrsPtr>::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();
ResultBodyPtr aResultCompSolid =
std::dynamic_pointer_cast<ModelAPI_ResultBody>(anObject);
- if(aResultCompSolid.get() && aResultCompSolid->numberOfSubs() > 0) {
- aCompSolids.insert(aResultCompSolid);
+ 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<ModelAPI_Feature>(anObject);
+ if (aFeature.get()) {
+ std::list<ResultPtr>::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<ModelAPI_Result>(anObject);
- ResultBodyPtr aResCompSolidPtr = ModelAPI_Tools::bodyOwner(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);
}