-// Copyright (C) 2019-2020 CEA/DEN, EDF R&D
+// Copyright (C) 2019-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
//
#include <SketchPlugin_BSpline.h>
-#include <SketchPlugin_Sketch.h>
-
-#include <GeomAlgoAPI_EdgeBuilder.h>
-
-////#include <GeomAPI_Dir2d.h>
-////#include <GeomAPI_Edge.h>
-////#include <GeomAPI_Ellipse.h>
-////#include <GeomAPI_Ellipse2d.h>
-#include <GeomAPI_Pnt2d.h>
-////#include <GeomAPI_XY.h>
+#include <GeomDataAPI_Point2D.h>
#include <GeomDataAPI_Point2DArray.h>
-#include <ModelAPI_AttributeDoubleArray.h>
-#include <ModelAPI_ResultConstruction.h>
-#include <ModelAPI_Session.h>
-#include <ModelAPI_Validator.h>
-
-////#include <cmath>
-////
-////static const double tolerance = 1e-7;
-////static const double paramTolerance = 1.e-4;
-////static const double PI = 3.141592653589793238463;
-
SketchPlugin_BSpline::SketchPlugin_BSpline()
- : SketchPlugin_SketchEntity()
+ : SketchPlugin_BSplineBase()
{
}
void SketchPlugin_BSpline::initDerivedClassAttributes()
{
- data()->addAttribute(POLES_ID(), GeomDataAPI_Point2DArray::typeId());
- data()->addAttribute(WEIGHTS_ID(), ModelAPI_AttributeDoubleArray::typeId());
-
- data()->addAttribute(EXTERNAL_ID(), ModelAPI_AttributeSelection::typeId());
- ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), EXTERNAL_ID());
-}
-
-void SketchPlugin_BSpline::execute()
-{
- SketchPlugin_Sketch* aSketch = sketch();
- if(!aSketch) {
- return;
- }
-
- AttributePoint2DArrayPtr aPolesArray =
- std::dynamic_pointer_cast<GeomDataAPI_Point2DArray>(attribute(POLES_ID()));
- AttributeDoubleArrayPtr aWeightsArray = data()->realArray(WEIGHTS_ID());
-
- // convert poles to 3D
- std::vector<GeomPointPtr> aPoles3D;
- aPoles3D.reserve(aPolesArray->size());
- for (int anIndex = 0; anIndex < aPolesArray->size(); ++anIndex) {
- GeomPnt2dPtr aPole = aPolesArray->pnt(anIndex);
- aPoles3D.push_back(aSketch->to3D(aPole->x(), aPole->y()));
- }
- // collect weights
- std::vector<double> aWeights;
- aWeights.reserve(aWeightsArray->size());
- for (int anIndex = 0; anIndex < aWeightsArray->size(); ++anIndex)
- aWeights.push_back(aWeightsArray->value(anIndex));
-
- // create result non-periodic B-spline curve
- GeomShapePtr anEdge = GeomAlgoAPI_EdgeBuilder::bspline(aPoles3D, aWeights, false);
-
- ResultConstructionPtr aResult = document()->createConstruction(data(), 0);
- aResult->setShape(anEdge);
- aResult->setIsInHistory(false);
- setResult(aResult, 0);
-}
+ data()->addAttribute(START_ID(), GeomDataAPI_Point2D::typeId());
+ data()->addAttribute(END_ID(), GeomDataAPI_Point2D::typeId());
-bool SketchPlugin_BSpline::isFixed() {
- return data()->selection(EXTERNAL_ID())->context().get() != NULL;
+ SketchPlugin_BSplineBase::initDerivedClassAttributes();
}
void SketchPlugin_BSpline::attributeChanged(const std::string& theID) {
- // the second condition for unability to move external segments anywhere
- if (theID == EXTERNAL_ID() || isFixed()) {
- std::shared_ptr<GeomAPI_Shape> aSelection = data()->selection(EXTERNAL_ID())->value();
- if (!aSelection) {
- // empty shape in selection shows that the shape is equal to context
- ResultPtr anExtRes = selection(EXTERNAL_ID())->context();
- if (anExtRes)
- aSelection = anExtRes->shape();
- }
-//// // update arguments due to the selection value
-//// if (aSelection && !aSelection->isNull() && aSelection->isEdge()) {
-//// std::shared_ptr<GeomAPI_Edge> anEdge(new GeomAPI_Edge(aSelection));
-//// std::shared_ptr<GeomAPI_Ellipse> anEllipse = anEdge->ellipse();
-////
-//// bool aWasBlocked = data()->blockSendAttributeUpdated(true);
-//// std::shared_ptr<GeomDataAPI_Point2D> aCenterAttr =
-//// std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(CENTER_ID()));
-//// aCenterAttr->setValue(sketch()->to2D(anEllipse->center()));
-////
-//// std::shared_ptr<GeomDataAPI_Point2D> aFocusAttr =
-//// std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(FIRST_FOCUS_ID()));
-//// aFocusAttr->setValue(sketch()->to2D(anEllipse->firstFocus()));
-////
-//// std::shared_ptr<GeomDataAPI_Point2D> aStartAttr =
-//// std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(START_POINT_ID()));
-//// aStartAttr->setValue(sketch()->to2D(anEdge->firstPoint()));
-////
-//// std::shared_ptr<GeomDataAPI_Point2D> aEndAttr =
-//// std::dynamic_pointer_cast<GeomDataAPI_Point2D>(attribute(END_POINT_ID()));
-//// aEndAttr->setValue(sketch()->to2D(anEdge->lastPoint()));
-////
-//// real(MAJOR_RADIUS_ID())->setValue(anEllipse->majorRadius());
-//// real(MINOR_RADIUS_ID())->setValue(anEllipse->minorRadius());
-////
-//// double aStartParam, aMidParam, aEndParam;
-//// anEllipse->parameter(anEdge->firstPoint(), tolerance, aStartParam);
-//// anEllipse->parameter(anEdge->middlePoint(), tolerance, aMidParam);
-//// anEllipse->parameter(anEdge->lastPoint(), tolerance, aEndParam);
-//// if (aEndParam < aStartParam)
-//// aEndParam += 2.0 * PI;
-//// if (aMidParam < aStartParam)
-//// aMidParam += 2.0 * PI;
-//// boolean(REVERSED_ID())->setValue(aMidParam > aEndParam);
-////
-//// data()->blockSendAttributeUpdated(aWasBlocked, false);
-////
-//// fillCharacteristicPoints();
-//// }
+ if (theID == POLES_ID()) {
+ AttributePoint2DArrayPtr aPolesArray =
+ std::dynamic_pointer_cast<GeomDataAPI_Point2DArray>(attribute(POLES_ID()));
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ attribute(START_ID()))->setValue(aPolesArray->pnt(0));
+ std::dynamic_pointer_cast<GeomDataAPI_Point2D>(
+ attribute(END_ID()))->setValue(aPolesArray->pnt(aPolesArray->size() - 1));
}
-//// else if (theID == CENTER_ID() || theID == FIRST_FOCUS_ID() ||
-//// theID == START_POINT_ID() || theID == END_POINT_ID())
-//// fillCharacteristicPoints();
-//// else if (theID == REVERSED_ID() && myParamDelta == 0.0)
-//// myParamDelta = 2.0 * PI;
+ else
+ SketchPlugin_BSplineBase::attributeChanged(theID);
}