X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomValidators%2FGeomValidators_Face.cpp;h=dd415526378ab07ea1531b9d0558641f260fb1b2;hb=53b5b11e96fa0bb95c007e7022c83ad08119d163;hp=821b45cb0755d58d8e11b839b9167a4817beb3d1;hpb=a0f9fa9b8b14687a645ff6c92231d3a927167d68;p=modules%2Fshaper.git diff --git a/src/GeomValidators/GeomValidators_Face.cpp b/src/GeomValidators/GeomValidators_Face.cpp index 821b45cb0..dd4155263 100644 --- a/src/GeomValidators/GeomValidators_Face.cpp +++ b/src/GeomValidators/GeomValidators_Face.cpp @@ -8,7 +8,9 @@ #include -#include +#include + +#include #include #include @@ -16,7 +18,7 @@ typedef std::map FaceTypes; static FaceTypes MyFaceTypes; -GeomAbs_SurfaceType GeomValidators_Face::faceType(const std::string& theType) +GeomAbs_SurfaceType faceType(const std::string& theType) { if (MyFaceTypes.size() == 0) { MyFaceTypes["plane"] = GeomAbs_Plane; @@ -26,40 +28,73 @@ GeomAbs_SurfaceType GeomValidators_Face::faceType(const std::string& theType) if (MyFaceTypes.find(aType) != MyFaceTypes.end()) return MyFaceTypes[aType]; - Events_Error::send("Face type defined in XML is not implemented!"); + Events_InfoMessage("GeomValidators_Face", "Face type defined in XML is not implemented!").send(); return GeomAbs_Plane; } bool GeomValidators_Face::isValid(const AttributePtr& theAttribute, - const std::list& theArguments) const + const std::list& theArguments, + Events_InfoMessage& theError) const { - bool aValid = false; - - GeomAbs_SurfaceType aFaceType = GeomAbs_Plane; - if (theArguments.size() == 1) { - std::string anArgument = theArguments.front(); - aFaceType = faceType(anArgument); + std::string anAttributeType = theAttribute->attributeType(); + if (anAttributeType != ModelAPI_AttributeSelection::typeId()) { + theError = "The attribute with the %1 type is not processed"; + theError.arg(theAttribute->attributeType()); + return false; } + bool aValid = true; ObjectPtr anObject = GeomValidators_Tools::getObject(theAttribute); - if (anObject.get() != NULL) { - AttributeSelectionPtr aSelectionAttr = std::dynamic_pointer_cast - (theAttribute); + if (!anObject.get()) { + aValid = true; // an empty face selected is valid. + } + else { + AttributeSelectionPtr aSelectionAttr = + std::dynamic_pointer_cast(theAttribute); std::shared_ptr aGeomShape = aSelectionAttr->value(); - std::shared_ptr aGeomFace(new GeomAPI_Face(aGeomShape)); - if (aGeomFace.get() != NULL) { - switch(aFaceType) { - case GeomAbs_Plane: + if (!aGeomShape.get()) { + // if the shape is empty, apply the validator to the shape of result + aGeomShape = aSelectionAttr->context()->shape(); + } + // it is necessary to check whether the shape is face in order to set in selection a value + // with any type and check the type in this validator + // It is realized to select any object in OB and filter it in this validator (sketch plane) + if (!aGeomShape->isFace()) { + aValid = false; + theError = "The shape is not a face."; + } + else { + std::shared_ptr aGeomFace(new GeomAPI_Face(aGeomShape)); + if (!aGeomFace.get()) { + aValid = false; + theError = "The shape is not a face."; + } + else { + GeomAbs_SurfaceType aFaceType = GeomAbs_Plane; + if (theArguments.size() == 1) + aFaceType = faceType(theArguments.front()); + + switch (aFaceType) { + case GeomAbs_Plane: { aValid = aGeomFace->isPlanar(); + if (!aValid) + theError = "The shape is not a plane."; + } + break; + case GeomAbs_Cylinder:{ + aValid = aGeomFace->isCylindrical(); + if (!aValid) + theError = "The shape is not a cylinder."; + } + break; + default: { + aValid = false; + theError = "The shape is not an available face."; break; - case GeomAbs_Cylinder: - break; - default: - break; + } + } } } } - else - aValid = true; // an empty face selected is valid. return aValid; }