Salome HOME
Union of validator and filter functionalities.
authornds <natalia.donis@opencascade.com>
Thu, 19 Mar 2015 09:28:50 +0000 (12:28 +0300)
committernds <natalia.donis@opencascade.com>
Thu, 19 Mar 2015 09:28:50 +0000 (12:28 +0300)
The selection is obtained from the entity owner instead of getting it from the viewer context.

src/ModuleBase/ModuleBase_ISelection.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/ModuleBase/ModuleBase_WidgetShapeSelector.cpp
src/ModuleBase/ModuleBase_WidgetShapeSelector.h
src/ModuleBase/ModuleBase_WidgetValidated.cpp
src/ModuleBase/ModuleBase_WidgetValidated.h
src/XGUI/XGUI_Selection.cpp
src/XGUI/XGUI_Selection.h

index e3190488af69f6268a61a1998570abbd06a73edd..29829a39e51f55031ce5732dd7e58d564633e368 100644 (file)
@@ -28,14 +28,12 @@ class ModuleBase_ISelection
  public:
 
   /// Returns a list of viewer selected presentations
-  /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
   /// \return list of presentations
-  virtual QList<ModuleBase_ViewerPrs> getSelected(int theShapeTypeToSkip = -1) const = 0;
+  virtual QList<ModuleBase_ViewerPrs> getSelected() const = 0;
 
   /// Returns a list of viewer highlited presentations
-  /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
   /// \return list of presentations
