-// 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
#include <ModelAPI_Session.h>
#include <ModelAPI_Validator.h>
+#include <cmath>
+
static const double tolerance = 1e-7;
data()->addAttribute(MAJOR_RADIUS_ID(), ModelAPI_AttributeDouble::typeId());
data()->addAttribute(MINOR_RADIUS_ID(), ModelAPI_AttributeDouble::typeId());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), SECOND_FOCUS_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MAJOR_AXIS_START_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MAJOR_AXIS_END_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MINOR_AXIS_START_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MINOR_AXIS_END_ID());
+ ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), MAJOR_RADIUS_ID());
+
data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId());
ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID());
}
// Calculate all characteristics of the ellipse.
fillCharacteristicPoints();
- // Make visible points related to ellipse characteristics.
- int aResultIndex = 0;
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, CENTER_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, FIRST_FOCUS_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, SECOND_FOCUS_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, MAJOR_AXIS_START_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, MAJOR_AXIS_END_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, MINOR_AXIS_START_ID(), aResultIndex++);
- SketchPlugin_Sketch::createPoint2DResult(this, aSketch, MINOR_AXIS_END_ID(), aResultIndex++);
-
- // Make auxiliary axes
- SketchPlugin_Sketch::createLine2DResult(this, aSketch,
- MAJOR_AXIS_START_ID(), MAJOR_AXIS_END_ID(), aResultIndex++);
- SketchPlugin_Sketch::createLine2DResult(this, aSketch,
- MINOR_AXIS_START_ID(), MINOR_AXIS_END_ID(), aResultIndex++);
-
- // Mark already created results auxiliary
- myAuxiliaryResults.clear();
- const std::list<ResultPtr>& aResults = results();
- std::list<ResultPtr>::const_iterator anIt = aResults.begin();
- for (int anIndex = 0; anIt != aResults.end() && anIndex < aResultIndex; ++anIt, ++anIndex)
- myAuxiliaryResults.insert(*anIt);
-
// Make a visible ellipse.
- createEllipse(aSketch, aResultIndex);
+ createEllipse(aSketch, 0);
}
bool SketchPlugin_Ellipse::isFixed() {
return data()->selection(EXTERNAL_ID())->context().get() != NULL;
}
-bool SketchPlugin_Ellipse::isAuxiliary(ResultPtr theResult)
-{
- return myAuxiliaryResults.find(theResult) != myAuxiliaryResults.end();
-}
-
void SketchPlugin_Ellipse::attributeChanged(const std::string& theID) {
// the second condition for unability to move external segments anywhere
if (theID == EXTERNAL_ID() || isFixed()) {
std::shared_ptr<GeomDataAPI_Point2D> aFocusAttr =
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(data()->attribute(FIRST_FOCUS_ID()));
- AttributeDoublePtr aMajorRadiusAttr = real(MAJOR_RADIUS_ID());
AttributeDoublePtr aMinorRadiusAttr = real(MINOR_RADIUS_ID());
if (!aCenterAttr->isInitialized() ||
!aFocusAttr->isInitialized() ||
- !aMajorRadiusAttr->isInitialized() ||
!aMinorRadiusAttr->isInitialized()) {
return false;
}
- double aMajorRadius = aMajorRadiusAttr->value();
double aMinorRadius = aMinorRadiusAttr->value();
- if (aMajorRadius < tolerance || aMinorRadius < tolerance) {
+ if (aMinorRadius < tolerance) {
return false;
}
- data()->blockSendAttributeUpdated(true);
+ bool aWasBlocked = data()->blockSendAttributeUpdated(true);
GeomPnt2dPtr aCenter2d = aCenterAttr->pnt();
GeomPnt2dPtr aFocus2d = aFocusAttr->pnt();
GeomDir2dPtr aMajorDir2d(new GeomAPI_Dir2d(aFocus2d->x() - aCenter2d->x(),
aFocus2d->y() - aCenter2d->y()));
GeomDir2dPtr aMinorDir2d(new GeomAPI_Dir2d(-aMajorDir2d->y(), aMajorDir2d->x()));
+
+ AttributeDoublePtr aMajorRadiusAttr = real(MAJOR_RADIUS_ID());
+ double aFocalDist = aCenter2d->distance(aFocus2d);
+ double aMajorRadius = sqrt(aFocalDist * aFocalDist + aMinorRadius * aMinorRadius);
+ if (!aMajorRadiusAttr->isInitialized() ||
+ fabs(aMajorRadiusAttr->value() - aMajorRadius) > tolerance)
+ aMajorRadiusAttr->setValue(aMajorRadius);
+
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(SECOND_FOCUS_ID()))
->setValue(2.0 * aCenter2d->x() - aFocus2d->x(), 2.0 * aCenter2d->y() - aFocus2d->y());
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(MAJOR_AXIS_START_ID()))
std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(MINOR_AXIS_END_ID()))
->setValue(aCenter2d->x() + aMinorDir2d->x() * aMinorRadius,
aCenter2d->y() + aMinorDir2d->y() * aMinorRadius);
- data()->blockSendAttributeUpdated(false);
+ data()->blockSendAttributeUpdated(aWasBlocked);
return true;
}