]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Transfer selected data to a main operation Filters_Development
authorvsv <vsv@opencascade.com>
Mon, 19 Nov 2018 08:08:53 +0000 (11:08 +0300)
committervsv <vsv@opencascade.com>
Mon, 19 Nov 2018 08:08:53 +0000 (11:08 +0300)
src/CollectionPlugin/CollectionPlugin_GroupFilters.h
src/Filters/Filters_HorizontalPlane.h
src/Filters/Filters_VerticalPlane.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetSelectionFilter.cpp
src/ModuleBase/ModuleBase_WidgetSelectionFilter.h

index a7ec756eee908c3f35375ed8cfc6d98057f7e9b9..305d179c335d868913c91f47fdfe4cac2fd4d99b 100644 (file)
@@ -41,6 +41,11 @@ public:
     return MY_KIND;
   }
 
+  virtual bool isInHistory()
+  {
+    return false;
+  }
+
   /// Creates a new group result if needed
   COLLECTIONPLUGIN_EXPORT virtual void execute() {}
 
index cca9a88168c811d6cf6e0856cb0c7d64e7d54c54..6a4365c1aa3bae6fd6bfce4e8f17e234662fe797 100644 (file)
@@ -30,13 +30,14 @@ class Filters_HorizontalPlane : public ModelAPI_Filter
 public:
   Filters_HorizontalPlane() : ModelAPI_Filter() {}
 
-  virtual bool isOk(const GeomShapePtr& theShape) const;
-
   /// Returns list of supported types of shapes (see GeomAPI_Shape::ShapeType)
   virtual std::list<int> shapeTypes() const;
 
   /// Returns name of the filter to represent it in GUI
   virtual std::string name() const { return "Horizontal faces"; }
+
+protected:
+  virtual bool isOk(const GeomShapePtr& theShape) const;
 };
 
 
index 69fb248b2b43630c68dedfada5c7d09f63140a06..8ff82208505217f3ca2e41418d378c0606fc6967 100644 (file)
@@ -30,13 +30,14 @@ class Filters_VerticalPlane : public ModelAPI_Filter
 public:
   Filters_VerticalPlane() : ModelAPI_Filter() {}
 
-  virtual bool isOk(const GeomShapePtr& theShape) const;
-
   /// Returns list of supported types of shapes (see GeomAPI_Shape::ShapeType)
   virtual std::list<int> shapeTypes() const;
 
   /// Returns name of the filter to represent it in GUI
   virtual std::string name() const { return "Vertical faces"; }
+
+protected:
+  virtual bool isOk(const GeomShapePtr& theShape) const;
 };
 
 
index 8096475212f4f391cc18847d0033e6178e1d4af5..63dbccc86d3b08fc7908e9bfeb670ca1f4246751 100755 (executable)
@@ -180,8 +180,6 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
       myTypeCtrl->setValue(myDefMode.c_str());
     }
   }
-  if (myFiltersWgt)
-    myFiltersWgt->setSelectionType(myTypeCtrl->textValue());
 }
 
 ModuleBase_WidgetMultiSelector::~ModuleBase_WidgetMultiSelector()
@@ -502,9 +500,6 @@ 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();
-  if (myFiltersWgt)
-    myFiltersWgt->setSelectionType(aSelectionType);
-
   QList<ModuleBase_ViewerPrsPtr> aEmptyList;
   myWorkshop->setSelected(aEmptyList);
 
index 07d0ff4d550d003175b52b93ee518df79b617b43..9148b73a897da185a619e53174579b871ed30b21 100644 (file)
 #include "ModuleBase_IPropertyPanel.h"
 #include "ModuleBase_PageWidget.h"
 #include "ModuleBase_WidgetMultiSelector.h"
+#include "ModuleBase_ResultPrs.h"
 
 #include <ModelAPI_Session.h>
+#include <ModelAPI_AttributeSelectionList.h>
 #include <GeomAPI_ShapeExplorer.h>
 
 #include <AIS_InteractiveContext.hxx>
 #include <QDialog>
 #include <QToolButton>
 
