X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchAPI%2FSketchAPI_Sketch.cpp;h=9bdecc85f2d860c1dcc78d0176039527f52d0c43;hb=46c0759fa291dad10b713cf02b341d6e9e60c1a4;hp=f64f93fc682f76665cea02b67dc4a809d0c227f3;hpb=15e07776045d232135802444b5eb3375e31c9a0e;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index f64f93fc6..9bdecc85f 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// Copyright (C) 2014-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include //-------------------------------------------------------------------------------------- #include @@ -232,6 +234,23 @@ SketchPtr addSketch(const std::shared_ptr & thePart, return SketchPtr(new SketchAPI_Sketch(aFeature, thePlaneObject)); } +//-------------------------------------------------------------------------------------- +SketchPtr copySketch(const std::shared_ptr & thePart, + const SketchPtr & theSketch) +{ + FeaturePtr aCopyer = thePart->addFeature(SketchPlugin_SketchCopy::ID()); + aCopyer->reference(SketchPlugin_SketchCopy::BASE_ID())->setValue(theSketch->feature()); + aCopyer->execute(); + + FeaturePtr aNewSketch = thePart->nextFeature(aCopyer); + + // perform removing the macro-feature + thePart->removeFeature(aCopyer); + apply(); + + return SketchPtr(new SketchAPI_Sketch(aNewSketch)); +} + //-------------------------------------------------------------------------------------- std::list< std::shared_ptr > SketchAPI_Sketch::getFreePoints() @@ -607,9 +626,9 @@ std::shared_ptr SketchAPI_Sketch::addEllipse( } std::shared_ptr SketchAPI_Sketch::addEllipse( - const std::pair, ModelHighAPI_RefAttr>& thePoint1, - const std::pair, ModelHighAPI_RefAttr>& thePoint2, - const std::pair, ModelHighAPI_RefAttr>& thePassedPoint, + const PointOrReference& thePoint1, + const PointOrReference& thePoint2, + const PointOrReference& thePassedPoint, bool isPoint1Center) { std::shared_ptr aFeature = @@ -666,10 +685,10 @@ std::shared_ptr SketchAPI_Sketch::addEllipticArc( } std::shared_ptr SketchAPI_Sketch::addEllipticArc( - const std::pair, ModelHighAPI_RefAttr>& theCenter, - const std::pair, ModelHighAPI_RefAttr>& theMajorAxisPoint, - const std::pair, ModelHighAPI_RefAttr>& theStartPoint, - const std::pair, ModelHighAPI_RefAttr>& theEndPoint, + const PointOrReference& theCenter, + const PointOrReference& theMajorAxisPoint, + const PointOrReference& theStartPoint, + const PointOrReference& theEndPoint, bool theInversed) { std::shared_ptr aFeature = @@ -699,37 +718,79 @@ std::shared_ptr SketchAPI_Sketch::addEllipticArc( } //-------------------------------------------------------------------------------------- -std::shared_ptr SketchAPI_Sketch::addSpline( - const std::list >& thePoles, - const std::list& theWeights) -{ - FeaturePtr aFeature = compositeFeature()->addFeature(SketchPlugin_BSpline::ID()); - return BSplinePtr(new SketchAPI_BSpline(aFeature, thePoles, theWeights)); -} - -std::shared_ptr SketchAPI_Sketch::addSpline( - const int theDegree, - const std::list >& thePoles, - const std::list& theWeights, - const std::list& theKnots, - const std::list& theMults) -{ - FeaturePtr aFeature = compositeFeature()->addFeature(SketchPlugin_BSpline::ID()); - return BSplinePtr(new SketchAPI_BSpline(aFeature, - theDegree, thePoles, theWeights, theKnots, theMults)); -} std::shared_ptr SketchAPI_Sketch::addSpline( - const ModelHighAPI_Selection & theExternal) -{ - FeaturePtr aFeature = compositeFeature()->addFeature(SketchPlugin_BSpline::ID()); - return BSplinePtr(new SketchAPI_BSpline(aFeature, theExternal)); -} + const ModelHighAPI_Selection & external, + const int degree, + const std::list& poles, + const std::list& weights, + const std::list& knots, + const std::list& multiplicities, + const bool periodic) +{ + // split poles and references to other shapes + bool hasReference = false; + std::list aPoints; + std::list aReferences; + for (std::list::const_iterator it = poles.begin(); it != poles.end(); ++it) { + aPoints.push_back(it->first); + aReferences.push_back(it->second); + if (!it->second.isEmpty()) + hasReference = true; + } -std::shared_ptr SketchAPI_Sketch::addSpline(const std::string & theExternalName) -{ - FeaturePtr aFeature = compositeFeature()->addFeature(SketchPlugin_BSpline::ID()); - return BSplinePtr(new SketchAPI_BSpline(aFeature, theExternalName)); + BSplinePtr aBSpline; + CompositeFeaturePtr aSketch = compositeFeature(); + if (hasReference) { + // use macro-feature to create coincidences to referred features + FeaturePtr aMacroFeature = aSketch->addFeature( + periodic ? SketchPlugin_MacroBSplinePeriodic::ID() : SketchPlugin_MacroBSpline::ID()); + AttributePoint2DArrayPtr aPolesAttr = std::dynamic_pointer_cast( + aMacroFeature->attribute(SketchPlugin_MacroBSpline::POLES_ID())); + AttributeDoubleArrayPtr aWeightsAttr = + aMacroFeature->data()->realArray(SketchPlugin_MacroBSpline::WEIGHTS_ID()); + AttributeRefAttrListPtr aPolesRefAttr = + aMacroFeature->data()->refattrlist(SketchPlugin_MacroBSpline::REF_POLES_ID()); + // always generate a control polygon to apply coincidences correctly + aMacroFeature->boolean(SketchPlugin_MacroBSpline::CONTROL_POLYGON_ID())->setValue(true); + // initialize B-spline attributes + fillAttribute(aPoints, aPolesAttr); + if (weights.empty()) + fillAttribute(std::list(poles.size(), 1.0), aWeightsAttr); + else + fillAttribute(weights, aWeightsAttr); + fillAttribute(aReferences, aPolesRefAttr); + apply(); // to kill macro-feature + + // find created B-spline feature + const std::string& aKindToFind = + periodic ? SketchPlugin_BSplinePeriodic::ID() : SketchPlugin_BSpline::ID(); + int aNbSubs = aSketch->numberOfSubs(); + for (int anIndex = aNbSubs - 1; anIndex >= 0; --anIndex) { + FeaturePtr aFeature = aSketch->subFeature(anIndex); + if (aFeature->getKind() == aKindToFind) { + aBSpline.reset(periodic ? new SketchAPI_BSplinePeriodic(aFeature) + : new SketchAPI_BSpline(aFeature)); + aBSpline->execute(); + break; + } + } + } + else { + // compute B-spline by parameters + FeaturePtr aFeature = aSketch->addFeature( + periodic ? SketchPlugin_BSplinePeriodic::ID() : SketchPlugin_BSpline::ID()); + + aBSpline.reset(periodic ? new SketchAPI_BSplinePeriodic(aFeature) + : new SketchAPI_BSpline(aFeature)); + if (external.variantType() != ModelHighAPI_Selection::VT_Empty) + aBSpline->setByExternal(external); + else if (knots.empty() || multiplicities.empty()) + aBSpline->setByDegreePolesAndWeights(degree, aPoints, weights); + else + aBSpline->setByParameters(degree, aPoints, weights, knots, multiplicities); + } + return aBSpline; } //-------------------------------------------------------------------------------------- @@ -857,7 +918,8 @@ std::shared_ptr SketchAPI_Sketch::setAngle( if (aVersion == SketchPlugin_ConstraintAngle::THE_VERSION_1) { std::string aTypeLC = theType; - std::transform(aTypeLC.begin(), aTypeLC.end(), aTypeLC.begin(), ::tolower); + std::transform(aTypeLC.begin(), aTypeLC.end(), aTypeLC.begin(), + [](char c) { return static_cast(::tolower(c)); }); if (aTypeLC == "supplementary") aType = (int)SketcherPrs_Tools::ANGLE_COMPLEMENTARY; else if (aTypeLC == "backward") @@ -1220,18 +1282,15 @@ static std::shared_ptr pointOnEllipse(const FeaturePtr& theFeatur } static std::shared_ptr middlePointOnBSpline(const FeaturePtr& theFeature, - const CompositeFeaturePtr& theSketch) + SketchAPI_Sketch* theSketch) { GeomAPI_Edge anEdge(theFeature->lastResult()->shape()); GeomPointPtr aMiddle = anEdge.middlePoint(); - - std::shared_ptr aSketch = - std::dynamic_pointer_cast(theSketch); - return aSketch->to2D(aMiddle); + return theSketch->to2D(aMiddle); } static std::shared_ptr middlePoint(const ObjectPtr& theObject, - const CompositeFeaturePtr& theSketch) + SketchAPI_Sketch* theSketch) { std::shared_ptr aMiddlePoint; FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); @@ -1250,7 +1309,8 @@ static std::shared_ptr middlePoint(const ObjectPtr& theObject, aMiddlePoint = pointOnEllipse(aFeature); else if (aFeatureKind == SketchPlugin_EllipticArc::ID()) aMiddlePoint = pointOnEllipse(aFeature, false); - else if (aFeatureKind == SketchPlugin_BSpline::ID()) + else if (aFeatureKind == SketchPlugin_BSpline::ID() || + aFeatureKind == SketchPlugin_BSplinePeriodic::ID()) aMiddlePoint = middlePointOnBSpline(aFeature, theSketch); } return aMiddlePoint; @@ -1266,7 +1326,7 @@ void SketchAPI_Sketch::move(const ModelHighAPI_RefAttr& theMovedEntity, if (aMessage->movedAttribute()) anOriginalPosition = pointCoordinates(aMessage->movedAttribute()); else - anOriginalPosition = middlePoint(aMessage->movedObject(), compositeFeature()); + anOriginalPosition = middlePoint(aMessage->movedObject(), this); if (!anOriginalPosition) return; // something has gone wrong, do not process movement