return anAttributeId;
}
+bool hasObject(const AttributePtr& theAttribute, const ObjectPtr& theObject,
+ const std::shared_ptr<GeomAPI_Shape>& theShape,
+ ModuleBase_IWorkshop* theWorkshop,
+ const bool theTemporarily)
+{
+ bool aHasObject = false;
+ if (!theAttribute.get())
+ return aHasObject;
+
+ std::string aType = theAttribute->attributeType();
+ if (aType == ModelAPI_AttributeReference::typeId()) {
+ AttributeReferencePtr aRef = std::dynamic_pointer_cast<ModelAPI_AttributeReference>(theAttribute);
+ ObjectPtr aObject = aRef->value();
+ aHasObject = aObject && aObject->isSame(theObject);
+ //if (!(aObject && aObject->isSame(theObject))) {
+ // aRef->setValue(theObject);
+ //}
+ } else if (aType == ModelAPI_AttributeRefAttr::typeId()) {
+ AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(theAttribute);
+
+ AttributePtr anAttribute = theWorkshop->module()->findAttribute(theObject, theShape);
+ if (anAttribute.get()) {
+ //aRefAttr->setAttr(anAttribute);
+ }
+ else {
+ ObjectPtr aObject = aRefAttr->object();
+ aHasObject = aObject && aObject->isSame(theObject);
+ //if (!(aObject && aObject->isSame(theObject))) {
+ // aRefAttr->setObject(theObject);
+ //}
+ }
+ } else if (aType == ModelAPI_AttributeSelection::typeId()) {
+ /*AttributeSelectionPtr aSelectAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ if (aSelectAttr.get() != NULL) {
+ aSelectAttr->setValue(aResult, theShape, theTemporarily);
+ }*/
+ }
+ if (aType == ModelAPI_AttributeSelectionList::typeId()) {
+ AttributeSelectionListPtr aSelectionListAttr =
+ std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
+ ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
+ aHasObject = aSelectionListAttr->isInList(aResult, theShape, theTemporarily);
+ //if (!theCheckIfAttributeHasObject || !aSelectionListAttr->isInList(aResult, theShape, theTemporarily))
+ // aSelectionListAttr->append(aResult, theShape, theTemporarily);
+ }
+ else if (aType == ModelAPI_AttributeRefList::typeId()) {
+ AttributeRefListPtr aRefListAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(theAttribute);
+ aHasObject = aRefListAttr->isInList(theObject);
+ //if (!theCheckIfAttributeHasObject || !aRefListAttr->isInList(theObject))
+ // aRefListAttr->append(theObject);
+ }
+ else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
+ AttributeRefAttrListPtr aRefAttrListAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefAttrList>(theAttribute);
+ AttributePtr anAttribute = theWorkshop->module()->findAttribute(theObject, theShape);
+
+ if (anAttribute.get()) {
+ aHasObject = aRefAttrListAttr->isInList(anAttribute);
+ //if (!theCheckIfAttributeHasObject || !aRefAttrListAttr->isInList(anAttribute))
+ // aRefAttrListAttr->append(anAttribute);
+ }
+ else {
+ aHasObject = aRefAttrListAttr->isInList(theObject);
+ //if (!theCheckIfAttributeHasObject || !aRefAttrListAttr->isInList(theObject))
+ // aRefAttrListAttr->append(theObject);
+ }
+ }
+ return aHasObject;
+}
+
void setObject(const AttributePtr& theAttribute, const ObjectPtr& theObject,
const GeomShapePtr& theShape, ModuleBase_IWorkshop* theWorkshop,
- const bool theTemporarily)
+ const bool theTemporarily, const bool theCheckIfAttributeHasObject)
{
if (!theAttribute.get())
return;
AttributeSelectionListPtr aSelectionListAttr =
std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(theAttribute);
ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(theObject);
- if (!aSelectionListAttr->isInList(aResult, theShape, theTemporarily))
+ if (!theCheckIfAttributeHasObject || !aSelectionListAttr->isInList(aResult, theShape, theTemporarily))
aSelectionListAttr->append(aResult, theShape, theTemporarily);
}
else if (aType == ModelAPI_AttributeRefList::typeId()) {
AttributeRefListPtr aRefListAttr = std::dynamic_pointer_cast<ModelAPI_AttributeRefList>(theAttribute);
- if (!aRefListAttr->isInList(theObject))
+ if (!theCheckIfAttributeHasObject || !aRefListAttr->isInList(theObject))
aRefListAttr->append(theObject);
}
else if (aType == ModelAPI_AttributeRefAttrList::typeId()) {
AttributePtr anAttribute = theWorkshop->module()->findAttribute(theObject, theShape);
if (anAttribute.get()) {
- if (!aRefAttrListAttr->isInList(anAttribute))
+ if (!theCheckIfAttributeHasObject || !aRefAttrListAttr->isInList(anAttribute))
aRefAttrListAttr->append(anAttribute);
}
else {
- if (!aRefAttrListAttr->isInList(theObject))
+ if (!theCheckIfAttributeHasObject || !aRefAttrListAttr->isInList(theObject))
aRefAttrListAttr->append(theObject);
}
}
/// \param theWorkshop to find an attribute for the given shape for attribute reference
/// \param theTemporarily if it is true, do not store and name the added in the data framework
/// It is useful for attribute selection
+MODULEBASE_EXPORT bool hasObject(const AttributePtr& theAttribute, const ObjectPtr& theObject,
+ const std::shared_ptr<GeomAPI_Shape>& theShape,
+ ModuleBase_IWorkshop* theWorkshop,
+ const bool theTemporarily);
+
+/// Set the object to the attribute depending on the attribute type. If it is a list,
+/// the values are appended if they are not in the list yet.
+/// \param theAttribute an attribute where the object and shape are set
+/// \param theObject an object
+/// \param theShape a shape
+/// \param theWorkshop to find an attribute for the given shape for attribute reference
+/// \param theTemporarily if it is true, do not store and name the added in the data framework
+/// \param theCheckIfAttributeHasObject if it is true, the check isInList is called
+/// It is useful for attribute selection
MODULEBASE_EXPORT void setObject(const AttributePtr& theAttribute, const ObjectPtr& theObject,
const std::shared_ptr<GeomAPI_Shape>& theShape,
ModuleBase_IWorkshop* theWorkshop,
- const bool theTemporarily = false);
+ const bool theTemporarily,
+ const bool theCheckIfAttributeHasObject);
/// Returns the shape of the attribute. If the attribute is AttributeRefAttrPtr, the shape is found
/// using current module of the given workshop.
removeUnusedAttributeObjects(theValues);
QList<ModuleBase_ViewerPrsPtr> anInvalidValues;
+ QList<ModuleBase_ViewerPrsPtr> anAttributeValues;
QList<ModuleBase_ViewerPrsPtr>::const_iterator anIt = theValues.begin(), aLast = theValues.end();
for (; anIt != aLast; anIt++) {
ModuleBase_ViewerPrsPtr aValue = *anIt;
- bool aProcessed = false;
+ // do not validate and append to attribute selection presentation if it exists in the attribute
+ ObjectPtr anObject;
+ GeomShapePtr aShape;
+ getGeomSelection(aValue, anObject, aShape);
+ if (ModuleBase_Tools::hasObject(attribute(), anObject, aShape, myWorkshop, myIsInValidate)) {
+ anAttributeValues.append(aValue);
+ continue;
+ }
if (theToValidate && !isValidInFilters(aValue))
anInvalidValues.append(aValue);
}
for (anIt = theValues.begin(); anIt != aLast; anIt++) {
ModuleBase_ViewerPrsPtr aValue = *anIt;
bool aProcessed = false;
- if (aHasInvalidValues && anInvalidValues.contains(aValue))
+ if ((aHasInvalidValues && anInvalidValues.contains(aValue)) ||
+ anAttributeValues.contains(aValue))
continue;
- aProcessed = setSelectionCustom(aValue);
+ aProcessed = setSelectionCustom(aValue); /// it is not optimal as hasObject() is already checked
// if there is at least one set, the result is true
isDone = isDone || aProcessed;
}