Salome HOME
Issue #1860: fix end lines with spaces
[modules/shaper.git] / src / GeomValidators / GeomValidators_Face.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3
4 #include "GeomValidators_Face.h"
5 #include "GeomValidators_Tools.h"
6
7 #include "ModelAPI_AttributeSelection.h"
8
9 #include <GeomAPI_Face.h>
10
11 #include <GeomAbs_SurfaceType.hxx>
12
13 #include <Events_InfoMessage.h>
14
15 #include <QString>
16 #include <QMap>
17
18 typedef std::map<std::string, GeomAbs_SurfaceType> FaceTypes;
19 static FaceTypes MyFaceTypes;
20
21 GeomAbs_SurfaceType faceType(const std::string& theType)
22 {
23   if (MyFaceTypes.size() == 0) {
24     MyFaceTypes["plane"] = GeomAbs_Plane;
25     MyFaceTypes["cylinder"] = GeomAbs_Cylinder;
26   }
27   std::string aType = std::string(theType.c_str());
28   if (MyFaceTypes.find(aType) != MyFaceTypes.end())
29     return MyFaceTypes[aType];
30
31   Events_InfoMessage("GeomValidators_Face", "Face type defined in XML is not implemented!").send();
32   return GeomAbs_Plane;
33 }
34
35 bool GeomValidators_Face::isValid(const AttributePtr& theAttribute,
36                                   const std::list<std::string>& theArguments,
37                                   Events_InfoMessage& theError) const
38 {
39   std::string anAttributeType = theAttribute->attributeType();
40   if (anAttributeType != ModelAPI_AttributeSelection::typeId()) {
41     theError = "The attribute with the %1 type is not processed";
42     theError.arg(theAttribute->attributeType());
43     return false;
44   }
45
46   bool aValid = true;
47   ObjectPtr anObject = GeomValidators_Tools::getObject(theAttribute);
48   if (!anObject.get()) {
49     aValid = true; // an empty face selected is valid.
50   }
51   else {
52     AttributeSelectionPtr aSelectionAttr =
53       std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(theAttribute);
54     std::shared_ptr<GeomAPI_Shape> aGeomShape = aSelectionAttr->value();
55     if (!aGeomShape.get()) {
56       // if the shape is empty, apply the validator to the shape of result
57       aGeomShape = aSelectionAttr->context()->shape();
58     }
59     // it is necessary to check whether the shape is face in order to set in selection a value
60     // with any type and check the type in this validator
61     // It is realized to select any object in OB and filter it in this validator (sketch plane)
62     if (!aGeomShape->isFace()) {
63       aValid = false;
64       theError = "The shape is not a face.";
65     }
66     else {
67       std::shared_ptr<GeomAPI_Face> aGeomFace(new GeomAPI_Face(aGeomShape));
68       if (!aGeomFace.get()) {
69         aValid = false;
70         theError = "The shape is not a face.";
71       }
72       else {
73         GeomAbs_SurfaceType aFaceType = GeomAbs_Plane;
74         if (theArguments.size() == 1)
75           aFaceType = faceType(theArguments.front());
76
77         switch (aFaceType) {
78           case GeomAbs_Plane: {
79             aValid = aGeomFace->isPlanar();
80             if (!aValid)
81               theError = "The shape is not a plane.";
82           }
83           break;
84           case GeomAbs_Cylinder:{
85             aValid = aGeomFace->isCylindrical();
86             if (!aValid)
87               theError = "The shape is not a cylinder.";
88           }
89           break;
90           default: {
91             aValid = false;
92             theError = "The shape is not an available face.";
93             break;
94           }
95         }
96       }
97     }
98   }
99   return aValid;
100 }