Salome HOME
Multi-selection widget to be used in the extrusion feature.
[modules/shaper.git] / src / PartSet / PartSet_WidgetShapeSelector.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        PartSet_WidgetShapeSelector.cpp
4 // Created:     27 Nov 2014
5 // Author:      Vitaly Smetannikov
6
7 #include "PartSet_WidgetShapeSelector.h"
8
9 #include <ModelAPI_AttributeRefAttr.h>
10 #include <ModelAPI_Session.h>
11 #include <ModelAPI_Validator.h>
12 #include <ModelAPI_RefAttrValidator.h>
13 #include <ModelAPI_ResultValidator.h>
14
15 #include <PartSet_Tools.h>
16 #include <SketchPlugin_Feature.h>
17
18
19 bool PartSet_WidgetShapeSelector::storeValueCustom() const
20 {
21   if (!mySelectedObject)
22     return false;
23
24   FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject);
25   if (aSelectedFeature == myFeature)  // In order to avoid selection of the same object
26     return false;
27   std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
28           std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
29   if ((!aSPFeature) && (!myShape->isNull())) {
30     // Processing of external (non-sketch) object
31     ObjectPtr aObj = PartSet_Tools::createFixedObjectByExternal(myShape->impl<TopoDS_Shape>(),
32                                                                 mySelectedObject, mySketch);
33     if (aObj) {
34       PartSet_WidgetShapeSelector* that = (PartSet_WidgetShapeSelector*) this;
35       that->mySelectedObject = aObj;
36     } else 
37       return false;
38   } else {
39     // Processing of sketch object
40     DataPtr aData = myFeature->data();
41     if (myShape) {
42       AttributePtr aAttr = aData->attribute(attributeID());
43       AttributeRefAttrPtr aRefAttr = 
44         std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
45       if (aRefAttr) {
46         TopoDS_Shape aShape = myShape->impl<TopoDS_Shape>();
47         AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(mySelectedObject, aShape, mySketch);
48
49         // this is an alternative, whether the attribute should be set or object in the attribute
50         // the first check is the attribute because the object already exist
51         // the object is set only if there is no selected attribute
52         // test case is - preselection for distance operation, which contains two points selected on lines
53         if (aPntAttr)
54           aRefAttr->setAttr(aPntAttr);
55         else if (mySelectedObject)
56           aRefAttr->setObject(mySelectedObject);
57         updateObject(myFeature);
58         return true;
59       }
60     }
61   }
62   return ModuleBase_WidgetShapeSelector::storeValueCustom();
63 }
64