Salome HOME
Merge branch 'Dev_0.7.1' of newgeom:newgeom.git into Dev_0.7.1
[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 <PartSet_Tools.h>
11 #include <SketchPlugin_Feature.h>
12
13
14 bool PartSet_WidgetShapeSelector::storeValue() const
15 {
16   if (!mySelectedObject)
17     return false;
18
19   FeaturePtr aSelectedFeature = ModelAPI_Feature::feature(mySelectedObject);
20   if (aSelectedFeature == myFeature)  // In order to avoid selection of the same object
21     return false;
22   std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
23           std::dynamic_pointer_cast<SketchPlugin_Feature>(aSelectedFeature);
24   if ((!aSPFeature) && (!myShape->isNull())) {
25     // Processing of external (non-sketch) object
26     ObjectPtr aObj = PartSet_Tools::createFixedObjectByEdge(myShape->impl<TopoDS_Shape>(),
27                                                             mySelectedObject, mySketch);
28     if (aObj) {
29       PartSet_WidgetShapeSelector* that = (PartSet_WidgetShapeSelector*) this;
30       that->mySelectedObject = aObj;
31     } else 
32       return false;
33   } else {
34     // Processing of sketch object
35     DataPtr aData = myFeature->data();
36     if (myShape) {
37       AttributePtr aAttr = aData->attribute(attributeID());
38       AttributeRefAttrPtr aRefAttr = 
39         std::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aAttr);
40       if (aRefAttr) {
41         TopoDS_Shape aShape = myShape->impl<TopoDS_Shape>();
42         AttributePtr aPntAttr = PartSet_Tools::findAttributeBy2dPoint(mySelectedObject, aShape, mySketch);
43         // this is an alternative, whether the attribute should be set or object in the attribute
44         // the first check is the attribute because the object already exist
45         // the object is set only if there is no selected attribute
46         // test case is - preselection for distance operation, which contains two points selected on lines
47         if (aPntAttr)
48           aRefAttr->setAttr(aPntAttr);
49         else if (mySelectedObject)
50           aRefAttr->setObject(mySelectedObject);
51         updateObject(myFeature);
52         return true;
53       }
54     }
55   }
56   return ModuleBase_WidgetShapeSelector::storeValue();
57 }
58
59 //*********************************************
60 bool PartSet_WidgetConstraintShapeSelector::storeValue() const
61 {
62   FeaturePtr aFeature = ModelAPI_Feature::feature(mySelectedObject);
63   if (aFeature) {
64     std::shared_ptr<SketchPlugin_Feature> aSPFeature = 
65             std::dynamic_pointer_cast<SketchPlugin_Feature>(aFeature);
66     if ((!aSPFeature) && (!myShape->isNull())) {
67       ObjectPtr aObj = PartSet_Tools::createFixedObjectByEdge(myShape->impl<TopoDS_Shape>(),
68                                                               mySelectedObject, mySketch);
69       if (aObj) {
70         PartSet_WidgetConstraintShapeSelector* that = (PartSet_WidgetConstraintShapeSelector*) this;
71         that->mySelectedObject = aObj;
72       } else 
73         return false;
74     }
75   }
76   return ModuleBase_WidgetShapeSelector::storeValue();
77 }
78