]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Mirror for external objects.
authornds <natalia.donis@opencascade.com>
Fri, 17 Apr 2015 07:44:11 +0000 (10:44 +0300)
committernds <natalia.donis@opencascade.com>
Fri, 17 Apr 2015 07:44:11 +0000 (10:44 +0300)
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/PartSet/PartSet_WidgetMultiSelector.cpp
src/PartSet/PartSet_WidgetMultiSelector.h
src/SketchPlugin/plugin-Sketch.xml

index 5f2bf3498abd470eb50efc4edb46858e94c5b3b6..9fc28310e116507ba863a82bd8c77c8383c43972 100644 (file)
@@ -115,7 +115,7 @@ protected slots:
   /// Start shape selection
   void activateShapeSelection();
 
- private:
+ protected:
    /// Update selection list
    void updateSelectionList(AttributeSelectionListPtr);
 
index c59c6919e7de0754a3d78e5a2d77e8d7e1320ba4..1c046be78d49a083c419f68ec88af9b030b9e1e6 100644 (file)
 #include <ModelAPI_Validator.h>
 
 #include <ModuleBase_Definitions.h>
+#include <ModuleBase_Tools.h>
+#include <ModuleBase_IWorkshop.h>
+#include <ModuleBase_ISelection.h>
+
 #include <Config_WidgetAPI.h>
 
 #include <PartSet_Tools.h>
 
 #include <XGUI_Workshop.h>
 
+#include <QComboBox>
+
 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);
 }
@@ -38,6 +44,99 @@ PartSet_WidgetMultiSelector::~PartSet_WidgetMultiSelector()
 //********************************************************************
 void PartSet_WidgetMultiSelector::restoreAttributeValue(const bool theValid)
 {
-  ModuleBase_WidgetShapeSelector::restoreAttributeValue(theValid);
+  ModuleBase_WidgetMultiSelector::restoreAttributeValue(theValid);
   myExternalObjectMgr->removeExternal(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<ModelAPI_Result>(anObject);
+  }
+  else {
+    aResult = std::dynamic_pointer_cast<ModelAPI_Result>(thePrs.object());
+  }
+
+
+  if (myFeature) {
+    // We can not select a result of our feature
+    const std::list<ResultPtr>& aResList = myFeature->results();
+    std::list<ResultPtr>::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<GeomAPI_Shape>(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<SketchPlugin_Feature> aSPFeature = 
+          std::dynamic_pointer_cast<SketchPlugin_Feature>(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()) {
+    aSelectedObject = myExternalObjectMgr->externalObject(theSelectedObject, theShape, sketch());
+  }
+
+
+  ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aSelectedObject);
+
+  DataPtr aData = myFeature->data();
+  AttributeSelectionListPtr aSelectionListAttr = 
+    std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(aData->attribute(attributeID()));
+
+  aSelectionListAttr->append(aResult, aShape);
+
+  return true;
+}
index db5d4085957e64d7632dbefe7da55b039690d247..0bb999f082cc898c886a3b5c49a069adb761838a 100644 (file)
@@ -10,7 +10,8 @@
 
 #include "PartSet.h"
 
-#include <ModuleBase_WidgetShapeSelector.h>
+#include <ModuleBase_WidgetMultiSelector.h>
+#include <ModuleBase_ViewerPrs.h>
 
 #include <ModelAPI_CompositeFeature.h>
 
@@ -18,10 +19,10 @@ class PartSet_ExternalObjectsMgr;
 
 /**
 * \ingroup Modules
-* Customosation of ModuleBase_WidgetShapeSelector in order to provide 
-* working with sketch specific objects.
+* Customosation of ModuleBase_WidgetMultiSelector in order to provide 
+* working with sketch specific objects and creation of external objects.
 */
-class PARTSET_EXPORT PartSet_WidgetMultiSelector: public ModuleBase_WidgetShapeSelector
+class PARTSET_EXPORT PartSet_WidgetMultiSelector: public ModuleBase_WidgetMultiSelector
 {
 Q_OBJECT
  public:
@@ -42,6 +43,10 @@ Q_OBJECT
   /// Retrurns installed sketcher
   CompositeFeaturePtr sketch() const { return mySketch; }
 
+  /// Fills the attribute with the value of the selected owner
+  /// \param theOwner a selected owner
+  virtual bool setSelectionCustom(const ModuleBase_ViewerPrs& thePrs);
+
 protected:
   /// Creates a backup of the current values of the attribute
   /// It should be realized in the specific widget because of different
@@ -49,6 +54,13 @@ protected:
   /// \param theValid a boolean flag, if restore happens for valid parameters
   void restoreAttributeValue(const bool theValid);
 
+  /// Store the values to the model attribute of the widget. It casts this attribute to
+  /// the specific type and set the given values
+  /// \param theSelectedObject an object
+  /// \param theShape a selected shape, which is used in the selection attribute
+  /// \return true if it is succeed
+  bool setObject(const ObjectPtr& theSelectedObject, const GeomShapePtr& theShape);
+
 protected:
   PartSet_ExternalObjectsMgr* myExternalObjectMgr;
   /// Pointer to a sketch 
index 0e828bbeef99be4c91be56bad3c1da37a10f2768..87f4cf32482a9f7df50a48bb90fe7c743f5aa536 100644 (file)
             label="Mirror line" tooltip="Select mirror line" shape_types="edge">
             <validator id="GeomValidators_Edge" parameters="line"/>
         </sketch_shape_selector>
-        <multi_selector id="ConstraintMirrorList"
+        <sketch_multi_selector id="ConstraintMirrorList"
             label="List of objects"
             tooltip="Select list of mirroring objects"
-            type_choice="Edges">
+            type_choice="Edges"
+            use_external="true">
             <validator id="SketchPlugin_MirrorAttr" />
-        </multi_selector>
+        </sketch_multi_selector>
       </feature>
     </group>
   </workbench>