-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2023 CEA, EDF
//
// 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_WidgetMultiSelector.h>
+#include <GeomAPI_AISObject.h>
+
#include <ModuleBase_ActionIntParameter.h>
#include <ModuleBase_Definitions.h>
#include <ModuleBase_Events.h>
#include <ModuleBase_IModule.h>
#include <ModuleBase_ISelection.h>
#include <ModuleBase_ISelectionActivate.h>
+#include <ModuleBase_IPropertyPanel.h>
#include <ModuleBase_IViewer.h>
#include <ModuleBase_IWorkshop.h>
#include <ModuleBase_ListView.h>
+#include <ModuleBase_ResultPrs.h>
#include <ModuleBase_Tools.h>
#include <ModuleBase_ViewerPrs.h>
#include <ModuleBase_WidgetShapeSelector.h>
+#include <ModuleBase_ChoiceCtrl.h>
+#include <ModuleBase_WidgetSelectionFilter.h>
#include <ModelAPI_Data.h>
#include <ModelAPI_Object.h>
#include <Config_WidgetAPI.h>
+#include <AIS_InteractiveObject.hxx>
+
#include <QGridLayout>
#include <QLabel>
#include <QListWidget>
#include <QClipboard>
#include <QTimer>
#include <QMainWindow>
+#include <QCheckBox>
+#include <QPushButton>
#include <memory>
#include <string>
}
#endif
+
+QStringList getIconsList(const QStringList& theNames)
+{
+ QStringList aIcons;
+ foreach (QString aName, theNames) {
+ QString aUName = aName.toUpper();
+ if ((aUName == "VERTICES") || (aUName == "VERTEX"))
+ aIcons << ":pictures/vertex32.png";
+ else if ((aUName == "EDGES") || (aUName == "EDGE"))
+ aIcons << ":pictures/edge32.png";
+ else if ((aUName == "FACES") || (aUName == "FACE"))
+ aIcons << ":pictures/face32.png";
+ else if ((aUName == "SOLIDS") || (aUName == "SOLID"))
+ aIcons << ":pictures/solid32.png";
+ }
+ return aIcons;
+}
+
+/// Stores default values of selected option (selection mode)
+/// It is used only in case if myTypeCtrl is used
+static QMap<std::string, std::string> defaultValues;
+
+
ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParent,
ModuleBase_IWorkshop* theWorkshop,
const Config_WidgetAPI* theData)
: ModuleBase_WidgetSelector(theParent, theWorkshop, theData),
- myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1)
+ myIsSetSelectionBlocked(false), myCurrentHistoryIndex(-1),
+ myIsFirst(true), myFiltersWgt(0), myShowOnlyBtn(0)
{
- QGridLayout* aMainLay = new QGridLayout(this);
- ModuleBase_Tools::adjustMargins(aMainLay);
+ std::string aPropertyTypes = theData->getProperty("shape_types");
+ QString aTypesStr = aPropertyTypes.c_str();
+ myShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts);
+ myIsUseChoice = theData->getBooleanAttribute("use_choice", false);
- QLabel* aTypeLabel = new QLabel(tr("Type"), this);
- aMainLay->addWidget(aTypeLabel, 0, 0);
+ QString aAllowedList(theData->getProperty("allow_objects").c_str());
+ if (!aAllowedList.isEmpty())
+ myAllowedObjects = aAllowedList.split(' ', QString::SkipEmptyParts);
- myTypeCombo = new QComboBox(this);
- // There is no sense to parameterize list of types while we can not parameterize selection mode
+ myMainLayout = new QVBoxLayout(this);
+ ModuleBase_Tools::adjustMargins(myMainLayout);
- std::string aPropertyTypes = theData->getProperty("type_choice");
- QString aTypesStr = aPropertyTypes.c_str();
- QStringList aShapeTypes = aTypesStr.split(' ', QString::SkipEmptyParts);
- myIsUseChoice = theData->getBooleanAttribute("use_choice", false);
+ QStringList aIconsList;
+ std::string aIcons = theData->getProperty("type_icons");
+ if (aIcons.size() > 0)
+ aIconsList = QString(aIcons.c_str()).split(' ', QString::SkipEmptyParts);
+
+ if (aIconsList.size() != myShapeTypes.size())
+ aIconsList = getIconsList(myShapeTypes);
- if (!aShapeTypes.empty())
- myTypeCombo->addItems(aShapeTypes);
- aMainLay->addWidget(myTypeCombo, 0, 1);
+ myTypeCtrl = new ModuleBase_ChoiceCtrl(this, myShapeTypes, aIconsList);
+ myTypeCtrl->setLabel(tr("Type"));
+ if (!myShapeTypes.empty()) {
+ std::string aDefType = theData->getProperty("default_type");
+ if (aDefType.size() > 0) {
+ bool aOk = false;
+ int aId = QString(aDefType.c_str()).toInt(&aOk);
+ if (aOk) {
+ myTypeCtrl->setValue(aId);
+ myDefMode = myShapeTypes.at(aId).toStdString();
+ }
+ }
+ if (myDefMode.size() == 0) {
+ myTypeCtrl->setValue(0);
+ myDefMode = myShapeTypes.first().toStdString();
+ }
+ }
+ myMainLayout->addWidget(myTypeCtrl);
+
+ // There is no sense to parameterize list of types while we can not parameterize selection mode
// if the xml definition contains one type, the controls to select a type should not be shown
- if (aShapeTypes.size() <= 1 || !myIsUseChoice) {
- aTypeLabel->setVisible(false);
- myTypeCombo->setVisible(false);
+ if (myShapeTypes.size() <= 1 || !myIsUseChoice) {
+ myTypeCtrl->setVisible(false);
}
QString aLabelText = translate(theData->getProperty("label"));
- QLabel* aListLabel = new QLabel(aLabelText, this);
- aMainLay->addWidget(aListLabel, 1, 0);
- // if the xml definition contains one type, an information label
- // should be shown near to the latest
- if (aShapeTypes.size() <= 1) {
- QString aLabelIcon = QString::fromStdString(theData->widgetIcon());
- if (!aLabelIcon.isEmpty()) {
- QLabel* aSelectedLabel = new QLabel("", this);
- aSelectedLabel->setPixmap(ModuleBase_IconFactory::loadPixmap(aLabelIcon));
- aMainLay->addWidget(aSelectedLabel, 1, 1);
+ if (aLabelText.size() > 0) {
+ QWidget* aLabelWgt = new QWidget(this);
+ QHBoxLayout* aLabelLayout = new QHBoxLayout(aLabelWgt);
+ aLabelLayout->setContentsMargins(0, 0, 0, 0);
+ myMainLayout->addWidget(aLabelWgt);
+
+ QLabel* aListLabel = new QLabel(aLabelText, this);
+ aLabelLayout->addWidget(aListLabel);
+ // if the xml definition contains one type, an information label
+ // should be shown near to the latest
+ if (myShapeTypes.size() <= 1) {
+ QString aLabelIcon = QString::fromStdString(theData->widgetIcon());
+ if (!aLabelIcon.isEmpty()) {
+ QLabel* aSelectedLabel = new QLabel("", this);
+ aSelectedLabel->setPixmap(ModuleBase_IconFactory::loadPixmap(aLabelIcon));
+ aLabelLayout->addWidget(aSelectedLabel);
+ aLabelLayout->addStretch(1);
+ }
}
- aMainLay->setColumnStretch(2, 1);
}
- QString aToolTip = QString::fromStdString(theData->widgetTooltip());
+ QString aToolTip = translate(theData->widgetTooltip());
QString anObjName = QString::fromStdString(attributeID());
myListView = new ModuleBase_ListView(this, anObjName, aToolTip);
connect(myListView->getControl(), SIGNAL(itemSelectionChanged()), SLOT(onListSelection()));
connect(myListView, SIGNAL(deleteActionClicked()), SLOT(onDeleteItem()));
+ connect(myListView, SIGNAL(listActivated()), SLOT(onListActivated()));
+
+ myMainLayout->addWidget(myListView->getControl());
+ connect(myTypeCtrl, SIGNAL(valueChanged(int)), this, SLOT(onSelectionTypeChanged()));
- aMainLay->addWidget(myListView->getControl(), 2, 0, 1, -1);
- aMainLay->setRowStretch(2, 1);
- //aMainLay->addWidget(new QLabel(this)); //FIXME(sbh)???
- //aMainLay->setRowMinimumHeight(3, 20);
- //this->setLayout(aMainLay);
- connect(myTypeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onSelectionTypeChanged()));
+ myUseFilters = theData->getProperty("use_filters");
+ if (myUseFilters.length() > 0) {
+ QWidget* aFltrWgt = new QWidget(this);
+ QHBoxLayout* aFltrLayout = new QHBoxLayout(aFltrWgt);
+
+ myFiltersWgt = new ModuleBase_FilterStarter(myUseFilters, aFltrWgt, theWorkshop);
+ aFltrLayout->addWidget(myFiltersWgt);
+
+ aFltrLayout->addStretch();
+
+ myShowOnlyBtn = new QPushButton(tr("Show only"), aFltrWgt);
+ myShowOnlyBtn->setCheckable(true);
+ myShowOnlyBtn->setChecked(false);
+ connect(myShowOnlyBtn, SIGNAL(toggled(bool)), SLOT(onShowOnly(bool)));
+ aFltrLayout->addWidget(myShowOnlyBtn);
+
+ myMainLayout->addWidget(aFltrWgt);
+ }
+
+ bool aSameTop = theData->getBooleanAttribute("same_topology", false);
+ if (aSameTop) {
+ myGeomCheck = new QCheckBox(tr("Add elements that share the same topology"), this);
+ myMainLayout->addWidget(myGeomCheck);
+ connect(myGeomCheck, SIGNAL(toggled(bool)), SLOT(onSameTopology(bool)));
+ }
+ else
+ myGeomCheck = 0;
myIsNeutralPointClear = theData->getBooleanAttribute("clear_in_neutral_point", true);
+ if (myShapeTypes.size() > 1 || myIsUseChoice) {
+ if (defaultValues.contains(myFeatureId + attributeID())) {
+ myDefMode = defaultValues[myFeatureId + attributeID()];
+ myTypeCtrl->setValue(myDefMode.c_str());
+ }
+ }
}
ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
{
ModuleBase_WidgetSelector::activateCustom();
- myWorkshop->module()->activateCustomPrs(myFeature,
+ ModuleBase_IModule* aModule = myWorkshop->module();
+ aModule->activateCustomPrs(myFeature,
ModuleBase_IModule::CustomizeHighlightedObjects, true);
clearSelectedHistory();
- myWorkshop->updateCommandStatus();
+ if (myAllowedObjects.length() > 0) {
+ Handle(SelectMgr_Filter) aFilter = aModule->selectionFilter(SF_GlobalFilter);
+ if (!aFilter.IsNull()) {
+ Handle(ModuleBase_ShapeDocumentFilter) aDocFilter =
+ Handle(ModuleBase_ShapeDocumentFilter)::DownCast(aFilter);
+ if (!aDocFilter.IsNull()) {
+ QStringList aSelFilters = aDocFilter->nonSelectableTypes();
+ foreach(QString aType, aSelFilters) {
+ if (aSelFilters.contains(aType)) {
+ aDocFilter->removeNonSelectableType(aType);
+ myTmpAllowed.append(aType);
+ }
+ }
+ }
+ }
+ }
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::deactivate()
{
+ myWorkshop->module()->enableCustomModes();
+
ModuleBase_WidgetSelector::deactivate();
+ if (myVisibleObjects.size())
+ myShowOnlyBtn->setChecked(false);
myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
clearSelectedHistory();
+ if (myTmpAllowed.length() > 0) {
+ ModuleBase_IModule* aModule = myWorkshop->module();
+ Handle(SelectMgr_Filter) aFilter = aModule->selectionFilter(SF_GlobalFilter);
+ if (!aFilter.IsNull()) {
+ Handle(ModuleBase_ShapeDocumentFilter) aDocFilter =
+ Handle(ModuleBase_ShapeDocumentFilter)::DownCast(aFilter);
+ if (!aDocFilter.IsNull()) {
+ foreach(QString aType, myTmpAllowed) {
+ aDocFilter->addNonSelectableType(aType);
+ }
+ }
+ }
+ myTmpAllowed.clear();
+ }
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::updateAfterDeactivation()
+{
+ // restore previous Undo/Redo workshop state
+ myWorkshop->updateCommandStatus();
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::updateAfterActivation()
+{
+ // fill Undo/Redo actions with current information
myWorkshop->updateCommandStatus();
}
std::string aType = anAttribute->attributeType();
if (aType == ModelAPI_AttributeSelectionList::typeId()) {
AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
+ if (myTypeCtrl->isVisible()) {
+ std::string aMode = myTypeCtrl->textValue().toStdString();
+ if (myIsFirst && (!myDefMode.empty()))
+ aMode = myDefMode;
+
+ aSelectionListAttr->setSelectionType(aMode);
+ myIsFirst = false;
+ } else { // no type, set the type as a first element of the list shape type when it is appeared
+ if (aSelectionListAttr->size()) {
+ AttributeSelectionPtr aSel = aSelectionListAttr->value(0);
+ GeomShapePtr aFirstVal = aSel->value();
+ if (!aFirstVal.get() && aSel->context().get())
+ aFirstVal = aSel->context()->shape();
+ if (aFirstVal.get() && !aFirstVal->isNull())
+ aSelectionListAttr->setSelectionType(aFirstVal->shapeTypeStr());
+ }
+ }
}
return true;
}
return false;
AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
std::string aType = anAttribute->attributeType();
if (aType == ModelAPI_AttributeSelectionList::typeId()) {
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
// Restore shape type
std::string aSelectionType = aSelectionListAttr->selectionType().c_str();
- if (!aSelectionType.empty())
- setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str()));
+ if (aSelectionType.empty())
+ aSelectionListAttr->setSelectionType(myDefMode);
+ else {
+ setCurrentShapeType(aSelectionType.c_str());
+ myDefMode = aSelectionType;
+ myIsFirst = false;
+ }
}
+ if (myGeomCheck)
+ myGeomCheck->setChecked(aSelectionListAttr->isGeometricalSelection());
updateSelectionList();
return true;
}
// if there is at least one set, the result is true
isDone = isDone || aProcessed;
}
+ // Check the selection with validators
+ QString aError = getError();
+ if (aError.length() > 0) {
+ aSelectionListAttr->clear();
+ isDone = false;
+ }
// updateObject - to update/redisplay feature
// it is commented in order to perfom it outside the method
//if (isDone) {
theValues.append(anInvalidValues);
if (isDone) // may be the feature's result is not displayed, but attributes should be
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments,
true);/// hope that something is redisplayed by object updated
return isDone;
}
}
-//********************************************************************
-void ModuleBase_WidgetMultiSelector::updateSelectionModesAndFilters(bool toActivate)
-{
- myWorkshop->updateCommandStatus(); // update enable state of Undo/Redo application actions
- ModuleBase_WidgetSelector::updateSelectionModesAndFilters(toActivate);
-}
-
//********************************************************************
bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs)
{
bool aValid = ModuleBase_WidgetSelector::isValidSelectionCustom(thePrs);
if (aValid) {
ResultPtr aResult = myWorkshop->selection()->getResult(thePrs);
+ if (!aResult.get()) { // In case if a feature was selected
+ FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(thePrs->object());
+ if (aFeature.get())
+ aResult = aFeature->firstResult();
+ }
aValid = aResult.get() != NULL;
if (aValid) {
if (myFeature) {
myWorkshop->setSelected(getAttributeSelection());
// may be the feature's result is not displayed, but attributes should be
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments,
true); /// hope that something is redisplayed by object updated
}
myListView->restoreSelection(anIndices);
appendSelectionInHistory();
- return aDone;
+ return true/*aDone*/; // following #2438 Delete should be processed even if nothing is delete
}
//********************************************************************
QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
{
QList<QWidget*> result;
- //result << myTypeCombo;
+ if (myTypeCtrl->isVisible())
+ result << myTypeCtrl;
result << myListView->getControl();
return result;
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::onSelectionTypeChanged()
{
+ // Clear current selection in order to avoid updating of object browser with obsolete indexes
+ // which can appear because of results deletetion after changing a type of selection
+ QString aSelectionType = myTypeCtrl->textValue();
+ QList<ModuleBase_ViewerPrsPtr> aEmptyList;
+ myWorkshop->setSelected(aEmptyList);
+
updateSelectionModesAndFilters(true);
myWorkshop->selectionActivate()->updateSelectionModes();
std::string aType = anAttribute->attributeType();
if (aType == ModelAPI_AttributeSelectionList::typeId()) {
AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
+ aSelectionListAttr->setSelectionType(aSelectionType.toStdString());
}
// clear attribute values
restoreValue();
myWorkshop->setSelected(getAttributeSelection());
// may be the feature's result is not displayed, but attributes should be
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeArguments,
- true); /// hope that something is redisplayed by object updated
+ // hope that something is redisplayed by object updated
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeArguments, false);
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeResults, true);
// clear history should follow after set selected to do not increase history by setSelected
clearSelectedHistory();
+
+ if (myWorkshop->propertyPanel()->activeWidget() != this)
+ myWorkshop->propertyPanel()->activateWidget(this);
}
//********************************************************************
{
QIntList aShapeTypes;
- if (myTypeCombo->count() > 1 && myIsUseChoice) {
- aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->currentText()));
+ if (myShapeTypes.length() > 1 && myIsUseChoice) {
+ QStringList aTypes = myTypeCtrl->textValue().split("|", QString::SkipEmptyParts);
+ for(QString aType: aTypes) {
+ aShapeTypes.append(ModuleBase_Tools::shapeType(aType));
+ }
}
else {
- for (int i = 0, aCount = myTypeCombo->count(); i < aCount; i++)
- aShapeTypes.append(ModuleBase_Tools::shapeType(myTypeCombo->itemText(i)));
+ foreach (QString aType, myShapeTypes) {
+ QStringList aSubTypes = aType.split("|", QString::SkipEmptyParts);
+ for(QString aSubType: aSubTypes) {
+ aShapeTypes.append(ModuleBase_Tools::shapeType(aSubType));
+ }
+ }
}
return aShapeTypes;
}
//********************************************************************
-void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const int theShapeType)
+void ModuleBase_WidgetMultiSelector::setCurrentShapeType(const QString& theShapeType)
{
- QString aShapeTypeName;
-
- for (int idx = 0; idx < myTypeCombo->count(); ++idx) {
- aShapeTypeName = myTypeCombo->itemText(idx);
- int aRefType = ModuleBase_Tools::shapeType(aShapeTypeName);
- if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) {
+ int idx = 0;
+ GeomAPI_Shape::ShapeType aShapeType = GeomAPI_Shape::shapeTypeByStr(theShapeType.toStdString());
+ foreach (QString aShapeTypeName, myShapeTypes) {
+ if(GeomAPI_Shape::shapeTypeByStr(aShapeTypeName.toStdString()) == aShapeType &&
+ idx != myTypeCtrl->value()) {
updateSelectionModesAndFilters(false);
- bool isBlocked = myTypeCombo->blockSignals(true);
- myTypeCombo->setCurrentIndex(idx);
- myTypeCombo->blockSignals(isBlocked);
+ bool isBlocked = myTypeCtrl->blockSignals(true);
+ myTypeCtrl->setValue(idx);
+ myTypeCtrl->blockSignals(isBlocked);
updateSelectionModesAndFilters(true);
break;
}
+ idx++;
}
}
AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
for (int i = 0; i < aSelectionListAttr->size(); i++) {
AttributeSelectionPtr aAttr = aSelectionListAttr->value(i);
- myListView->addItem(aAttr->namingName().c_str(), i);
+ myListView->addItem(QString::fromStdWString(aAttr->namingName()), i);
}
}
else if (aType == ModelAPI_AttributeRefList::typeId()) {
for (int i = 0; i < aRefListAttr->size(); i++) {
ObjectPtr anObject = aRefListAttr->object(i);
if (anObject.get()) {
- myListView->addItem(anObject->data()->name().c_str(), i);
+ myListView->addItem(QString::fromStdWString(anObject->data()->name()), i);
}
}
}
else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
for (int i = 0; i < aRefAttrListAttr->size(); i++) {
- AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
+ AttributePtr anAttr = aRefAttrListAttr->attribute(i);
QString aName;
- if (anAttribute.get()) {
- std::string anAttrName = generateName(anAttribute, myWorkshop);
- aName = QString::fromStdString(anAttrName);
+ if (anAttr.get()) {
+ std::wstring anAttrName = ModuleBase_Tools::generateName(anAttr, myWorkshop);
+ aName = QString::fromStdWString(anAttrName);
}
else {
ObjectPtr anObject = aRefAttrListAttr->object(i);
if (anObject.get()) {
- aName = anObject->data()->name().c_str();
+ aName = QString::fromStdWString(anObject->data()->name());
}
}
myListView->addItem(aName, i);
}
// We have to call repaint because sometimes the List control is not updated
- myListView->getControl()->repaint();
+ myListView->getControl()->update();
}
//********************************************************************
//********************************************************************
void ModuleBase_WidgetMultiSelector::onListSelection()
{
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
- true);
+ myWorkshop->module()->customizeFeature(myFeature, ModuleBase_IModule::CustomizeHighlightedObjects,
+ true);
}
//********************************************************************
if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
continue;
AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
- ResultPtr anObject = anAttr->context();
+ ObjectPtr anObject = anAttr->contextObject();
if (anObject.get())
theValues.append(std::shared_ptr<ModuleBase_ViewerPrs>(
new ModuleBase_ViewerPrs(anObject, anAttr->value(), NULL)));
if (!anObject.get())
continue;
TopoDS_Shape aShape;
- AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
- if (anAttribute.get()) {
- GeomShapePtr aGeomShape = ModuleBase_Tools::getShape(anAttribute, myWorkshop);
+ AttributePtr anAttr = aRefAttrListAttr->attribute(i);
+ if (anAttr.get()) {
+ GeomShapePtr aGeomShape = ModuleBase_Tools::getShape(anAttr, myWorkshop);
theValues.append(std::shared_ptr<ModuleBase_ViewerPrs>(
new ModuleBase_ViewerPrs(anObject, aGeomShape, NULL)));
}
std::string aType = anAttribute->attributeType();
std::set<GeomShapePtr> aShapes;
std::set<int> anIndicesToBeRemoved;
+ FeaturePtr aFeature;
if (aType == ModelAPI_AttributeSelectionList::typeId()) {
// iteration through data model to find not selected elements to remove them
AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
for (int i = 0; i < aSelectionListAttr->size(); i++) {
AttributeSelectionPtr anAttr = aSelectionListAttr->value(i);
- bool aFound = findInSelection(anAttr->context(), anAttr->value(), aGeomSelection,
- myWorkshop);
+ ObjectPtr aContextObject = anAttr->contextObject();
+ GeomShapePtr aShape;
+ aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aContextObject);
+ if (!aFeature.get())
+ aShape = anAttr->value();
+
+ bool aFound = findInSelection(aContextObject, aShape, aGeomSelection, myWorkshop);
if (!aFound)
anIndicesToBeRemoved.insert(i);
}
isDone = anIndicesToBeRemoved.size() > 0;
- aSelectionListAttr->remove(anIndicesToBeRemoved);
+ if (isDone)
+ aSelectionListAttr->remove(anIndicesToBeRemoved);
}
else if (aType == ModelAPI_AttributeRefList::typeId()) {
AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
for (int i = 0; i < aRefAttrListAttr->size(); i++) {
bool aFound = false;
if (aRefAttrListAttr->isAttribute(i)) {
- AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
- aFound = anAttributes.find(anAttribute) != anAttributes.end();
+ AttributePtr anAttr = aRefAttrListAttr->attribute(i);
+ aFound = anAttributes.find(anAttr) != anAttributes.end();
}
else {
aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection,
const std::map<ObjectPtr, std::set<GeomShapePtr> >& theGeomSelection,
ModuleBase_IWorkshop* theWorkshop)
{
+ if (!theObject.get())
+ return false;
// issue #2154: we should not remove from list objects hidden in the viewer if selection
// was done with SHIFT button
if (theWorkshop->hasSHIFTPressed() && !theObject->isDisplayed())
return true;
bool aFound = false;
- GeomShapePtr anEmptyShape(new GeomAPI_Shape());
- if (theShape.get()) { // treat shape equal to context as null: 2219, keep order of shapes in list
- const ResultPtr aContext = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
- if (aContext.get() && aContext->shape()->isEqual(theShape))
- theShape.reset();
+ GeomShapePtr aShape = theShape;
+ if (!aShape.get()) {
+ // #2429 (the preselection of a sketch is not taken into account)
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ if (aResult.get())
+ aShape = aResult->shape();
}
- GeomShapePtr aShape = theShape.get() ? theShape : anEmptyShape;
if (theGeomSelection.find(theObject) != theGeomSelection.end()) {// found
const std::set<GeomShapePtr>& aShapes = theGeomSelection.at(theObject);
std::set<GeomShapePtr>::const_iterator anIt = aShapes.begin(), aLast = aShapes.end();
for (; anIt != aLast && !aFound; anIt++) {
GeomShapePtr aCShape = *anIt;
if (aCShape.get())
+ {
+ // treat shape equal to context as null: 2219, keep order of shapes in list
+ if (aCShape->isNull()) { // in selection, shape of result is equal to selected shape
+ // if so, here we need to check shape of result
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ if (aResult.get())
+ aCShape = aResult->shape();
+ }
aFound = aCShape->isSame(aShape);
+ }
}
}
+
+ // issue #2903: (Possibility to hide faces) - check whether given shape is a hidden sub-shape
+ if (!aFound && theShape.get() && theWorkshop->hasSHIFTPressed() && theObject->isDisplayed()) {
+ AISObjectPtr anAIS = theWorkshop->findPresentation(theObject);
+ if (anAIS.get() != NULL) {
+ Handle(AIS_InteractiveObject) anAISIO = anAIS->impl<Handle(AIS_InteractiveObject)>();
+
+ Handle(ModuleBase_ResultPrs) aResultPrs = Handle(ModuleBase_ResultPrs)::DownCast(anAISIO);
+ if (!aResultPrs.IsNull() && aResultPrs->isSubShapeHidden(theShape->impl<TopoDS_Shape>()))
+ return true;
+ }
+ }
+
return aFound;
}
i--;
}
break;
+ default: // [to avoid compilation warning]
+ break;
}
}
return aList;
-}
\ No newline at end of file
+}
+
+
+void ModuleBase_WidgetMultiSelector::onFeatureAccepted()
+{
+ defaultValues[myFeatureId + attributeID()] = myDefMode;
+}
+
+void ModuleBase_WidgetMultiSelector::onListActivated()
+{
+ //focusTo();
+ emitFocusInWidget();
+}
+
+void ModuleBase_WidgetMultiSelector::onSameTopology(bool theOn)
+{
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
+ aSelectionListAttr->setGeometricalSelection(theOn);
+ updateObject(myFeature);
+ }
+}
+
+void ModuleBase_WidgetMultiSelector::onShowOnly(bool theChecked)
+{
+ std::list<ResultPtr> aResults = myFeature->results();
+ std::list<ResultPtr>::const_iterator aIt;
+ if (theChecked) {
+ myVisibleObjects = myWorkshop->displayedObjects();
+ for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+ myVisibleObjects.removeAll(*aIt);
+ }
+ myWorkshop->module()->disableCustomMode(ModuleBase_IModule::CustomizeArguments);
+ }
+ else
+ myWorkshop->module()->enableCustomModes();
+
+ foreach(ObjectPtr aObj, myVisibleObjects) {
+ aObj->setDisplayed(!theChecked);
+ }
+
+ if (!theChecked) {
+ // Hide and show the group result in order to make it above all objects
+ bool aOldState = myWorkshop->enableUpdateViewer(false);
+ for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+ (*aIt)->setDisplayed(false);
+ }
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ for (aIt = aResults.cbegin(); aIt != aResults.cend(); aIt++) {
+ (*aIt)->setDisplayed(true);
+ }
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ myWorkshop->enableUpdateViewer(aOldState);
+
+ myVisibleObjects.clear();
+ } else
+ Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
+ myWorkshop->viewer()->update();
+}
+
+bool ModuleBase_WidgetMultiSelector::isModified() const
+{
+ return myListView->getControl()->count() > 0;
+}
+
+
+void ModuleBase_WidgetMultiSelector::setReadOnly(bool isReadOnly)
+{
+ ModuleBase_WidgetSelector::setReadOnly(isReadOnly);
+ if (myShowOnlyBtn)
+ myShowOnlyBtn->hide();
+ if (myFiltersWgt) {
+ myFiltersWgt->hide();
+
+ AttributeSelectionListPtr aAttrList = feature()->selectionList(attributeID());
+ if (aAttrList.get()) {
+ FiltersFeaturePtr aFilters = aAttrList->filters();
+ if (aFilters.get()) {
+ ModuleBase_WidgetSelectionFilter::SelectorFeature = feature();
+ ModuleBase_WidgetSelectionFilter::AttributeId = attributeID();
+
+ std::string aXmlCfg, aDescription;
+ myWorkshop->module()->getXMLRepresentation(myUseFilters, aXmlCfg, aDescription);
+
+ ModuleBase_WidgetSelectionFilter* aWgt =
+ new ModuleBase_WidgetSelectionFilter(this, myWorkshop,
+ new Config_WidgetAPI(aDescription), true);
+ aWgt->setFeature(aFilters);
+ aWgt->restoreValue();
+ myMainLayout->addWidget(aWgt);
+ }
+ }
+ }
+}