X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConstructionPlugin%2FConstructionPlugin_Validators.cpp;h=fbe2fb92e88424a5041201f38b843d338508f5f6;hb=refs%2Fheads%2FV9_11_BR;hp=9cf88ccd9b1a4e4bc2091c763d6fb8c00bb01bc5;hpb=24e5375957ba83cea9bf9fbe9bff030df996914a;p=modules%2Fshaper.git diff --git a/src/ConstructionPlugin/ConstructionPlugin_Validators.cpp b/src/ConstructionPlugin/ConstructionPlugin_Validators.cpp index 9cf88ccd9..fbe2fb92e 100644 --- a/src/ConstructionPlugin/ConstructionPlugin_Validators.cpp +++ b/src/ConstructionPlugin/ConstructionPlugin_Validators.cpp @@ -1,21 +1,41 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: ConstructionPlugin_Validators.cpp -// Created: 04 July 2016 -// Author: Dmitry Bobylev +// Copyright (C) 2014-2023 CEA, EDF +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "ConstructionPlugin_Validators.h" +#include #include #include #include #include #include +#include +#include +#include #include +#include #include +static std::shared_ptr getEdge(const GeomShapePtr theShape); +static std::shared_ptr getFace(const GeomShapePtr theShape); static std::shared_ptr getLin(const GeomShapePtr theShape); static std::shared_ptr getPln(const GeomShapePtr theShape); static std::shared_ptr getPnt(const GeomShapePtr theShape); @@ -27,13 +47,14 @@ bool ConstructionPlugin_ValidatorPointLines::isValid(const AttributePtr& theAttr { FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); - AttributeSelectionPtr aLineAttribute1 = std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr aLineAttribute1 = + std::dynamic_pointer_cast(theAttribute); AttributeSelectionPtr aLineAttribute2 = aFeature->selection(theArguments.front()); GeomShapePtr aLineShape1 = aLineAttribute1->value(); ResultPtr aContext1 = aLineAttribute1->context(); if(!aContext1.get()) { - theError = "One of the attribute not initialized."; + theError = "One of the attribute is not initialized."; return false; } if(!aLineShape1.get()) { @@ -63,6 +84,11 @@ bool ConstructionPlugin_ValidatorPointLines::isValid(const AttributePtr& theAttr std::shared_ptr aLine1 = aLineEdge1->line(); std::shared_ptr aLine2 = aLineEdge2->line(); + if (!aLine1.get() || !aLine2.get()) { + theError = "Selected edge is not a line."; + return false; + } + if(!aLine1->isCoplanar(aLine2)) { theError = "Selected lines not coplanar."; return false; @@ -77,23 +103,24 @@ bool ConstructionPlugin_ValidatorPointLines::isValid(const AttributePtr& theAttr } //================================================================================================== -bool ConstructionPlugin_ValidatorPointLineAndPlaneNotParallel::isValid( +bool ConstructionPlugin_ValidatorPointEdgeAndPlaneNotParallel::isValid( const AttributePtr& theAttribute, const std::list& theArguments, Events_InfoMessage& theError) const { FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); - AttributeSelectionPtr anAttribute1 = std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttribute1 = + std::dynamic_pointer_cast(theAttribute); AttributeSelectionPtr anAttribute2 = aFeature->selection(theArguments.front()); - std::shared_ptr aLin; - std::shared_ptr aPln; + std::shared_ptr anEdge; + std::shared_ptr aFace; GeomShapePtr aShape1 = anAttribute1->value(); ResultPtr aContext1 = anAttribute1->context(); if(!aContext1.get()) { - theError = "One of the attribute not initialized."; + theError = "One of the attribute is not initialized."; return false; } if(!aShape1.get()) { @@ -109,20 +136,20 @@ bool ConstructionPlugin_ValidatorPointLineAndPlaneNotParallel::isValid( aShape2 = aContext2->shape(); } - aLin = getLin(aShape1); - aPln = getPln(aShape2); - if(!aLin.get() || !aPln.get()) { - aLin = getLin(aShape2); - aPln = getPln(aShape1); + anEdge = getEdge(aShape1); + aFace = getFace(aShape2); + if(!anEdge.get() || !aFace.get()) { + anEdge = getEdge(aShape2); + aFace = getFace(aShape1); } - if(!aLin.get() || !aPln.get()) { + if(!anEdge.get() || !aFace.get()) { theError = "Wrong shape types selected."; return false; } - if(aPln->isParallel(aLin)) { - theError = "Plane and line are parallel."; + if(GeomAlgoAPI_ShapeTools::isParallel(anEdge, aFace)) { + theError = "Plane and edge are parallel."; return false; } @@ -131,19 +158,20 @@ bool ConstructionPlugin_ValidatorPointLineAndPlaneNotParallel::isValid( //================================================================================================== bool ConstructionPlugin_ValidatorPlaneThreePoints::isValid(const AttributePtr& theAttribute, - const std::list& theArguments, - Events_InfoMessage& theError) const + const std::list& theArguments, + Events_InfoMessage& theError) const { FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); - AttributeSelectionPtr aPointAttribute1 = std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr aPointAttribute1 = + std::dynamic_pointer_cast(theAttribute); AttributeSelectionPtr aPointAttribute2 = aFeature->selection(theArguments.front()); AttributeSelectionPtr aPointAttribute3 = aFeature->selection(theArguments.back()); GeomShapePtr aPointShape1 = aPointAttribute1->value(); ResultPtr aContext1 = aPointAttribute1->context(); if(!aContext1.get()) { - theError = "One of the attribute not initialized."; + theError = "One of the attribute is not initialized."; return false; } if(!aPointShape1.get()) { @@ -188,6 +216,11 @@ bool ConstructionPlugin_ValidatorPlaneThreePoints::isValid(const AttributePtr& t std::shared_ptr aPnt2 = aVertex2->point(); std::shared_ptr aPnt3 = aVertex3->point(); + if (aPnt1->isEqual(aPnt2)) { + theError = "Selected points are equal"; + return false; + } + std::shared_ptr aLin(new GeomAPI_Lin(aPnt1, aPnt2)); if(aLin->contains(aPnt3)) { @@ -206,7 +239,8 @@ bool ConstructionPlugin_ValidatorPlaneLinePoint::isValid( { FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); - AttributeSelectionPtr anAttribute1 = std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttribute1 = + std::dynamic_pointer_cast(theAttribute); AttributeSelectionPtr anAttribute2 = aFeature->selection(theArguments.front()); std::shared_ptr aLin; @@ -215,7 +249,7 @@ bool ConstructionPlugin_ValidatorPlaneLinePoint::isValid( GeomShapePtr aShape1 = anAttribute1->value(); ResultPtr aContext1 = anAttribute1->context(); if(!aContext1.get()) { - theError = "One of the attribute not initialized."; + theError = "One of the attribute is not initialized."; return false; } if(!aShape1.get()) { @@ -243,24 +277,269 @@ bool ConstructionPlugin_ValidatorPlaneLinePoint::isValid( return false; } - if(aLin->contains(aPnt)) { - theError = "Point lies on the line."; + // line should not contain point only for not-prependicular case + AttributeBooleanPtr aBoolAttr = aFeature->boolean(theArguments.back()); + if (aBoolAttr.get() && !aBoolAttr->value()) { + if(aLin->contains(aPnt)) { + theError = "Point lies on the line."; + return false; + } + } + + return true; +} + +//================================================================================================== +bool ConstructionPlugin_ValidatorPlaneTwoParallelPlanes::isValid( + const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); + + AttributeSelectionPtr anAttribute1 = + std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttribute2 = aFeature->selection(theArguments.front()); + + std::shared_ptr aPln1; + std::shared_ptr aPln2; + + GeomShapePtr aShape1 = anAttribute1->value(); + ResultPtr aContext1 = anAttribute1->context(); + if(!aContext1.get()) { + theError = "One of the attribute is not initialized."; + return false; + } + if(!aShape1.get()) { + aShape1 = aContext1->shape(); + } + + GeomShapePtr aShape2 = anAttribute2->value(); + ResultPtr aContext2 = anAttribute2->context(); + if(!aContext2.get()) { + return true; + } + if(!aShape2.get()) { + aShape2 = aContext2->shape(); + } + + aPln1 = getPln(aShape1); + aPln2 = getPln(aShape2); + + if(!aPln1.get() || !aPln2.get()) { + theError = "Wrong shape types selected."; + return false; + } + + std::shared_ptr aDir1 = aPln1->direction(); + std::shared_ptr aDir2 = aPln2->direction(); + + if(!aDir1->isParallel(aDir2)) { + theError = "Planes not parallel."; return false; } return true; } +//================================================================================================== +bool ConstructionPlugin_ValidatorAxisTwoNotParallelPlanes::isValid( + const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); + + AttributeSelectionPtr anAttribute1 = + std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttribute2 = aFeature->selection(theArguments.front()); + + std::shared_ptr aPln1; + std::shared_ptr aPln2; + + GeomShapePtr aShape1 = anAttribute1->value(); + ResultPtr aContext1 = anAttribute1->context(); + if(!aContext1.get()) { + theError = "One of the attribute is not initialized."; + return false; + } + if(!aShape1.get()) { + aShape1 = aContext1->shape(); + } + + GeomShapePtr aShape2 = anAttribute2->value(); + ResultPtr aContext2 = anAttribute2->context(); + if(!aContext2.get()) { + return true; + } + if(!aShape2.get()) { + aShape2 = aContext2->shape(); + } + + aPln1 = getPln(aShape1); + aPln2 = getPln(aShape2); + + if(!aPln1.get() || !aPln2.get()) { + theError = "Wrong shape types selected."; + return false; + } + + std::shared_ptr aDir1 = aPln1->direction(); + std::shared_ptr aDir2 = aPln2->direction(); + + if(aDir1->isParallel(aDir2)) { + theError = "Planes are parallel."; + return false; + } + + return true; +} + +//================================================================================================== +bool ConstructionPlugin_ValidatorPointThreeNonParallelPlanes::isValid( + const AttributePtr& theAttribute, + const std::list& theArguments, + Events_InfoMessage& theError) const +{ + FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner()); + + AttributeSelectionPtr anAttribute1 = + std::dynamic_pointer_cast(theAttribute); + AttributeSelectionPtr anAttribute2 = aFeature->selection(theArguments.front()); + AttributeSelectionPtr anAttribute3 = aFeature->selection(theArguments.back()); + + GeomShapePtr aShape1 = anAttribute1->value(); + ResultPtr aContext1 = anAttribute1->context(); + if (!aContext1.get()) { + theError = "One of the attribute is not initialized."; + return false; + } + if (!aShape1.get()) { + aShape1 = aContext1->shape(); + } + + std::shared_ptr aPln1 = getPln(aShape1); + if (!aPln1.get()) { + theError = "Wrong shape types selected."; + return false; + } + std::shared_ptr aDir1 = aPln1->direction(); + + if (anAttribute2.get()) { + GeomShapePtr aShape2 = anAttribute2->value(); + ResultPtr aContext2 = anAttribute2->context(); + if (!aShape2.get() && aContext2.get()) { + aShape2 = aContext2->shape(); + } + + if (aShape2.get()) { + std::shared_ptr aPln2 = getPln(aShape2); + if (!aPln2.get()) { + theError = "Wrong shape types selected."; + return false; + } + std::shared_ptr aDir2 = aPln2->direction(); + if (aDir1->isParallel(aDir2)) { + theError = "Planes are parallel."; + return false; + } + } + } + + if (anAttribute3.get()) { + GeomShapePtr aShape3 = anAttribute3->value(); + ResultPtr aContext3 = anAttribute3->context(); + if (!aShape3.get() && aContext3.get()) { + aShape3 = aContext3->shape(); + } + + if (aShape3.get()) { + std::shared_ptr aPln3 = getPln(aShape3); + if (!aPln3.get()) { + theError = "Wrong shape types selected."; + return false; + } + std::shared_ptr aDir3 = aPln3->direction(); + if (aDir1->isParallel(aDir3)) { + theError = "Planes are parallel."; + return false; + } + } + } + + return true; +} + +//================================================================================================== +bool ConstructionPlugin_ValidatorNotFeature::isValid( + const AttributePtr& theAttribute, + const std::list& /*theArguments*/, + Events_InfoMessage& theError) const +{ + AttributeSelectionPtr aSelAttr = + std::dynamic_pointer_cast(theAttribute); + if (!aSelAttr) { + theError = "Wrong attribute"; + return false; + } + + FeaturePtr aContextFeature = aSelAttr->contextFeature(); + if (aContextFeature) { + theError = "Feature should not be selected"; + return false; + } + return true; +} + +//================================================================================================== + +std::shared_ptr getEdge(const GeomShapePtr theShape) +{ + GeomEdgePtr anEdge; + + if(theShape->isEdge()) { + anEdge = theShape->edge(); + } + else if (theShape->isCompound()) { + GeomAPI_ShapeIterator anIt(theShape); + anEdge = anIt.current()->edge(); + } + + return anEdge; +} + +GeomFacePtr getFace(const GeomShapePtr theShape) +{ + GeomFacePtr aFace; + + if (theShape->isFace()) { + aFace = theShape->face(); + } + else if (theShape->isCompound()) { + GeomAPI_ShapeIterator anIt(theShape); + aFace = anIt.current()->face(); + } + + return aFace; +} + std::shared_ptr getLin(const GeomShapePtr theShape) { std::shared_ptr aLin; - if(!theShape->isEdge()) { + GeomEdgePtr anEdge; + + if (theShape->isEdge()) { + anEdge = theShape->edge(); + } + else if (theShape->isCompound()) { + GeomAPI_ShapeIterator anIt(theShape); + anEdge = anIt.current()->edge(); + } + else { return aLin; } - std::shared_ptr anEdge(new GeomAPI_Edge(theShape)); - if(!anEdge->isLine()) { return aLin; } @@ -274,13 +553,20 @@ std::shared_ptr getPln(const GeomShapePtr theShape) { std::shared_ptr aPln; - if(!theShape->isFace()) { + GeomFacePtr aFace; + + if(theShape->isFace()) { + aFace = theShape->face(); + } + else if (theShape->isCompound()) { + GeomAPI_ShapeIterator anIt(theShape); + aFace = anIt.current()->face(); + } + else { return aPln; } - std::shared_ptr aFace(new GeomAPI_Face(theShape)); - - if(!aFace->isPlanar()) { + if(!aFace || !aFace->isPlanar()) { return aPln; }