X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_WidgetMultiSelector.cpp;h=43f066ea2337b8e935f502013489d968d4328e9f;hb=47bc42239a014ab54525f88916f2633b9d520f58;hp=c59c6919e7de0754a3d78e5a2d77e8d7e1320ba4;hpb=58185df5c4d0877054ea33a0fe8ebded75bd9d7b;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_WidgetMultiSelector.cpp b/src/PartSet/PartSet_WidgetMultiSelector.cpp index c59c6919e..43f066ea2 100644 --- a/src/PartSet/PartSet_WidgetMultiSelector.cpp +++ b/src/PartSet/PartSet_WidgetMultiSelector.cpp @@ -11,6 +11,10 @@ #include #include +#include +#include +#include + #include #include @@ -21,11 +25,13 @@ #include +#include + PartSet_WidgetMultiSelector::PartSet_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData, const std::string& theParentId) -: ModuleBase_WidgetShapeSelector(theParent, theWorkshop, theData, theParentId) +: ModuleBase_WidgetMultiSelector(theParent, theWorkshop, theData, theParentId) { myExternalObjectMgr = new PartSet_ExternalObjectsMgr(theData->getProperty("use_external"), false); } @@ -35,9 +41,135 @@ PartSet_WidgetMultiSelector::~PartSet_WidgetMultiSelector() delete myExternalObjectMgr; } +//******************************************************************** +void PartSet_WidgetMultiSelector::onSelectionChanged() +{ + ModuleBase_WidgetMultiSelector::onSelectionChanged(); + // TODO(nds): unite with externalObject(), remove parameters + //myFeature->execute(); + + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + + QObjectPtrList aListOfAttributeObjects; + for (int i = 0; i < aSelectionListAttr->size(); i++) { + AttributeSelectionPtr anAttr = aSelectionListAttr->value(i); + aListOfAttributeObjects.append(anAttr->context()); + } + + myExternalObjectMgr->removeUnusedExternalObjects(aListOfAttributeObjects, sketch(), myFeature); +} + +//******************************************************************** +void PartSet_WidgetMultiSelector::storeAttributeValue() +{ + myIsInVaildate = true; + ModuleBase_WidgetMultiSelector::storeAttributeValue(); + +} + //******************************************************************** void PartSet_WidgetMultiSelector::restoreAttributeValue(const bool theValid) { - ModuleBase_WidgetShapeSelector::restoreAttributeValue(theValid); - myExternalObjectMgr->removeExternal(sketch(), myFeature); + myIsInVaildate = false; + ModuleBase_WidgetMultiSelector::restoreAttributeValue(theValid); + + myExternalObjectMgr->removeExternalValidated(sketch(), myFeature); +} + +//******************************************************************** +bool PartSet_WidgetMultiSelector::setSelectionCustom(const ModuleBase_ViewerPrs& thePrs) +{ + TopoDS_Shape aShape = thePrs.shape(); + if ((myTypeCombo->count() > 1) && (!aShape.IsNull())) { + TopAbs_ShapeEnum aType = ModuleBase_Tools::shapeType(myTypeCombo->currentText()); + if (aShape.ShapeType() != aType) + return false; + } + ResultPtr aResult; + if (!thePrs.owner().IsNull()) { + ObjectPtr anObject = myWorkshop->selection()->getSelectableObject(thePrs.owner()); + aResult = std::dynamic_pointer_cast(anObject); + } + else { + aResult = std::dynamic_pointer_cast(thePrs.object()); + } + + + if (myFeature) { + // We can not select a result of our feature + const std::list& aResList = myFeature->results(); + std::list::const_iterator aIt; + bool isSkipSelf = false; + for (aIt = aResList.cbegin(); aIt != aResList.cend(); ++aIt) { + if ((*aIt) == aResult) { + isSkipSelf = true; + break; + } + } + if(isSkipSelf) + return false; + } + + GeomShapePtr aGShape = GeomShapePtr(); + const TopoDS_Shape& aTDSShape = thePrs.shape(); + // if only result is selected, an empty shape is set to the model + if (aTDSShape.IsNull()) { + //aSelectionListAttr->append(aResult, GeomShapePtr()); + } + else { + aGShape = std::shared_ptr(new GeomAPI_Shape()); + //GeomShapePtr aShape(new GeomAPI_Shape()); + aGShape->setImpl(new TopoDS_Shape(aTDSShape)); + // We can not select a result of our feature + if (aGShape->isEqual(aResult->shape())) { + //aSelectionListAttr->append(aResult, GeomShapePtr()); + aGShape = GeomShapePtr(); + } + else { + //aSelectionListAttr->append(aResult, aShape); + } + } + + setObject(aResult, aGShape); + return true; +} + +//******************************************************************** +bool PartSet_WidgetMultiSelector::setObject(const ObjectPtr& theSelectedObject, + const GeomShapePtr& theShape) +{ + ObjectPtr aSelectedObject = theSelectedObject; + GeomShapePtr aShape = theShape; + + FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(aSelectedObject); + //if (aSelectedFeature == myFeature) // In order to avoid selection of the same object + // return false; + + // Do check using of external feature + std::shared_ptr aSPFeature = + std::dynamic_pointer_cast(aSelectedFeature); + + // Do check that we can use external feature + if ((aSPFeature.get() != NULL) && aSPFeature->isExternal() && (!myExternalObjectMgr->useExternal())) + return false; + + if (aSPFeature.get() == NULL && aShape.get() != NULL && !aShape->isNull() && myExternalObjectMgr->useExternal()) { + if (myIsInVaildate) + aSelectedObject = myExternalObjectMgr->externalObjectValidated(theSelectedObject, theShape, sketch()); + else + aSelectedObject = myExternalObjectMgr->externalObject(theSelectedObject, theShape, sketch()); + } + + + ResultPtr aResult = std::dynamic_pointer_cast(aSelectedObject); + + DataPtr aData = myFeature->data(); + AttributeSelectionListPtr aSelectionListAttr = + std::dynamic_pointer_cast(aData->attribute(attributeID())); + + aSelectionListAttr->append(aResult, aShape); + + return true; }