X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Filters.cpp;h=88ba16c9ad36518e8722fbb5326eea378693d354;hb=8d623696a0aa115c52e14f5e326eb6cb64a16f0d;hp=0921844d6456fbb13161d1b1e255052c935dd598;hpb=dfb689721a73f8b65b0f61b593ef6421409bbf7b;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Filters.cpp b/src/PartSet/PartSet_Filters.cpp index 0921844d6..88ba16c9a 100644 --- a/src/PartSet/PartSet_Filters.cpp +++ b/src/PartSet/PartSet_Filters.cpp @@ -1,51 +1,196 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: PartSet_Filters.cpp -// Created: 08 Nov 2014 -// Author: Vitaly SMETANNIKOV +// 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 "PartSet_Filters.h" #include #include "ModuleBase_IModule.h" +#include #include -#include +#include +#include +#include +#include #include #include +#include -IMPLEMENT_STANDARD_HANDLE(PartSet_GlobalFilter, ModuleBase_ShapeDocumentFilter); IMPLEMENT_STANDARD_RTTIEXT(PartSet_GlobalFilter, ModuleBase_ShapeDocumentFilter); +PartSet_GlobalFilter::PartSet_GlobalFilter(ModuleBase_IWorkshop* theWorkshop) + : ModuleBase_ShapeDocumentFilter(theWorkshop) +{ + addNonSelectableType(ModelAPI_ResultField::group().c_str()); + addNonSelectableType(ModelAPI_ResultGroup::group().c_str()); +} + + Standard_Boolean PartSet_GlobalFilter::IsOk(const Handle(SelectMgr_EntityOwner)& theOwner) const { + bool aValid = true; ModuleBase_Operation* anOperation = myWorkshop->module()->currentOperation(); // the shapes from different documents should be provided if there is no started operation // in order to show/hide results - if (!anOperation) - return true; - - if (ModuleBase_ShapeDocumentFilter::IsOk(theOwner)) { - std::shared_ptr aAISObj = AISObjectPtr(new GeomAPI_AISObject()); - if (theOwner->HasSelectable()) { - Handle(AIS_InteractiveObject) aAisObj = - Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); - if (!aAisObj.IsNull()) { - aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj)); + if (anOperation) { + aValid = false; + if (ModuleBase_ShapeDocumentFilter::IsOk(theOwner)) { + std::shared_ptr aAISObj = AISObjectPtr(new GeomAPI_AISObject()); + if (theOwner->HasSelectable()) { + Handle(AIS_InteractiveObject) aAisObj = + Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); + if (!aAisObj.IsNull()) { + aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj)); + } } + ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj); + if (aObj) { + ResultPtr aResult = std::dynamic_pointer_cast(aObj); + // result of parts belongs to PartSet document and can be selected only when PartSet + // is active in order to do not select the result of the active part. + if (aResult.get()) { + std::string aResultGroupName = aResult->groupName(); + if (aResultGroupName == ModelAPI_ResultPart::group()) { + SessionPtr aMgr = ModelAPI_Session::get(); + aValid = aMgr->activeDocument() == aMgr->moduleDocument(); + } else if (myNonSelectableTypes.contains(aResultGroupName.c_str())) { + aValid = Standard_False; + } else + aValid = Standard_True; + } + else { // possibly this code is obsolete, as a feature object can be selected in recovery + // only and there can not be Group feature + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature) { + aValid = !myNonSelectableTypes.contains(aFeature->getKind().c_str()); + } else + aValid = Standard_True; + } + } else + // This is not object controlled by the filter + aValid = Standard_True; } - ObjectPtr aObj = myWorkshop->findPresentedObject(aAISObj); - if (aObj) { - FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); - if (aFeature) { - return aFeature->getKind() != FeaturesPlugin_Group::ID(); - } else - return Standard_True; - } else - // This is not object controlled by the filter - return Standard_True; - } - return Standard_False; + } +#ifdef DEBUG_FILTERS + qDebug(QString("PartSet_GlobalFilter::IsOk = %1").arg(aValid).toStdString().c_str()); +#endif + return aValid; +} + +IMPLEMENT_STANDARD_RTTIEXT(PartSet_ResultGroupNameFilter, SelectMgr_Filter); + +void PartSet_ResultGroupNameFilter::setGroupNames(const std::set& theGroupNames) +{ + myGroupNames = theGroupNames; +} + +Standard_Boolean PartSet_ResultGroupNameFilter::IsOk( + const Handle(SelectMgr_EntityOwner)& theOwner) const +{ + std::shared_ptr aAISObj = AISObjectPtr(new GeomAPI_AISObject()); + if (theOwner->HasSelectable()) { + Handle(AIS_InteractiveObject) aAisObj = + Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable()); + if (!aAisObj.IsNull()) { + aAISObj->setImpl(new Handle(AIS_InteractiveObject)(aAisObj)); + } + } + ObjectPtr anObject = myWorkshop->findPresentedObject(aAISObj); + if (!anObject.get()) + return true; + + ResultPtr aResult = std::dynamic_pointer_cast(anObject); + // result of parts belongs to PartSet document and can be selected only when PartSet + // is active in order to do not select the result of the active part. + if (!aResult.get()) + return true; + + std::string aGroupName = aResult->groupName();// == ModelAPI_ResultPart::group()) { + if (myGroupNames.find(aGroupName) != myGroupNames.end()) + return false; // the object of the filtered type is found + + return true; +} + + +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; }