X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_Validators.cpp;h=55f0157b003a2ff8e9f36cdc1ec364f706b1d98f;hb=c55b14977783111c8b418b416c7f6c2fa545c5e5;hp=be4ffafa81d8b37cb8275b03249195f74cec84cd;hpb=7a9d129fbffa9ad35c2c25eaace17459b829015b;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_Validators.cpp b/src/PartSet/PartSet_Validators.cpp index be4ffafa8..55f0157b0 100644 --- a/src/PartSet/PartSet_Validators.cpp +++ b/src/PartSet/PartSet_Validators.cpp @@ -20,8 +20,10 @@ #include #include #include +#include #include +#include #include #ifdef _DEBUG @@ -62,31 +64,31 @@ int shapesNbLines(const ModuleBase_ISelection* theSelection) return aCount; } -bool PartSet_DistanceValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_DistanceSelection::isValid(const ModuleBase_ISelection* theSelection) const { int aCount = shapesNbPoints(theSelection) + shapesNbLines(theSelection); return (aCount > 0) && (aCount < 3); } -bool PartSet_LengthValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_LengthSelection::isValid(const ModuleBase_ISelection* theSelection) const { int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 2); + return (aCount == 1); } -bool PartSet_PerpendicularValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_PerpendicularSelection::isValid(const ModuleBase_ISelection* theSelection) const { int aCount = shapesNbLines(theSelection); return (aCount > 0) && (aCount < 3); } -bool PartSet_ParallelValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_ParallelSelection::isValid(const ModuleBase_ISelection* theSelection) const { int aCount = shapesNbLines(theSelection); return (aCount > 0) && (aCount < 3); } -bool PartSet_RadiusValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_RadiusSelection::isValid(const ModuleBase_ISelection* theSelection) const { QList aList = theSelection->getSelected(); ModuleBase_ViewerPrs aPrs; @@ -104,15 +106,79 @@ bool PartSet_RadiusValidator::isValid(const ModuleBase_ISelection* theSelection) } } } - return (aCount > 0) && (aCount < 2); + return (aCount == 1); } -bool PartSet_RigidValidator::isValid(const ModuleBase_ISelection* theSelection) const +bool PartSet_RigidSelection::isValid(const ModuleBase_ISelection* theSelection) const +{ + QList aList = theSelection->getSelected(); + return (aList.count() == 1); +} + + +bool PartSet_CoincidentSelection::isValid(const ModuleBase_ISelection* theSelection) const +{ + int aCount = shapesNbPoints(theSelection); + return (aCount > 0) && (aCount < 3); +} + +bool PartSet_HVDirSelection::isValid(const ModuleBase_ISelection* theSelection) const +{ + int aCount = shapesNbLines(theSelection); + return (aCount == 1); +} + +bool PartSet_FilletSelection::isValid(const ModuleBase_ISelection* theSelection) const { int aCount = shapesNbLines(theSelection); - return (aCount > 0) && (aCount < 2); + return (aCount > 0) && (aCount < 3); } +bool PartSet_TangentSelection::isValid(const ModuleBase_ISelection* theSelection) const +{ + QList aList = theSelection->getSelected(); + if ((aList.size() == 0) || (aList.size() > 2)) + return false; + + ModuleBase_ViewerPrs aPrs = aList.first(); + const TopoDS_Shape& aShape = aPrs.shape(); + if (aShape.IsNull()) + return false; + + if (aShape.ShapeType() != TopAbs_EDGE) + return false; + + std::shared_ptr aShapePtr(new GeomAPI_Shape); + aShapePtr->setImpl(new TopoDS_Shape(aShape)); + GeomAPI_Edge aEdge1(aShapePtr); + + if (aEdge1.isLine() || aEdge1.isArc()) { + if (aList.size() == 2) { + // Check second selection + aPrs = aList.last(); + const TopoDS_Shape& aShape2 = aPrs.shape(); + if (aShape2.IsNull()) + return false; + + if (aShape2.ShapeType() != TopAbs_EDGE) + return false; + + std::shared_ptr aShapePtr2(new GeomAPI_Shape); + aShapePtr2->setImpl(new TopoDS_Shape(aShape2)); + GeomAPI_Edge aEdge2(aShapePtr2); + if (aEdge1.isLine() && aEdge2.isArc()) + return true; + else if (aEdge1.isArc() && aEdge2.isLine()) + return true; + else + return false; + } else + return true; + } + return false; +} + + bool PartSet_DifferentObjectsValidator::isValid(const AttributePtr& theAttribute, const std::list& theArguments) const { @@ -246,8 +312,16 @@ bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute, for (int i = 0; i < aSelectionListAttr->size() && isSketchEntities; i++) { AttributeSelectionPtr aSelectAttr = aSelectionListAttr->value(i); ObjectPtr anObject = aSelectAttr->context(); - FeaturePtr aFeature = ModelAPI_Feature::feature(anObject); - isSketchEntities = anEntityKinds.find(aFeature->getKind()) != anEntityKinds.end(); + // a context of the selection attribute is a feature result. It can be a case when the result + // of the feature is null, e.g. the feature is modified and has not been executed yet. + // The validator returns an invalid result here. The case is an extrusion built on a sketch + // feature. A new sketch element creation leads to an empty result. + if (!anObject.get()) + isSketchEntities = false; + else { + FeaturePtr aFeature = ModelAPI_Feature::feature(anObject); + isSketchEntities = anEntityKinds.find(aFeature->getKind()) != anEntityKinds.end(); + } } } if (anAttributeType == ModelAPI_AttributeRefAttr::typeId()) { @@ -266,3 +340,32 @@ bool PartSet_SketchEntityValidator::isValid(const AttributePtr& theAttribute, return isSketchEntities; } + + + +bool PartSet_SameTypeAttrValidator::isValid( + const AttributePtr& theAttribute, const std::list& theArguments ) const +{ + // there is a check whether the feature contains a point and a linear edge or two point values + std::string aParamA = theArguments.front(); + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); + + FeaturePtr aFeature = std::dynamic_pointer_cast(theAttribute->owner()); + AttributeRefAttrPtr aRefAttr = std::dynamic_pointer_cast(theAttribute); + if (!aRefAttr) + return false; + + bool isObject = aRefAttr->isObject(); + ObjectPtr anObject = aRefAttr->object(); + if (isObject && anObject) { + FeaturePtr aRefFea = ModelAPI_Feature::feature(anObject); + + AttributeRefAttrPtr aOtherAttr = aFeature->data()->refattr(aParamA); + ObjectPtr aOtherObject = aOtherAttr->object(); + FeaturePtr aOtherFea = ModelAPI_Feature::feature(aOtherObject); + return aRefFea->getKind() == aOtherFea->getKind(); + } + return false; +} +