X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchPlugin%2FSketchPlugin_MacroEllipse.cpp;h=7ec4729668ae2f746a2a3f2ce8e082a4bc6dbdc5;hb=a4a0d955055f7d26fda227ad47211eaaef645cc7;hp=0b5ecf95c263b582edce9defe56443857e790a3b;hpb=d74c5f916e2c7d0eb1ee2fa128f0458c3d22675f;p=modules%2Fshaper.git diff --git a/src/SketchPlugin/SketchPlugin_MacroEllipse.cpp b/src/SketchPlugin/SketchPlugin_MacroEllipse.cpp index 0b5ecf95c..7ec472966 100644 --- a/src/SketchPlugin/SketchPlugin_MacroEllipse.cpp +++ b/src/SketchPlugin/SketchPlugin_MacroEllipse.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017-2019 CEA/DEN, EDF R&D +// Copyright (C) 2017-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -19,8 +19,11 @@ #include +#include #include +#include #include +#include #include #include @@ -41,6 +44,7 @@ #include #include +static const double TOLERANCE = 1.e-7; SketchPlugin_MacroEllipse::SketchPlugin_MacroEllipse() : SketchPlugin_SketchEntity(), @@ -54,22 +58,34 @@ void SketchPlugin_MacroEllipse::initAttributes() data()->addAttribute(ELLIPSE_TYPE(), ModelAPI_AttributeString::typeId()); data()->addAttribute(EDIT_ELLIPSE_TYPE(), ModelAPI_AttributeString::typeId()); - data()->addAttribute(FIRST_POINT_ID(), GeomDataAPI_Point2D::typeId()); - data()->addAttribute(FIRST_POINT_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); - data()->addAttribute(SECOND_POINT_ID(), GeomDataAPI_Point2D::typeId()); - data()->addAttribute(SECOND_POINT_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(CENTER_POINT_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(CENTER_POINT_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(MAJOR_AXIS_POINT_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(MAJOR_AXIS_POINT_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); data()->addAttribute(PASSED_POINT_ID(), GeomDataAPI_Point2D::typeId()); data()->addAttribute(PASSED_POINT_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(MAJOR_AXIS_START_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(MAJOR_AXIS_START_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(MAJOR_AXIS_END_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(MAJOR_AXIS_END_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(PASSED_POINT_1_ID(), GeomDataAPI_Point2D::typeId()); + data()->addAttribute(PASSED_POINT_1_REF_ID(), ModelAPI_AttributeRefAttr::typeId()); + data()->addAttribute(MAJOR_RADIUS_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(MINOR_RADIUS_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(AUXILIARY_ID(), ModelAPI_AttributeBoolean::typeId()); string(EDIT_ELLIPSE_TYPE())->setValue(""); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FIRST_POINT_REF_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), SECOND_POINT_REF_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), CENTER_POINT_REF_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory( + getKind(), MAJOR_AXIS_POINT_REF_ID()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), PASSED_POINT_REF_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory( + getKind(), MAJOR_AXIS_START_REF_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MAJOR_AXIS_END_REF_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), PASSED_POINT_1_REF_ID()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EDIT_ELLIPSE_TYPE()); } @@ -97,12 +113,25 @@ void SketchPlugin_MacroEllipse::execute() void SketchPlugin_MacroEllipse::attributeChanged(const std::string& theID) { static const int NB_POINTS = 3; - std::string aPointAttrName[NB_POINTS] = { FIRST_POINT_ID(), - SECOND_POINT_ID(), - PASSED_POINT_ID() }; - std::string aPointRefName[NB_POINTS] = { FIRST_POINT_REF_ID(), - SECOND_POINT_REF_ID(), - PASSED_POINT_REF_ID() }; + std::string aPointAttrName[NB_POINTS]; + std::string aPointRefName[NB_POINTS]; + if (string(ELLIPSE_TYPE())->value() == ELLIPSE_TYPE_BY_CENTER_AXIS_POINT()) { + aPointAttrName[0] = CENTER_POINT_ID(); + aPointAttrName[1] = MAJOR_AXIS_POINT_ID(); + aPointAttrName[2] = PASSED_POINT_ID(); + aPointRefName[0] = CENTER_POINT_REF_ID(); + aPointRefName[1] = MAJOR_AXIS_POINT_REF_ID(); + aPointRefName[2] = PASSED_POINT_REF_ID(); + } else if (string(ELLIPSE_TYPE())->value() == ELLIPSE_TYPE_BY_AXIS_AND_POINT()) { + aPointAttrName[0] = MAJOR_AXIS_START_ID(); + aPointAttrName[1] = MAJOR_AXIS_END_ID(); + aPointAttrName[2] = PASSED_POINT_1_ID(); + aPointRefName[0] = MAJOR_AXIS_START_REF_ID(); + aPointRefName[1] = MAJOR_AXIS_END_REF_ID(); + aPointRefName[2] = PASSED_POINT_1_REF_ID(); + } + else + return; // type of ellipse switched, thus reset all attributes if (theID == ELLIPSE_TYPE()) { @@ -141,6 +170,9 @@ void SketchPlugin_MacroEllipse::attributeChanged(const std::string& theID) anEllipsePoints[0]->setY(0.5 * (anEllipsePoints[0]->y() + anEllipsePoints[1]->y())); } + if (anEllipsePoints[0]->distance(anEllipsePoints[1]) < TOLERANCE) + return; // ellipse is not valid + std::shared_ptr anEllipse; if (aNbInitialized == 2) { GeomDir2dPtr aXDir(new GeomAPI_Dir2d(anEllipsePoints[1]->x() - anEllipsePoints[0]->x(), @@ -192,8 +224,12 @@ std::string SketchPlugin_MacroEllipse::processEvent( std::shared_ptr aClickedPoint = aReentrantMessage->clickedPoint(); if (aClickedPoint && (anObject || anAttribute)) { - aFilledAttributeName = FIRST_POINT_ID(); - std::string aReferenceAttributeName = FIRST_POINT_REF_ID(); + aFilledAttributeName = CENTER_POINT_ID(); + std::string aReferenceAttributeName = CENTER_POINT_REF_ID(); + if (anEllipseType == ELLIPSE_TYPE_BY_AXIS_AND_POINT()) { + aFilledAttributeName = MAJOR_AXIS_START_ID(); + aReferenceAttributeName = MAJOR_AXIS_START_REF_ID(); + } // fill 2d point attribute AttributePoint2DPtr aPointAttr = @@ -205,7 +241,7 @@ std::string SketchPlugin_MacroEllipse::processEvent( std::dynamic_pointer_cast(attribute(aReferenceAttributeName)); if (anAttribute) { if (!anAttribute->owner() || !anAttribute->owner()->data()->isValid()) { - if (aCreatedFeature && anAttribute->id() == FIRST_POINT_ID()) + if (aCreatedFeature && anAttribute->id() == CENTER_POINT_ID()) anAttribute = aCreatedFeature->attribute( anEllipseType == ELLIPSE_TYPE_BY_CENTER_AXIS_POINT() ? SketchPlugin_Ellipse::CENTER_ID() : @@ -234,16 +270,19 @@ void SketchPlugin_MacroEllipse::constraintsForEllipseByCenterAxisAndPassed( static const bool isTangencyApplicable = false; // Create constraints. SketchPlugin_Tools::createCoincidenceOrTangency( - this, FIRST_POINT_REF_ID(), + this, CENTER_POINT_REF_ID(), theEllipseFeature->attribute(SketchPlugin_Ellipse::CENTER_ID()), ObjectPtr(), isTangencyApplicable); SketchPlugin_Tools::createCoincidenceOrTangency( - this, SECOND_POINT_REF_ID(), + this, MAJOR_AXIS_POINT_REF_ID(), theEllipseFeature->attribute(SketchPlugin_Ellipse::MAJOR_AXIS_END_ID()), ObjectPtr(), isTangencyApplicable); - SketchPlugin_Tools::createCoincidenceOrTangency( - this, PASSED_POINT_REF_ID(), AttributePtr(), - theEllipseFeature->lastResult(), isTangencyApplicable); + // make coincidence only if PASSED_POINT_REF_ID() refers a point but not an object + if (!refattr(PASSED_POINT_REF_ID())->isObject()) { + SketchPlugin_Tools::createCoincidenceOrTangency( + this, PASSED_POINT_REF_ID(), AttributePtr(), + theEllipseFeature->lastResult(), isTangencyApplicable); + } } void SketchPlugin_MacroEllipse::constraintsForEllipseByMajoxAxisAndPassed( @@ -253,16 +292,19 @@ void SketchPlugin_MacroEllipse::constraintsForEllipseByMajoxAxisAndPassed( static const bool isTangencyApplicable = false; // Create constraints. SketchPlugin_Tools::createCoincidenceOrTangency( - this, FIRST_POINT_REF_ID(), + this, MAJOR_AXIS_START_REF_ID(), theEllipseFeature->attribute(SketchPlugin_Ellipse::MAJOR_AXIS_START_ID()), ObjectPtr(), isTangencyApplicable); SketchPlugin_Tools::createCoincidenceOrTangency( - this, SECOND_POINT_REF_ID(), + this, MAJOR_AXIS_END_REF_ID(), theEllipseFeature->attribute(SketchPlugin_Ellipse::MAJOR_AXIS_END_ID()), ObjectPtr(), isTangencyApplicable); - SketchPlugin_Tools::createCoincidenceOrTangency( - this, PASSED_POINT_REF_ID(), AttributePtr(), - theEllipseFeature->lastResult(), isTangencyApplicable); + // make coincidence only if PASSED_POINT_REF_ID() refers a point but not an object + if (!refattr(PASSED_POINT_1_REF_ID())->isObject()) { + SketchPlugin_Tools::createCoincidenceOrTangency( + this, PASSED_POINT_1_REF_ID(), AttributePtr(), + theEllipseFeature->lastResult(), isTangencyApplicable); + } } FeaturePtr SketchPlugin_MacroEllipse::createEllipseFeature() @@ -284,6 +326,30 @@ FeaturePtr SketchPlugin_MacroEllipse::createEllipseFeature() boolean(AUXILIARY_ID())->value()); aEllipseFeature->execute(); + + // create auxiliary points + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::CENTER_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::FIRST_FOCUS_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::SECOND_FOCUS_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::MAJOR_AXIS_START_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::MAJOR_AXIS_END_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::MINOR_AXIS_START_ID()); + SketchPlugin_Tools::createAuxiliaryPointOnEllipse( + aEllipseFeature, SketchPlugin_Ellipse::MINOR_AXIS_END_ID()); + // create auxiliary axes + SketchPlugin_Tools::createAuxiliaryAxisOfEllipse(aEllipseFeature, + SketchPlugin_Ellipse::MAJOR_AXIS_START_ID(), + SketchPlugin_Ellipse::MAJOR_AXIS_END_ID()); + SketchPlugin_Tools::createAuxiliaryAxisOfEllipse(aEllipseFeature, + SketchPlugin_Ellipse::MINOR_AXIS_START_ID(), + SketchPlugin_Ellipse::MINOR_AXIS_END_ID()); + return aEllipseFeature; } @@ -318,5 +384,9 @@ AISObjectPtr SketchPlugin_MacroEllipse::getAISObject(AISObjectPtr thePrevious) if (!anAIS) anAIS.reset(new GeomAPI_AISObject()); anAIS->createShape(aCompound); + + // Modify attributes + SketchPlugin_Tools::customizeFeaturePrs(anAIS, boolean(AUXILIARY_ID())->value()); + return anAIS; }