-  virtual QList<ModuleBase_ViewerPrs> getHighlighted(int theShapeTypeToSkip = -1) const = 0;
+  virtual QList<ModuleBase_ViewerPrs> getHighlighted() const = 0;
 
   /**
    * Returns list of features currently selected in object browser
index 22145d36f37be5a36554711d88753fe57919806a..c3bf95327950ba72585b4ba20e8238517d12e462 100644 (file)
@@ -171,6 +171,18 @@ bool ModuleBase_WidgetMultiSelector::restoreValue()
   return false;
 }
 
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::backupAttributeValue(const bool isBackup)
+{
+
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner)
+{
+
+}
+
 //********************************************************************
 QList<QWidget*> ModuleBase_WidgetMultiSelector::getControls() const
 {
index bdb1a46eddf75f4409a19db057d769d27cb9b214..e0b257ca4495790b6d0a872e9730af9b9bc451b4 100644 (file)
@@ -95,6 +95,17 @@ protected slots:
   /// \return True in success
   virtual bool storeValueCustom() const;
 
+  /// Creates a backup of the current values of the attribute
+  /// It should be realized in the specific widget because of different
+  /// parameters of the current attribute
+  /// \param isBackup a boolean flag, if true, store values from the attribute
+  /// to backup, otherwise set the backed up values to the attribute
+  virtual void backupAttributeValue(const bool isBackup);
+
+  /// Fills the attribute with the value of the selected owner
+  /// \param theOwner a selected owner
+  virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner);
+
   /// Set current shape type for selection
   void setCurrentShapeType(const TopAbs_ShapeEnum theShapeType);
 
index a2034fce6538f751c7ab8ae5ed29bee67e8d4dbe..ec7defe2285bb1eff1724dc7da1695db04907e54 100644 (file)
@@ -448,6 +448,41 @@ void ModuleBase_WidgetShapeSelector::activateCustom()
   activateSelection(true);
 }
 
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::backupAttributeValue(const bool isBackup)
+{
+  DataPtr aData = myFeature->data();
+  AttributePtr anAttribute = myFeature->attribute(attributeID());
+
+  if (isBackup) {
+    myObject = getObject(anAttribute);
+    myShape = getShape();
+    myRefAttribute = NULL;
+    myIsObject = false;
+    AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
+    if (aRefAttr) {
+      myIsObject = aRefAttr->isObject();
+      myRefAttribute = aRefAttr->attr();
+    }
+  }
+  else {
+    storeAttributeValues(myObject, myShape);
+    AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
+    if (aRefAttr) {
+      if (myIsObject)
+        aRefAttr->setObject(myObject);
+      else
+        aRefAttr->setAttr(myRefAttribute);
+    }
+  }
+}
+
+//********************************************************************
+void ModuleBase_WidgetShapeSelector::setSelection(const Handle_SelectMgr_EntityOwner& theOwner)
+{
+
+}
+
 //********************************************************************
 void ModuleBase_WidgetShapeSelector::deactivate()
 {
@@ -472,19 +507,9 @@ bool ModuleBase_WidgetShapeSelector::isValid(ObjectPtr theObj, std::shared_ptr<G
   AttributePtr anAttribute = myFeature->attribute(attributeID());
 
   // 1. make a backup of the previous attribute values
-  ObjectPtr aPrevObject = getObject(anAttribute);
-  GeomShapePtr aPrevShape = getShape();
-  AttributePtr aPrevAttribute;
-  bool aPrevIsObject = false;
-  AttributeRefAttrPtr aRefAttr = aData->refattr(attributeID());
-  if (aRefAttr) {
-    aPrevIsObject = aRefAttr->isObject();
-    aPrevAttribute = aRefAttr->attr();
-  }
-
+  backupAttributeValue(true);
   // 2. store the current values, disable the model's update
   aData->blockSendAttributeUpdated(true);
-  storeAttributeValues(theObj, theShape);
 
   // 3. check the acceptability of the current values
   std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
@@ -499,44 +524,9 @@ bool ModuleBase_WidgetShapeSelector::isValid(ObjectPtr theObj, std::shared_ptr<G
   }
 
   // 4. if the values are not valid, restore the previous values to the attribute
-  storeAttributeValues(aPrevObject, aPrevShape);
-  if (aRefAttr) {
-    if (aPrevIsObject)
-      aRefAttr->setObject(aPrevObject);
-    else
-      aRefAttr->setAttr(aPrevAttribute);
-  }
+  backupAttributeValue(false);
 
   // 5. enable the model's update
   aData->blockSendAttributeUpdated(false);
-  //updateObject(myFeature);
-  //return aValid;
-
-  if (!aValid)
-    return false;
-
-/*  // Check the acceptability of the object as attribute
-  std::list<ModelAPI_Validator*>::iterator aValidator = aValidators.begin();
-  std::list<std::list<std::string> >::iterator aArgs = anArguments.begin();
-  for (; aValidator != aValidators.end(); aValidator++, aArgs++) {
-    const ModelAPI_RefAttrValidator* aAttrValidator =
-        dynamic_cast<const ModelAPI_RefAttrValidator*>(*aValidator);
-    if (aAttrValidator) {
-      //if (!aAttrValidator->isValid(myFeature, *aArgs, theObj)) {
-      //  return false;
-      //}
-    }
-    else {
-      const ModelAPI_ShapeValidator* aShapeValidator = 
-                               dynamic_cast<const ModelAPI_ShapeValidator*>(*aValidator);
-      if (aShapeValidator) {
-        DataPtr aData = myFeature->data();
-        AttributeSelectionPtr aSelectAttr = aData->selection(attributeID());
-        if (!aShapeValidator->isValid(myFeature, *aArgs, theObj, aSelectAttr, theShape)) {
-          return false;
-        }
-      }
-    }
-  }*/
-  return true;
+  return aValid;
 }
index fe4d0cb49a333cee9956c147d5c63652bc6007af..ca735d5324db165b7db91aeae2ffcf43d04d1d07 100644 (file)
@@ -110,6 +110,17 @@ Q_OBJECT
   /// The methiod called when widget is activated
   virtual void activateCustom();
 
+  /// Creates a backup of the current values of the attribute
+  /// It should be realized in the specific widget because of different
+  /// parameters of the current attribute
+  /// \param isBackup a boolean flag, if true, store values from the attribute
+  /// to backup, otherwise set the backed up values to the attribute
+  virtual void backupAttributeValue(const bool isBackup);
+
+  /// Fills the attribute with the value of the selected owner
+  /// \param theOwner a selected owner
+  virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner);
+
   /// Computes and updates name of selected object in the widget
   void updateSelectionName();
 
@@ -159,6 +170,18 @@ Q_OBJECT
 
   /// Active/inactive flag
   bool myIsActive;
+
+  /// backup parameters of the model attribute. The class processes three types of attribute:
+  /// Reference, RefAttr and Selection. Depending on the attribute type, only the attribute parameter
+  /// values are reserved in the backup
+  /// An attribute object
+  ObjectPtr myObject;
+  /// An attribute shape
+  GeomShapePtr myShape;
+  /// A reference of the attribute
+  AttributePtr myRefAttribute;
+  /// A boolean value whether refAttr uses reference of object
+  bool myIsObject;
 };
 
 #endif
