X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_Validators.cpp;h=1d6250afe4c3245bffd2b1be651f7af52b089a3b;hb=388c833ce58fe2991881c9a66d529d805fa84bd5;hp=296f8daa6e8e44a8c49b56444befb1e539063cb4;hpb=72ccabc2a906e229fe487dfeae61d38f921927d0;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Validators.cpp b/src/PartSet/PartSet_Validators.cpp index 296f8daa6..1d6250afe 100644 --- a/src/PartSet/PartSet_Validators.cpp +++ b/src/PartSet/PartSet_Validators.cpp @@ -4,10 +4,16 @@ #include "PartSet_Validators.h" +#include +#include +#include +#include +#include + #include -int shapesNb(const ModuleBase_ISelection* theSelection, TopAbs_ShapeEnum theType) +int shapesNbPoints(const ModuleBase_ISelection* theSelection) { std::list aList = theSelection->getSelected(); std::list::iterator it; @@ -17,21 +23,79 @@ int shapesNb(const ModuleBase_ISelection* theSelection, TopAbs_ShapeEnum theType aPrs = *it; const TopoDS_Shape& aShape = aPrs.shape(); if (!aShape.IsNull()) { - if (aShape.ShapeType() == theType) + if (aShape.ShapeType() == TopAbs_VERTEX) aCount++; } } return aCount; } +int shapesNbLines(const ModuleBase_ISelection* theSelection) +{ + std::list aList = theSelection->getSelected(); + std::list::iterator it; + ModuleBase_ViewerPrs aPrs; + int aCount = 0; + for (it = aList.begin(); it != aList.end(); ++it) { + aPrs = *it; + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull()) { + if (aShape.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge aEdge = TopoDS::Edge(aShape); + Standard_Real aStart, aEnd; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aEdge, aStart, aEnd); + GeomAdaptor_Curve aAdaptor(aCurve); + if (aAdaptor.GetType() == GeomAbs_Line) + aCount++; + } + } + } + return aCount; +} + bool PartSet_DistanceValidator::isValid(const ModuleBase_ISelection* theSelection) const { - int aCount = shapesNb(theSelection, TopAbs_VERTEX); + int aCount = shapesNbPoints(theSelection); return (aCount > 0) && (aCount < 3); } bool PartSet_LengthValidator::isValid(const ModuleBase_ISelection* theSelection) const { - int aCount = shapesNb(theSelection, TopAbs_EDGE); - return (aCount == 1); -} \ No newline at end of file + int aCount = shapesNbLines(theSelection); + return (aCount > 0) && (aCount < 2); +} + +bool PartSet_PerpendicularValidator::isValid(const ModuleBase_ISelection* theSelection) const +{ + int aCount = shapesNbLines(theSelection); + return (aCount > 0) && (aCount < 3); +} + +bool PartSet_ParallelValidator::isValid(const ModuleBase_ISelection* theSelection) const +{ + int aCount = shapesNbLines(theSelection); + return (aCount > 0) && (aCount < 3); +} + +bool PartSet_RadiusValidator::isValid(const ModuleBase_ISelection* theSelection) const +{ + std::list aList = theSelection->getSelected(); + std::list::iterator it; + ModuleBase_ViewerPrs aPrs; + int aCount = 0; + for (it = aList.begin(); it != aList.end(); ++it) { + aPrs = *it; + const TopoDS_Shape& aShape = aPrs.shape(); + if (!aShape.IsNull()) { + if (aShape.ShapeType() == TopAbs_EDGE) { + TopoDS_Edge aEdge = TopoDS::Edge(aShape); + Standard_Real aStart, aEnd; + Handle(Geom_Curve) aCurve = BRep_Tool::Curve(aEdge, aStart, aEnd); + GeomAdaptor_Curve aAdaptor(aCurve); + if (aAdaptor.GetType() == GeomAbs_Circle) + aCount++; + } + } + } + return (aCount > 0) && (aCount < 2); +}