-// Copyright (C) 2014-2020 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2022 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
#include <ModelAPI_Events.h>
#include <ModelAPI_FiltersFactory.h>
#include <ModelAPI_ResultBody.h>
+
#include <GeomAPI_ShapeExplorer.h>
+#include <GeomAPI_Edge.h>
#include <Events_Loop.h>
#include <Config_ValidatorReader.h>
#include <QCheckBox>
#include <QDir>
+#ifdef WIN32
+#pragma warning(disable : 4456) // for nested foreach
+#endif
+
FeaturePtr ModuleBase_WidgetSelectionFilter::SelectorFeature;
std::string ModuleBase_WidgetSelectionFilter::AttributeId;
connect(aWidget, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)),
theParent, SIGNAL(focusOutWidget(ModuleBase_ModelWidget*)));
connect(aWidget, SIGNAL(objectUpdated()), theParent, SLOT(onObjectUpdated()));
+ aWidget->enableFocusProcessing();
}
aLayout->addWidget(aParamsWgt);
}
std::string aText = myFiltersCombo->itemText(theIndex).toStdString();
std::list<FilterPtr>::iterator aIt;
- int i;
std::string aFilter;
std::map<std::string, FilterPtr>::const_iterator aFound = myFilters.find(aText);
if (aFound == myFilters.end()) {
clearCurrentSelection();
+ FiltersFeaturePtr aFiltersFeature =
+ std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(myFeature);
+ static SessionPtr aSession = ModelAPI_Session::get();
+ std::list< std::pair<ResultPtr, GeomShapePtr> > aResList =
+ aSession->filters()->select(aFiltersFeature, (GeomAPI_Shape::ShapeType)mySelectionType);
+
BRep_Builder aBuilder;
TopoDS_Compound aComp;
aBuilder.MakeCompound(aComp);
- DocumentPtr aDoc = myFeature->document();
- int aNb = aDoc->size(ModelAPI_ResultBody::group());
- ObjectPtr aObj;
- ResultBodyPtr aBody;
- for (int i = 0; i < aNb; i++) {
- aObj = aDoc->object(ModelAPI_ResultBody::group(), i);
- aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObj);
- GeomShapePtr aShape = aBody->shape();
- std::list<GeomShapePtr> aSubShapes =
- aShape->subShapes((GeomAPI_Shape::ShapeType)mySelectionType);
- TopTools_MapOfShape alreadyThere;
- std::list<GeomShapePtr>::const_iterator aShapesIt;
- for (aShapesIt = aSubShapes.cbegin(); aShapesIt != aSubShapes.cend(); aShapesIt++) {
- GeomShapePtr aSubShape = (*aShapesIt);
- TopoDS_Shape aTShape = aSubShape->impl<TopoDS_Shape>();
- if (!alreadyThere.Add(aTShape))
- continue;
- static SessionPtr aSession = ModelAPI_Session::get();
- bool isValid = aSession->filters()->isValid(myFeature, aBody, aSubShape);
- if (isValid) {
- aBuilder.Add(aComp, aTShape);
- ModuleBase_ViewerPrsPtr aValue(new ModuleBase_ViewerPrs(aObj, aSubShape));
- myValues.append(aValue);
- }
- }
+ std::list< std::pair<ResultPtr, GeomShapePtr> >::const_iterator itSelected = aResList.cbegin();
+ for (; itSelected != aResList.cend(); itSelected++) {
+ ResultPtr aCurRes = (*itSelected).first;
+ GeomShapePtr aSubShape = (*itSelected).second;
+ TopoDS_Shape aTShape = aSubShape->impl<TopoDS_Shape>();
+ aBuilder.Add(aComp, aTShape);
+ ModuleBase_ViewerPrsPtr aValue (new ModuleBase_ViewerPrs(aCurRes, aSubShape));
+ myValues.append(aValue);
}
if (myValues.size() > 0)
void ModuleBase_WidgetSelectionFilter::onShowOnly(bool theShow)
{
- if (myPreview.IsNull())
- return;
Handle(AIS_InteractiveContext) aCtx = myWorkshop->viewer()->AISContext();
-
if (theShow) {
AIS_ListOfInteractive aList;
aCtx->DisplayedObjects(AIS_KOI_Shape, -1, aList);
- aList.Remove(myPreview);
+ if (!myPreview.IsNull())
+ aList.Remove(myPreview);
if (aList.Size() > 0)
myListIO = aList;
}
AIS_ListOfInteractive::const_iterator aIt;
Handle(AIS_Shape) aShapeIO;
+ bool isModified = false;
for (aIt = myListIO.cbegin(); aIt != myListIO.cend(); aIt++) {
aShapeIO = Handle(AIS_Shape)::DownCast(*aIt);
if (!aShapeIO.IsNull()) {
- if (theShow)
- aCtx->Erase(aShapeIO, false);
+ if (theShow) {
+ if (aCtx->IsDisplayed(aShapeIO)) {
+ aCtx->Erase(aShapeIO, false);
+ isModified = true;
+ }
+ }
else {
- aCtx->Display(aShapeIO, false);
- std::shared_ptr<GeomAPI_AISObject> anAISObj = AISObjectPtr(new GeomAPI_AISObject());
- anAISObj->setImpl(new Handle(AIS_InteractiveObject)(aShapeIO));
- myWorkshop->applyCurrentSelectionModes(anAISObj);
+ if (!aCtx->IsDisplayed(aShapeIO)) {
+ aCtx->Display(aShapeIO, false);
+ std::shared_ptr<GeomAPI_AISObject> anAISObj = AISObjectPtr(new GeomAPI_AISObject());
+ anAISObj->setImpl(new Handle(AIS_InteractiveObject)(aShapeIO));
+ myWorkshop->applyCurrentSelectionModes(anAISObj);
+ isModified = true;
+ }
}
}
}
- myWorkshop->viewer()->update();
+ if (isModified)
+ myWorkshop->viewer()->update();
}
void ModuleBase_WidgetSelectionFilter::updateSelectBtn()
{
int aNb = myValues.size();
myNbLbl->setText(QString::number(aNb));
- if (aNb == 0)
+ if (aNb == 0) {
myFeature->setError(translate("Selection is empty").toStdString(), false, false);
+ myShowBtn->setChecked(false);
+ onShowOnly(false);
+ myShowBtn->setEnabled(false);
+ }
else {
myFeature->setError("", false, false);
myFeature->data()->execState(ModelAPI_StateDone);
+ myShowBtn->setEnabled(true);
}
}