-static int SelectionType = 0;
+static FeaturePtr SelectorFeature;
+static std::string AttributeId;
+
+
+GeomAPI_Shape::ShapeType selectionType(const QString& theType)
+{
+  QString aType = theType.toUpper();
+  if ((aType == "VERTEX") || (aType == "VERTICES"))
+    return GeomAPI_Shape::VERTEX;
+  else if ((aType == "EDGE") || (aType == "EDGES"))
+    return GeomAPI_Shape::EDGE;
+  else if ((aType == "WIRE") || (aType == "WIRES"))
+    return GeomAPI_Shape::WIRE;
+  else if ((aType == "FACE") || (aType == "FACES"))
+    return GeomAPI_Shape::FACE;
+  else if ((aType == "SHELL") || (aType == "SHELLS"))
+    return GeomAPI_Shape::SHELL;
+  else if ((aType == "SOLID") || (aType == "SOLIDS"))
+    return GeomAPI_Shape::SOLID;
+  else if ((aType == "COMPSOLID") || (aType == "COMPSOLIDS"))
+    return GeomAPI_Shape::COMPSOLID;
+  else if ((aType == "COMPOUND") || (aType == "COMPOUNDS"))
+    return GeomAPI_Shape::COMPOUND;
+  else
+    return GeomAPI_Shape::SHAPE;
+}
+
 
 ModuleBase_FilterStarter::ModuleBase_FilterStarter(const std::string& theFeature,
   QWidget* theParent, ModuleBase_IWorkshop* theWorkshop)
