X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchAPI%2FSketchAPI_Sketch.cpp;h=5a8d9ce21a3158b9ca52667fb5f933721915feba;hb=a42155ebfe80458f7dd0a68a350cbc0d80416f7c;hp=5a329558fd3e2217782f7aec38c9a864297895c3;hpb=661aafa65364b86fdbfc9fde9462d31bdf3ae151;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index 5a329558f..5a8d9ce21 100644 --- a/src/SketchAPI/SketchAPI_Sketch.cpp +++ b/src/SketchAPI/SketchAPI_Sketch.cpp @@ -53,13 +53,16 @@ #include //-------------------------------------------------------------------------------------- #include "SketchAPI_Arc.h" +#include "SketchAPI_BSpline.h" #include "SketchAPI_Circle.h" #include "SketchAPI_Ellipse.h" +#include "SketchAPI_EllipticArc.h" #include "SketchAPI_IntersectionPoint.h" #include "SketchAPI_Line.h" #include "SketchAPI_MacroArc.h" #include "SketchAPI_MacroCircle.h" #include "SketchAPI_MacroEllipse.h" +#include "SketchAPI_MacroEllipticArc.h" #include "SketchAPI_Mirror.h" #include "SketchAPI_Point.h" #include "SketchAPI_Projection.h" @@ -73,6 +76,8 @@ #include #include #include + +#include #include //-------------------------------------------------------------------------------------- SketchAPI_Sketch::SketchAPI_Sketch( @@ -642,6 +647,83 @@ std::shared_ptr SketchAPI_Sketch::addEllipse( return EllipsePtr(new SketchAPI_Ellipse(aFeature, theExternalName)); } +//-------------------------------------------------------------------------------------- +std::shared_ptr SketchAPI_Sketch::addEllipticArc( + double theCenterX, double theCenterY, + double theFocusX, double theFocusY, + double theStartX, double theStartY, + double theEndX, double theEndY, + bool theInversed) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_EllipticArc::ID()); + return EllipticArcPtr(new SketchAPI_EllipticArc(aFeature, + theCenterX, theCenterY, + theFocusX, theFocusY, + theStartX, theStartY, + theEndX, theEndY, + theInversed)); +} + +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, + bool theInversed) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_MacroEllipticArc::ID()); + return MacroEllipticArcPtr(new SketchAPI_MacroEllipticArc(aFeature, + theCenter.first, theCenter.second, + theMajorAxisPoint.first, theMajorAxisPoint.second, + theStartPoint.first, theStartPoint.second, + theEndPoint.first, theEndPoint.second, + theInversed)); +} + +std::shared_ptr SketchAPI_Sketch::addEllipticArc( + const ModelHighAPI_Selection & theExternal) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_EllipticArc::ID()); + return EllipticArcPtr(new SketchAPI_EllipticArc(aFeature, theExternal)); +} + +std::shared_ptr SketchAPI_Sketch::addEllipticArc( + const std::string & theExternalName) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchPlugin_EllipticArc::ID()); + return EllipticArcPtr(new SketchAPI_EllipticArc(aFeature, theExternalName)); +} + +//-------------------------------------------------------------------------------------- + +std::shared_ptr SketchAPI_Sketch::addSpline( + 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) +{ + FeaturePtr aFeature = compositeFeature()->addFeature( + periodic ? SketchPlugin_BSplinePeriodic::ID() : SketchPlugin_BSpline::ID()); + + BSplinePtr aBSpline(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, poles, weights); + else + aBSpline->setByParameters(degree, poles, weights, knots, multiplicities); + + return aBSpline; +} + //-------------------------------------------------------------------------------------- std::shared_ptr SketchAPI_Sketch::addProjection( const ModelHighAPI_Selection & theExternalFeature, @@ -745,16 +827,38 @@ std::shared_ptr SketchAPI_Sketch::addTrim( std::shared_ptr SketchAPI_Sketch::setAngle( const ModelHighAPI_RefAttr & theLine1, const ModelHighAPI_RefAttr & theLine2, - const ModelHighAPI_Double & theValue) + const ModelHighAPI_Double & theValue, + const std::string& theType) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); - fillAttribute(SketcherPrs_Tools::ANGLE_DIRECT, - aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); - // fill the value before llines to avoid calculation of angle value by the Angle feature + + const int aVersion = theType.empty() ? SketchPlugin_ConstraintAngle::THE_VERSION_0 + : SketchPlugin_ConstraintAngle::THE_VERSION_1; + fillAttribute(aVersion, aFeature->integer(SketchPlugin_ConstraintAngle::VERSION_ID())); + + int aType = (int)SketcherPrs_Tools::ANGLE_DIRECT; + fillAttribute(aType, aFeature->integer(SketchPlugin_ConstraintAngle::PREV_TYPE_ID())); + fillAttribute(aType, aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); + + if (aVersion == SketchPlugin_ConstraintAngle::THE_VERSION_0) + fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); + fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); - fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); + + if (aVersion == SketchPlugin_ConstraintAngle::THE_VERSION_1) { + std::string aTypeLC = theType; + std::transform(aTypeLC.begin(), aTypeLC.end(), aTypeLC.begin(), ::tolower); + if (aTypeLC == "supplementary") + aType = (int)SketcherPrs_Tools::ANGLE_COMPLEMENTARY; + else if (aTypeLC == "backward") + aType = (int)SketcherPrs_Tools::ANGLE_BACKWARD; + + fillAttribute(aType, aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); + fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); + } + aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -766,11 +870,13 @@ std::shared_ptr SketchAPI_Sketch::setAngleComplementary( { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); + fillAttribute(SketchPlugin_ConstraintAngle::THE_VERSION_0, + aFeature->integer(SketchPlugin_ConstraintAngle::VERSION_ID())); fillAttribute(SketcherPrs_Tools::ANGLE_COMPLEMENTARY, aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); + fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); - fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -782,11 +888,13 @@ std::shared_ptr SketchAPI_Sketch::setAngleBackward( { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_ConstraintAngle::ID()); + fillAttribute(SketchPlugin_ConstraintAngle::THE_VERSION_0, + aFeature->integer(SketchPlugin_ConstraintAngle::VERSION_ID())); fillAttribute(SketcherPrs_Tools::ANGLE_BACKWARD, aFeature->integer(SketchPlugin_ConstraintAngle::TYPE_ID())); + fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); fillAttribute(theLine1, aFeature->refattr(SketchPlugin_Constraint::ENTITY_A())); fillAttribute(theLine2, aFeature->refattr(SketchPlugin_Constraint::ENTITY_B())); - fillAttribute(theValue, aFeature->real(SketchPlugin_ConstraintAngle::ANGLE_VALUE_ID())); aFeature->execute(); return InterfacePtr(new ModelHighAPI_Interface(aFeature)); } @@ -1093,14 +1201,26 @@ static std::shared_ptr middlePointOnArc(const FeaturePtr& theFeat return std::shared_ptr(new GeomAPI_Pnt2d(x, y)); } -static std::shared_ptr pointOnEllipse(const FeaturePtr& theFeature) +static std::shared_ptr pointOnEllipse(const FeaturePtr& theFeature, + bool isEllipse = true) { + const std::string& anAttrName = isEllipse ? SketchPlugin_Ellipse::MAJOR_AXIS_END_ID() : + SketchPlugin_EllipticArc::MAJOR_AXIS_END_ID(); AttributePoint2DPtr aMajorAxisEnd = std::dynamic_pointer_cast( - theFeature->attribute(SketchPlugin_Ellipse::MAJOR_AXIS_END_ID())); + theFeature->attribute(anAttrName)); return aMajorAxisEnd ? aMajorAxisEnd->pnt() : std::shared_ptr(); } -static std::shared_ptr middlePoint(const ObjectPtr& theObject) +static std::shared_ptr middlePointOnBSpline(const FeaturePtr& theFeature, + SketchAPI_Sketch* theSketch) +{ + GeomAPI_Edge anEdge(theFeature->lastResult()->shape()); + GeomPointPtr aMiddle = anEdge.middlePoint(); + return theSketch->to2D(aMiddle); +} + +static std::shared_ptr middlePoint(const ObjectPtr& theObject, + SketchAPI_Sketch* theSketch) { std::shared_ptr aMiddlePoint; FeaturePtr aFeature = ModelAPI_Feature::feature(theObject); @@ -1117,6 +1237,11 @@ static std::shared_ptr middlePoint(const ObjectPtr& theObject) aMiddlePoint = middlePointOnArc(aFeature); else if (aFeatureKind == SketchPlugin_Ellipse::ID()) aMiddlePoint = pointOnEllipse(aFeature); + else if (aFeatureKind == SketchPlugin_EllipticArc::ID()) + aMiddlePoint = pointOnEllipse(aFeature, false); + else if (aFeatureKind == SketchPlugin_BSpline::ID() || + aFeatureKind == SketchPlugin_BSplinePeriodic::ID()) + aMiddlePoint = middlePointOnBSpline(aFeature, theSketch); } return aMiddlePoint; } @@ -1131,7 +1256,7 @@ void SketchAPI_Sketch::move(const ModelHighAPI_RefAttr& theMovedEntity, if (aMessage->movedAttribute()) anOriginalPosition = pointCoordinates(aMessage->movedAttribute()); else - anOriginalPosition = middlePoint(aMessage->movedObject()); + anOriginalPosition = middlePoint(aMessage->movedObject(), this); if (!anOriginalPosition) return; // something has gone wrong, do not process movement @@ -1337,5 +1462,7 @@ void SketchAPI_Sketch::dump(ModelHighAPI_Dumper& theDumper) const theDumper << *aFIt; } theDumper << "\n" << aSpaceShift << " ])" << std::endl; + // call model.do() for correct update of the document's labels related to the changed faces + theDumper << "model.do()" << std::endl; } }