]> SALOME platform Git repositories - modules/shaper.git/blob - src/ModuleBase/ModuleBase_WidgetFeatureOrAttribute.cpp
Salome HOME
525d243566f882b6332a6049438094b145b188fd
[modules/shaper.git] / src / ModuleBase / ModuleBase_WidgetFeatureOrAttribute.cpp
1 // File:        ModuleBase_WidgetFeatureOrAttribute.cpp
2 // Created:     25 Apr 2014
3 // Author:      Natalia ERMOLAEVA
4
5 #include <ModuleBase_WidgetFeatureOrAttribute.h>
6
7 #include <ModuleBase_WidgetValueFeature.h>
8 #include <ModuleBase_WidgetValue.h>
9 #include <ModuleBase_Tools.h>
10
11 #include <Config_Keywords.h>
12 #include <Config_WidgetAPI.h>
13
14 #include <Events_Loop.h>
15 #include <ModelAPI_Events.h>
16
17 #include <ModelAPI_Feature.h>
18 #include <ModelAPI_Data.h>
19 #include <ModelAPI_Object.h>
20 #include <ModelAPI_AttributeRefAttr.h>
21 #include <GeomAPI_Pnt2d.h>
22
23 #include <GeomDataAPI_Point2D.h>
24
25 #include <Precision.hxx>
26
27 #include <QWidget>
28 #include <QLineEdit>
29 #include <QHBoxLayout>
30 #include <QLabel>
31
32 ModuleBase_WidgetFeatureOrAttribute::ModuleBase_WidgetFeatureOrAttribute(QWidget* theParent,
33                                                    const Config_WidgetAPI* theData, 
34                                                    const std::string& theParentId)
35 : ModuleBase_WidgetFeature(theParent, theData, theParentId)
36 {
37 }
38
39 ModuleBase_WidgetFeatureOrAttribute::~ModuleBase_WidgetFeatureOrAttribute()
40 {
41 }
42
43 bool ModuleBase_WidgetFeatureOrAttribute::setValue(ModuleBase_WidgetValue* theValue)
44 {
45   bool isDone = false;
46
47   if (theValue) {
48     ModuleBase_WidgetValueFeature* aFeatureValue = 
49                          dynamic_cast<ModuleBase_WidgetValueFeature*>(theValue);
50     if (aFeatureValue) {
51       boost::shared_ptr<GeomAPI_Pnt2d> aValuePoint = aFeatureValue->point();
52       ObjectPtr aObject = aFeatureValue->object();
53       if (aObject) {
54         isDone = setObject(aObject, false);
55       }
56       if (aValuePoint) {
57         FeaturePtr aFeature = ModuleBase_Tools::feature(aObject);
58         if (aFeature) {
59           // find the given point in the feature attributes
60           std::list<boost::shared_ptr<ModelAPI_Attribute> > anAttiributes =
61                                         aFeature->data()->attributes(GeomDataAPI_Point2D::type());
62           std::list<boost::shared_ptr<ModelAPI_Attribute> >::const_iterator anIt = anAttiributes.begin(),
63                                                                             aLast = anAttiributes.end();
64           boost::shared_ptr<GeomDataAPI_Point2D> aFPoint;
65           for (;anIt!=aLast && !aFPoint; anIt++) {
66             boost::shared_ptr<GeomDataAPI_Point2D> aCurPoint =
67                                                 boost::dynamic_pointer_cast<GeomDataAPI_Point2D>(*anIt);
68             if (aCurPoint && aCurPoint->pnt()->distance(aValuePoint) < Precision::Confusion())
69               aFPoint = aCurPoint;
70           }
71           if (aFPoint)
72             isDone = setAttribute(aFPoint, false);
73         }
74       }
75       if (isDone)
76         emit valuesChanged();
77     }
78   }
79   return isDone;
80 }
81
82 bool ModuleBase_WidgetFeatureOrAttribute::storeValue(ObjectPtr theFeature) const
83 {
84   FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(theFeature);
85   if (!aFeature)
86     return false;
87
88   boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
89   boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
90           boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(attributeID()));
91
92   if (myObject)
93     aRef->setObject(myObject);
94   if (myAttribute)
95     aRef->setAttr(myAttribute);
96
97   aFeature->execute();
98   updateObject(theFeature);
99
100   return true;
101 }
102
103 bool ModuleBase_WidgetFeatureOrAttribute::restoreValue(ObjectPtr theFeature)
104 {
105   boost::shared_ptr<ModelAPI_Data> aData = theFeature->data();
106   boost::shared_ptr<ModelAPI_AttributeRefAttr> aRef =
107           boost::dynamic_pointer_cast<ModelAPI_AttributeRefAttr>(aData->attribute(attributeID()));
108
109   FeaturePtr aFeature = ModuleBase_Tools::feature(aRef->object());
110   if (aFeature) {
111     myObject = aFeature;
112     myAttribute = aRef->attr();
113
114     std::string aText = "";
115     if (aFeature)
116       aText = aFeature->data()->name().c_str();
117     if (myAttribute)
118       aText = myAttribute->attributeType().c_str();
119
120     editor()->setText(aText.c_str());
121     return true;
122   }
123   return false;
124 }
125
126 bool ModuleBase_WidgetFeatureOrAttribute::setAttribute(
127                                     const boost::shared_ptr<ModelAPI_Attribute>& theAttribute,
128                                     bool theSendEvent)
129 {
130   if (!theAttribute)// || !featureKinds().contains(theAttribute->attributeType().c_str()))
131     return false;
132
133   myAttribute = theAttribute;
134   editor()->setText(theAttribute ? theAttribute->attributeType().c_str() : "");
135   if (theSendEvent)
136     emit valuesChanged();
137   return true;
138 }
139