#include <ModelAPI_Object.h>
#include <ModelAPI_AttributeSelectionList.h>
#include <ModelAPI_AttributeRefList.h>
+#include <ModelAPI_AttributeRefAttrList.h>
#include <Config_WidgetAPI.h>
myListControl->addAction(myCopyAction);
myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
- myDeleteAction->setShortcut(QKeySequence::Delete);
myDeleteAction->setEnabled(false);
connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem()));
myListControl->addAction(myDeleteAction);
{
}
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::activateCustom()
+{
+ ModuleBase_WidgetSelector::activateCustom();
+
+ myWorkshop->module()->activateCustomPrs(myFeature,
+ ModuleBase_IModule::CustomizeHighlightedObjects, true);
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::deactivate()
+{
+ ModuleBase_WidgetSelector::deactivate();
+
+ myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
+}
+
//********************************************************************
bool ModuleBase_WidgetMultiSelector::storeValueCustom() const
{
if (!myFeature)
return false;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
- aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
- }
- return true;
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
+ aSelectionListAttr->setSelectionType(myTypeCombo->currentText().toStdString());
+ }
+ return true;
}
//********************************************************************
if (!myFeature)
return false;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ AttributePtr anAttribute = myFeature->data()->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
// Restore shape type
- if (!aSelectionListAttr->selectionType().empty())
- setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionListAttr->selectionType().c_str()));
+ std::string aSelectionType = aSelectionListAttr->selectionType().c_str();
+ if (!aSelectionType.empty())
+ setCurrentShapeType(ModuleBase_Tools::shapeType(aSelectionType.c_str()));
}
updateSelectionList();
return true;
{
ModuleBase_WidgetValidated::storeAttributeValue();
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
mySelectionType = aSelectionListAttr->selectionType();
mySelectionCount = aSelectionListAttr->size();
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
mySelectionCount = aRefListAttr->size();
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ mySelectionCount = aRefAttrListAttr->size();
+ }
}
//********************************************************************
{
ModuleBase_WidgetValidated::restoreAttributeValue(theValid);
- // Store shape type
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
aSelectionListAttr->setSelectionType(mySelectionType);
// restore selection in the attribute. Indeed there is only one stored object
for (int i = 0; i < aCountAppened; i++)
aSelectionListAttr->removeLast();
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
// restore objects in the attribute. Indeed there is only one stored object
int aCountAppened = aRefListAttr->size() - mySelectionCount;
for (int i = 0; i < aCountAppened; i++)
aRefListAttr->removeLast();
}
-}
-
-//********************************************************************
-void ModuleBase_WidgetMultiSelector::clearAttribute()
-{
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get())
- aSelectionListAttr->clear();
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
- aRefListAttr->clear();
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ // restore objects in the attribute. Indeed there is only one stored object
+ int aCountAppened = aRefAttrListAttr->size() - mySelectionCount;
+ for (int i = 0; i < aCountAppened; i++)
+ aRefAttrListAttr->removeLast();
}
}
void ModuleBase_WidgetMultiSelector::setObject(ObjectPtr theSelectedObject,
GeomShapePtr theShape)
{
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theSelectedObject);
- aSelectionListAttr->append(aResult, theShape, myIsInValidate);
+ if (!aSelectionListAttr->isInList(aResult, theShape, myIsInValidate))
+ aSelectionListAttr->append(aResult, theShape, myIsInValidate);
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
- aRefListAttr->append(theSelectedObject);
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
+ if (!aRefListAttr->isInList(theSelectedObject))
+ aRefListAttr->append(theSelectedObject);
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ AttributePtr anAttribute = myWorkshop->module()->findAttribute(theSelectedObject, theShape);
+
+ if (anAttribute.get()) {
+ if (!aRefAttrListAttr->isInList(anAttribute))
+ aRefAttrListAttr->append(anAttribute);
+ }
+ else {
+ if (!aRefAttrListAttr->isInList(theSelectedObject))
+ aRefAttrListAttr->append(theSelectedObject);
+ }
}
}
{
QList<ModuleBase_ViewerPrs> aSkippedValues;
+ /// remove unused objects from the model attribute.
+ /// It should be performed before new attributes append.
+ removeUnusedAttributeObjects(theValues);
+
QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
bool isDone = false;
for (; anIt != aLast; anIt++) {
// this emit is necessary to call store/restore method an restore type of selection
//emit valuesChanged();
//}
+
theValues.clear();
if (!aSkippedValues.empty())
theValues.append(aSkippedValues);
return aValid;
}
+//********************************************************************
+bool ModuleBase_WidgetMultiSelector::processDelete()
+{
+ // find attribute indices to delete
+ std::set<int> anAttributeIds;
+ getSelectedAttributeIndices(anAttributeIds);
+
+ // refill attribute by the items which indices are not in the list of ids
+ bool aDone = false;
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ aDone = !anAttributeIds.empty();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
+ aSelectionListAttr->remove(anAttributeIds);
+
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
+ aRefListAttr->remove(anAttributeIds);
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ aRefAttrListAttr->remove(anAttributeIds);
+ }
+
+ if (aDone) {
+ // update object is necessary to flush update signal. It leads to objects references map update
+ // and the operation presentation will not contain deleted items visualized as parameters of
+ // the feature.
+ updateObject(myFeature);
+
+ restoreValue();
+ myWorkshop->setSelected(getAttributeSelection());
+ }
+ return aDone;
+}
+
//********************************************************************
QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
{
aShapeTypeName = myTypeCombo->itemText(idx);
TopAbs_ShapeEnum aRefType = ModuleBase_Tools::shapeType(aShapeTypeName);
if(aRefType == theShapeType && idx != myTypeCombo->currentIndex()) {
- activateSelectionAndFilters(false);
+ bool aWasActivated = activateSelectionAndFilters(false);
bool isBlocked = myTypeCombo->blockSignals(true);
myTypeCombo->setCurrentIndex(idx);
myTypeCombo->blockSignals(isBlocked);
-
- activateSelectionAndFilters(true);
+ if (aWasActivated)
+ activateSelectionAndFilters(true);
break;
}
}
{
myListControl->clear();
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
for (int i = 0; i < aSelectionListAttr->size(); i++) {
AttributeSelectionPtr aAttr = aSelectionListAttr->value(i);
QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl);
myListControl->addItem(anItem);
}
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
for (int i = 0; i < aRefListAttr->size(); i++) {
ObjectPtr anObject = aRefListAttr->object(i);
if (anObject.get()) {
}
}
}
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ for (int i = 0; i < aRefAttrListAttr->size(); i++) {
+ AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
+ QString aName;
+ if (anAttribute.get()) {
+ std::string anAttrName = generateName(anAttribute, myWorkshop);
+ aName = QString::fromStdString(anAttrName);
+ }
+ else {
+ ObjectPtr anObject = aRefAttrListAttr->object(i);
+ if (anObject.get()) {
+ aName = anObject->data()->name().c_str();
+ }
+ }
+ QListWidgetItem* anItem = new QListWidgetItem(aName, myListControl);
+ anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+ myListControl->addItem(anItem);
+ }
+ }
+
// We have to call repaint because sometimes the List control is not updated
myListControl->repaint();
}
//********************************************************************
void ModuleBase_WidgetMultiSelector::onDeleteItem()
{
- // find attribute indices to delete
- std::set<int> anAttributeIds;
- getSelectedAttributeIndices(anAttributeIds);
-
- // refill attribute by the items which indices are not in the list of ids
- bool aDone = false;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
- aDone = !anAttributeIds.empty();
- aSelectionListAttr->remove(anAttributeIds);
- }
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
- if (aRefListAttr.get()) {
- aDone = !anAttributeIds.empty();
- aRefListAttr->remove(anAttributeIds);
- }
- }
- if (aDone) {
- restoreValue();
- myWorkshop->setSelected(getAttributeSelection());
-
- myWorkshop->module()->customizeObject(myFeature, ModuleBase_IModule::CustomizeAllObjects, true);
- }
+ processDelete();
}
//********************************************************************
{
if(myFeature.get() == NULL)
return;
- AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
- if (aSelectionListAttr.get()) {
+
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr = aData->selectionList(attributeID());
for (int i = 0; i < aSelectionListAttr->size(); i++) {
// filter by attribute indices only if the container is not empty otherwise return all items
if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
}
}
}
- else {
- AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
- if (aRefListAttr.get()) {
- for (int i = 0; i < aRefListAttr->size(); i++) {
- // filter by attribute indices only if the container is not empty otherwise return all items
- if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
- continue;
- ObjectPtr anObject = aRefListAttr->object(i);
- if (anObject.get()) {
- theValues.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
+ for (int i = 0; i < aRefListAttr->size(); i++) {
+ // filter by attribute indices only if the container is not empty otherwise return all items
+ if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
+ continue;
+ ObjectPtr anObject = aRefListAttr->object(i);
+ if (anObject.get()) {
+ theValues.append(ModuleBase_ViewerPrs(anObject, TopoDS_Shape(), NULL));
+ }
+ }
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(attributeID());
+ for (int i = 0; i < aRefAttrListAttr->size(); i++) {
+ // filter by attribute indices only if the container is not empty otherwise return all items
+ if (!theAttributeIds.empty() && theAttributeIds.find(i) == theAttributeIds.end())
+ continue;
+ ObjectPtr anObject = aRefAttrListAttr->object(i);
+ if (!anObject.get())
+ continue;
+ TopoDS_Shape aShape;
+ AttributePtr anAttribute = aRefAttrListAttr->attribute(i);
+ if (anAttribute.get()) {
+ GeomShapePtr aGeomShape = myWorkshop->module()->findShape(anAttribute);
+ if (aGeomShape.get()) {
+ aShape = aGeomShape->impl<TopoDS_Shape>();
}
+ theValues.append(ModuleBase_ViewerPrs(anObject, aShape, NULL));
+ }
+ }
+ }
+}
+
+void ModuleBase_WidgetMultiSelector::removeUnusedAttributeObjects
+ (QList<ModuleBase_ViewerPrs>& theValues)
+{
+ std::map<ObjectPtr, std::set<GeomShapePtr> > aGeomSelection = convertSelection(theValues);
+ DataPtr aData = myFeature->data();
+ AttributePtr anAttribute = aData->attribute(attributeID());
+ std::string aType = anAttribute->attributeType();
+ std::set<GeomShapePtr> aShapes;
+ std::set<int> anIndicesToBeRemoved;
+ 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);
+ if (!aFound)
+ anIndicesToBeRemoved.insert(i);
+ }
+ aSelectionListAttr->remove(anIndicesToBeRemoved);
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = aData->reflist(attributeID());
+ for (int i = 0; i < aRefListAttr->size(); i++) {
+ ObjectPtr anObject = aRefListAttr->object(i);
+ if (anObject.get()) {
+ bool aFound = findInSelection(anObject, GeomShapePtr(), aGeomSelection);
+ if (!aFound)
+ anIndicesToBeRemoved.insert(i);
}
}
+ aRefListAttr->remove(anIndicesToBeRemoved);
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ std::set<AttributePtr> anAttributes;
+ QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
+ ObjectPtr anObject;
+ GeomShapePtr aShape;
+ for (; anIt != aLast; anIt++) {
+ ModuleBase_ViewerPrs aPrs = *anIt;
+ getGeomSelection(aPrs, anObject, aShape);
+ AttributePtr anAttr = myWorkshop->module()->findAttribute(anObject, aShape);
+ if (anAttr.get() && anAttributes.find(anAttr) == anAttributes.end())
+ anAttributes.insert(anAttr);
+ }
+
+ AttributeRefAttrListPtr aRefAttrListAttr = aData->refattrlist(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();
+ }
+ else {
+ aFound = findInSelection(aRefAttrListAttr->object(i), GeomShapePtr(), aGeomSelection);
+ }
+ if (!aFound)
+ anIndicesToBeRemoved.insert(i);
+ }
+ aRefAttrListAttr->remove(anIndicesToBeRemoved);
+ }
+}
+
+std::map<ObjectPtr, std::set<GeomShapePtr> > ModuleBase_WidgetMultiSelector::convertSelection
+ (QList<ModuleBase_ViewerPrs>& theValues)
+{
+ // convert prs list to objects map
+ std::map<ObjectPtr, std::set<GeomShapePtr> > aGeomSelection;
+ std::set<GeomShapePtr> aShapes;
+ QList<ModuleBase_ViewerPrs>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
+ ObjectPtr anObject;
+ GeomShapePtr aShape;
+ GeomShapePtr anEmptyShape(new GeomAPI_Shape());
+ for (; anIt != aLast; anIt++) {
+ ModuleBase_ViewerPrs aPrs = *anIt;
+ getGeomSelection(aPrs, anObject, aShape);
+ aShapes.clear();
+ if (aGeomSelection.find(anObject) != aGeomSelection.end()) // found
+ aShapes = aGeomSelection[anObject];
+ // we need to know if there was an empty shape in selection for the object
+ if (!aShape.get())
+ aShape = anEmptyShape;
+ if (aShape.get() && aShapes.find(aShape) == aShapes.end()) // not found
+ aShapes.insert(aShape);
+ aGeomSelection[anObject] = aShapes;
+ }
+ return aGeomSelection;
+}
+
+bool ModuleBase_WidgetMultiSelector::findInSelection(const ObjectPtr& theObject,
+ const GeomShapePtr& theShape,
+ const std::map<ObjectPtr, std::set<GeomShapePtr> >& theGeomSelection)
+{
+ bool aFound = false;
+ GeomShapePtr anEmptyShape(new GeomAPI_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())
+ aFound = aCShape->isEqual(aShape);
+ }
}
+ return aFound;
}