@@ -74,40 +102,17 @@ ModuleBase_FilterStarter::ModuleBase_FilterStarter(const std::string& theFeature
 
 void ModuleBase_FilterStarter::onFiltersLaunch()
 {
-  SelectionType = myShapeType;
   ModuleBase_WidgetMultiSelector* aSelector =
     dynamic_cast<ModuleBase_WidgetMultiSelector*>(parent());
-  aSelector->onSelectionTypeChanged(); // In order to clear current selection
-  aSelector->storeValue(); // Store values defined by user
+  SelectorFeature = aSelector->feature();
+  AttributeId = aSelector->attributeID();
 
+  // Launch Filters operation
   ModuleBase_OperationFeature* aFOperation = dynamic_cast<ModuleBase_OperationFeature*>
     (myWorkshop->module()->createOperation(myFeatureName));
   myWorkshop->processLaunchOperation(aFOperation);
 }
 
-void ModuleBase_FilterStarter::setSelectionType(const QString& theType)
-{
-  QString aType = theType.toUpper();
-  if ((aType == "VERTEX") || (aType == "VERTICES"))
-    myShapeType = GeomAPI_Shape::VERTEX;
-  else if ((aType == "EDGE") || (aType == "EDGES"))
-    myShapeType = GeomAPI_Shape::EDGE;
-  else if ((aType == "WIRE") || (aType == "WIRES"))
-    myShapeType = GeomAPI_Shape::WIRE;
-  else if ((aType == "FACE") || (aType == "FACES"))
-    myShapeType = GeomAPI_Shape::FACE;
-  else if ((aType == "SHELL") || (aType == "SHELLS"))
-    myShapeType = GeomAPI_Shape::SHELL;
-  else if ((aType == "SOLID") || (aType == "SOLIDS"))
-    myShapeType = GeomAPI_Shape::SOLID;
-  else if ((aType == "COMPSOLID") || (aType == "COMPSOLIDS"))
-    myShapeType = GeomAPI_Shape::COMPSOLID;
-  else if ((aType == "COMPOUND") || (aType == "COMPOUNDS"))
-    myShapeType = GeomAPI_Shape::COMPOUND;
-  else
-    myShapeType = GeomAPI_Shape::SHAPE;
-}
-
 //*****************************************************************************
 //*****************************************************************************
 //*****************************************************************************
@@ -161,10 +166,18 @@ void ModuleBase_FilterItem::onDelete()
 ModuleBase_WidgetSelectionFilter::ModuleBase_WidgetSelectionFilter(QWidget* theParent,
   ModuleBase_IWorkshop* theWorkshop, const Config_WidgetAPI* theData)
   : ModuleBase_ModelWidget(theParent, theData),
-  myWorkshop(theWorkshop), mySelectionType(SelectionType)
+  myWorkshop(theWorkshop),
+  mySelectorFeature(SelectorFeature),
+  mySelectorAttribute(AttributeId)
 {
-  myOwners = new SelectMgr_IndexedMapOfOwner();
-
+  // Clear Old selection
+  AttributePtr aAttr = SelectorFeature->attribute(AttributeId);
+  AttributeSelectionListPtr aSelListAttr =
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aAttr);
+  mySelectionType = selectionType(aSelListAttr->selectionType().c_str());
+  aSelListAttr->clear();
+
+  // Define widgets
   QVBoxLayout* aMainLayout = new QVBoxLayout(this);
   ModuleBase_Tools::adjustMargins(aMainLayout);
 
@@ -250,24 +263,27 @@ ModuleBase_WidgetSelectionFilter::ModuleBase_WidgetSelectionFilter(QWidget* theP
 
 ModuleBase_WidgetSelectionFilter::~ModuleBase_WidgetSelectionFilter()
 {
-  myOwners.Nullify();
-  if ((!myPreview.IsNull()) && myShowBtn->isChecked()) {
+  myValues.clear();
+  if (!myPreview.IsNull()) {
     Handle(AIS_InteractiveContext) aCtx = myWorkshop->viewer()->AISContext();
     aCtx->Remove(myPreview, false);
     myPreview.Nullify();
-    AIS_ListOfInteractive::const_iterator aIt;
-    Handle(AIS_Shape) aShapeIO;
-    for (aIt = myListIO.cbegin(); aIt != myListIO.cend(); aIt++) {
-      aShapeIO = Handle(AIS_Shape)::DownCast(*aIt);
-      if (!aShapeIO.IsNull()) {
-        aCtx->Display(aShapeIO, false);
+    if (myShowBtn->isChecked()) {
+      AIS_ListOfInteractive::const_iterator aIt;
+      Handle(AIS_Shape) aShapeIO;
+      for (aIt = myListIO.cbegin(); aIt != myListIO.cend(); aIt++) {
+        aShapeIO = Handle(AIS_Shape)::DownCast(*aIt);
+        if (!aShapeIO.IsNull()) {
+          aCtx->Display(aShapeIO, false);
+        }
       }
     }
     aCtx->UpdateCurrentViewer();
   }
+  SelectorFeature = FeaturePtr();
+  AttributeId = "";
 }
 
-
 void ModuleBase_WidgetSelectionFilter::onAddItem()
 {
   int aId = myFiltersCombo->currentIndex();
@@ -325,14 +341,15 @@ void ModuleBase_WidgetSelectionFilter::onSelect()
   aBuilder.MakeCompound(aComp);
 
   if (!myShowBtn->isChecked()) {
+    myListIO.Clear();
     aCtx->DisplayedObjects(AIS_KOI_Shape, -1, myListIO);
     if (!myPreview.IsNull())
       myListIO.Remove(myPreview);
   }
   AIS_ListOfInteractive::const_iterator aIt;
-  Handle(AIS_Shape) aShapeIO;
+  Handle(ModuleBase_ResultPrs) aShapeIO;
   for (aIt = myListIO.cbegin(); aIt != myListIO.cend(); aIt++) {
-    aShapeIO = Handle(AIS_Shape)::DownCast(*aIt);
+    aShapeIO = Handle(ModuleBase_ResultPrs)::DownCast(*aIt);
     if (!aShapeIO.IsNull()) {
       GeomShapePtr aShape(new GeomAPI_Shape);
       aShape->setImpl(new TopoDS_Shape(aShapeIO->Shape()));
@@ -352,13 +369,15 @@ void ModuleBase_WidgetSelectionFilter::onSelect()
         if (isValid) {
           TopoDS_Shape aTShape = aShape->impl<TopoDS_Shape>();
           Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner(aTShape, aShapeIO, true);
-          myOwners->Add(aOwner);
           aBuilder.Add(aComp, aTShape);
+
+          ModuleBase_ViewerPrsPtr aValue(new ModuleBase_ViewerPrs(aShapeIO->getResult(), aShape, aOwner));
+          myValues.append(aValue);
         }
       }
     }
   }
-  if (myOwners->Size() > 0)
+  if (myValues.size() > 0)
     updatePreview(aComp);
   updateNumberSelected();
 }
@@ -420,7 +439,7 @@ void ModuleBase_WidgetSelectionFilter::updateSelectBtn()
 
 void ModuleBase_WidgetSelectionFilter::updateNumberSelected()
 {
-  myNbLbl->setText(QString::number(myOwners->Size()));
+  myNbLbl->setText(QString::number(myValues.size()));
 }
 QList<QWidget*> ModuleBase_WidgetSelectionFilter::getControls() const
 {
@@ -429,10 +448,21 @@ QList<QWidget*> ModuleBase_WidgetSelectionFilter::getControls() const
 
 void ModuleBase_WidgetSelectionFilter::clearCurrentSelection(bool toUpdate)
 {
-  myOwners->Clear();
+  myValues.clear();
   if (!myPreview.IsNull()) {
     Handle(AIS_InteractiveContext) aCtx = myWorkshop->viewer()->AISContext();
     aCtx->Remove(myPreview, toUpdate);
     myPreview.Nullify();
   }
 }
+
+void ModuleBase_WidgetSelectionFilter::onFeatureAccepted()
+{
+  AttributePtr aAttr = mySelectorFeature->attribute(mySelectorAttribute);
+  AttributeSelectionListPtr aSelListAttr =
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aAttr);
+  aSelListAttr->clear();
+  foreach(ModuleBase_ViewerPrsPtr aPrs, myValues) {
+    aSelListAttr->append(aPrs->object(), aPrs->shape());
+  }
+}
\ No newline at end of file
index 797af8a997bda836a87091ad6636d7bbf2820e39..695d94e3da8516ea3a81c098b01627f4254f2dd5 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "ModuleBase.h"
 #include "ModuleBase_ModelWidget.h"
+#include "ModuleBase_ViewerPrs.h"
 
 #include <ModelAPI_Filter.h>
 
@@ -31,6 +32,7 @@
 #include <AIS_ListOfInteractive.hxx>
 
 #include <QWidget>
+#include <QList>
 
 class QLabel;
 class QComboBox;
@@ -50,8 +52,6 @@ public:
 
   ~ModuleBase_FilterStarter() {}
 
-  void setSelectionType(const QString& theType);
-
 private slots:
   void onFiltersLaunch();
 
@@ -61,7 +61,6 @@ private:
 
   QLabel* myFilterLbl;
   QLabel* myModifyLbl;
-  int myShapeType;
 };
 
 
@@ -98,10 +97,14 @@ public:
   /// \return a control list
   virtual QList<QWidget*> getControls() const;
 
+  /// It is called when user press Ok or OkPlus buttons in the parent property panel
+  /// By default this slot does nothing
+  virtual void onFeatureAccepted();
+
 protected:
   /// Saves the internal parameters to the given feature (not ussed for this widget)
   /// \return True in success
-  virtual bool storeValueCustom() { return true;  }
+  virtual bool storeValueCustom() { return true; }
 
   /// Restore value from attribute data to the widget's control (not ussed for this widget)
   virtual bool restoreValueCustom() { return true; }
@@ -132,10 +135,13 @@ private:
   std::list<FilterPtr> myFilters;
   std::list<FilterPtr> myUseFilters;
 
-  Handle(SelectMgr_IndexedMapOfOwner) myOwners;
+  QList<ModuleBase_ViewerPrsPtr> myValues;
   Handle(AIS_Shape) myPreview;
 
   AIS_ListOfInteractive myListIO;
+
+  FeaturePtr mySelectorFeature;
+  std::string mySelectorAttribute;
 };