index 509814ee6c0c75c4803c29d5e962edcc868d775e..d81ec7970855eb8aa3d3d3ff194a371d2f5d63ea 100644 (file)
@@ -29,8 +29,9 @@ bool ModuleBase_WidgetValidated::isValid(const Handle_SelectMgr_EntityOwner& the
 {
   backupAttributeValue(true);
 
-  setValue(theOwner);
+  setSelection(theOwner);
   bool aValid = isValidAttribute();
+
   backupAttributeValue(false);
 
   return aValid;
@@ -96,13 +97,13 @@ void ModuleBase_WidgetValidated::activateFilters(ModuleBase_IWorkshop* theWorksh
                                                  const bool toActivate) const
 {
   ModuleBase_IViewer* aViewer = theWorkshop->viewer();
-  /*
+/*
   Handle(SelectMgr_Filter) aSelFilter = theWorkshop->validatorFilter();
   if (toActivate)
     aViewer->addSelectionFilter(aSelFilter);
   else
-    aViewer->removeSelectionFilter(aSelFilter);*/
-  
+    aViewer->removeSelectionFilter(aSelFilter);
+*/  
   // apply filters loaded from the XML definition of the widget
   ModuleBase_FilterFactory* aFactory = theWorkshop->selectionFilters();
   SelectMgr_ListOfFilter aFactoryFilters;
index 03b3175cec5322f18cf8bd7dd3c37908cdd64f13..90a83677ead697466b913709069bcf38e764feb3 100644 (file)
@@ -49,11 +49,11 @@ protected:
   /// parameters of the current attribute
   /// \param isBackup a boolean flag, if true, store values from the attribute
   /// to backup, otherwise set the backed up values to the attribute
-  virtual void backupAttributeValue(const bool isBackup) {}//= 0;
+  virtual void backupAttributeValue(const bool isBackup) = 0;
 
   /// Fills the attribute with the value of the selected owner
   /// \param theOwner a selected owner
-  virtual void setValue(const Handle_SelectMgr_EntityOwner& theOwner) {}//= 0;
+  virtual void setSelection(const Handle_SelectMgr_EntityOwner& theOwner) = 0;
 
   /// Checks the current attibute in all attribute validators
   // \return true if all validators return that the attribute is valid
index 30c623181b9341d6ce7193fd00a99c554770ecdd..0de6255da0409c105be963a079a74d2ab4e0551c 100644 (file)
 #include <AIS_InteractiveContext.hxx>
 
 #include <SelectMgr_Selection.hxx>
+#include <SelectMgr_EntityOwner.hxx>
+
 #include <SelectBasics_SensitiveEntity.hxx>
 #include <TColStd_ListIteratorOfListOfInteger.hxx>
+#include <StdSelect_BRepOwner.hxx>
 
 #include <set>
 
@@ -25,7 +28,7 @@ XGUI_Selection::XGUI_Selection(XGUI_Workshop* theWorkshop)
 {
 }
 
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip) const
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected() const
 {
   QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
 
@@ -39,25 +42,18 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip)
   if (aContext->HasOpenedContext()) {
     for (aContext->InitSelected(); aContext->MoreSelected(); aContext->NextSelected()) {
       ModuleBase_ViewerPrs aPrs;
-      Handle(AIS_InteractiveObject) anIO = aContext->SelectedInteractive();
-      if (aSelectedIds.contains((long)anIO.Access()))
+      Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
+
+      if (aSelectedIds.contains((long)anOwner.Access()))
         continue;
-    
-      aSelectedIds.append((long)anIO.Access());
-      aPrs.setInteractive(anIO);
+      aSelectedIds.append((long)anOwner.Access());
+
+      fillPresentation(aPrs, anOwner);
 
-      ObjectPtr aFeature = aDisplayer->getObject(anIO);
-      // we should not check the appearance of this feature because there can be some selected shapes
-      // for one feature
-      TopoDS_Shape aShape = aContext->SelectedShape();
-      if (!aShape.IsNull() && (aShape.ShapeType() != theShapeTypeToSkip))
-        aPrs.setShape(aShape);
-      Handle(SelectMgr_EntityOwner) anOwner = aContext->SelectedOwner();
-      aPrs.setOwner(anOwner);
-      aPrs.setFeature(aFeature);
       aPresentations.append(aPrs);
     }
-  } else {
+  }
+  /* else {
     for (aContext->InitCurrent(); aContext->MoreCurrent(); aContext->NextCurrent()) {
       ModuleBase_ViewerPrs aPrs;
       Handle(AIS_InteractiveObject) anIO = aContext->Current();
@@ -71,11 +67,36 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getSelected(int theShapeTypeToSkip)
       aPrs.setFeature(aFeature);
       aPresentations.append(aPrs);
     }
-  }
+  }*/
   return aPresentations;
 }
 
-QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted(int theShapeTypeToSkip) const
+void XGUI_Selection::fillPresentation(ModuleBase_ViewerPrs& thePrs,
+                                      const Handle(SelectMgr_EntityOwner)& theOwner) const
+{
+  thePrs.setOwner(theOwner);
+
+  Handle(AIS_InteractiveObject) anIO = 
+                           Handle(AIS_InteractiveObject)::DownCast(theOwner->Selectable());
+  thePrs.setInteractive(anIO);
+
+  // we should not check the appearance of this feature because there can be some selected shapes
+  // for one feature
+  Handle(StdSelect_BRepOwner) aBRO = Handle(StdSelect_BRepOwner)::DownCast(theOwner);
+  if( !aBRO.IsNull() ) {
+    // the located method is called in the context to obtain the shape by the SelectedShape() method,
+    // so the shape is located by the same rules
+    TopoDS_Shape aShape = aBRO->Shape().Located (aBRO->Location() * aBRO->Shape().Location());
+    if (!aShape.IsNull())
+      thePrs.setShape(aShape);
+  }      
+     
+  XGUI_Displayer* aDisplayer = myWorkshop->displayer();
+  ObjectPtr aFeature = aDisplayer->getObject(anIO);
+  thePrs.setFeature(aFeature);
+}
+
+QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted() const
 {
   QList<long> aSelectedIds; // Remember of selected address in order to avoid duplicates
   QList<ModuleBase_ViewerPrs> aPresentations;
@@ -97,7 +118,7 @@ QList<ModuleBase_ViewerPrs> XGUI_Selection::getHighlighted(int theShapeTypeToSki
     aPrs.setFeature(aResult);
     if (aContext->HasOpenedContext()) {
       TopoDS_Shape aShape = aContext->DetectedShape();
-      if (!aShape.IsNull() && aShape.ShapeType() != theShapeTypeToSkip)
+      if (!aShape.IsNull())
         aPrs.setShape(aShape);
     }
     aPresentations.push_back(aPrs);
index f766841d6edea79f9134a863816e55bd52b400ad..9d6848ccd659fdcff401fe75b01efc5fd64d4708 100644 (file)
@@ -21,6 +21,7 @@
 #include <SelectMgr_IndexedMapOfOwner.hxx>
 
 class XGUI_Workshop;
+class Handle_SelectMgr_EntityOwner;
 
 /**
 * \ingroup GUI
@@ -34,14 +35,17 @@ class XGUI_EXPORT XGUI_Selection : public ModuleBase_ISelection
   XGUI_Selection(XGUI_Workshop* theWorkshop);
 
   /// Returns a list of viewer selected presentations
-  /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
   /// \return list of presentations
-  virtual QList<ModuleBase_ViewerPrs> getSelected(int theShapeTypeToSkip = -1) const;
+  virtual QList<ModuleBase_ViewerPrs> getSelected() const;
+
+  /// Fills the viewer presentation parameters by the parameters from the owner
+  /// \param thePrs a container for selection
+  /// \param theOwner a selection owner
+  void fillPresentation(ModuleBase_ViewerPrs& thePrs, const Handle_SelectMgr_EntityOwner& theOwner) const;
 
   /// Returns a list of viewer highlited presentations
-  /// \param theShapeTypeToSkip the shapes with this type will be skipped during the result list build
   /// \return list of presentations
-  virtual QList<ModuleBase_ViewerPrs> getHighlighted(int theShapeTypeToSkip = -1) const;
+  virtual QList<ModuleBase_ViewerPrs> getHighlighted() const;
 
   /**
    * Returns list of currently selected objects in object browser