X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSketchAPI%2FSketchAPI_Sketch.cpp;h=823897f5a6e2213e98c2a0e07d3fa8fd79e7f0ec;hb=fc72d43b677baa05ae7fd317346fd8b723b799ed;hp=8d47286ef97cddd06a1a5044e150a61010041f32;hpb=cdd17f8b9923e1283e0a8bd239cd857ac4bd502a;p=modules%2Fshaper.git diff --git a/src/SketchAPI/SketchAPI_Sketch.cpp b/src/SketchAPI/SketchAPI_Sketch.cpp index 8d47286ef..823897f5a 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-2023 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 @@ -425,6 +425,49 @@ std::shared_ptr SketchAPI_Sketch::addRectangle( return RectanglePtr(new SketchAPI_Rectangle(aFeature, theStartPoint, theEndPoint)); } +static std::shared_ptr pointCoordinates( + const std::pair, ModelHighAPI_RefAttr> & thePoint) +{ + if (thePoint.first) + return thePoint.first; + + AttributePtr anAttr = thePoint.second.attr(); + if (thePoint.second.object()) { + FeaturePtr aFeature = ModelAPI_Feature::feature(thePoint.second.object()); + if (aFeature) + anAttr = aFeature->attribute(SketchPlugin_Point::COORD_ID()); + } + + std::shared_ptr aPntAttr = + std::dynamic_pointer_cast(anAttr); + if (aPntAttr) + return aPntAttr->pnt(); + return std::shared_ptr(); +} + +std::shared_ptr SketchAPI_Sketch::addRectangleCentered( + const std::pair, ModelHighAPI_RefAttr> & theCenter, + const std::pair, ModelHighAPI_RefAttr> & theCorner) +{ + std::shared_ptr aFeature = + compositeFeature()->addFeature(SketchAPI_Rectangle::ID()); + RectanglePtr aRect(new SketchAPI_Rectangle(aFeature)); + fillAttribute("RectangleTypeCentered", aRect->type()); + if (!theCenter.second.isEmpty()) + fillAttribute(theCenter.second, aRect->centerPointRef()); + fillAttribute(pointCoordinates(theCenter), aRect->centerPoint()); + fillAttribute(pointCoordinates(theCorner), aRect->cornerPoint()); + aRect->execute(); + + if (!theCorner.second.isEmpty() && aRect->linesList()->size() > 1) { + // get start point of the last line in rectangle and apply coindidence constraint + FeaturePtr aLine = ModelAPI_Feature::feature(aRect->linesList()->object(3)); + AttributePtr aEndPnt = aLine->attribute(SketchPlugin_Line::START_ID()); + setCoincident(ModelHighAPI_RefAttr(aEndPnt), theCorner.second); + } + return aRect; +} + //-------------------------------------------------------------------------------------- std::shared_ptr SketchAPI_Sketch::addCircle(double theCenterX, double theCenterY, @@ -887,11 +930,12 @@ std::shared_ptr SketchAPI_Sketch::addMirror( std::shared_ptr SketchAPI_Sketch::addOffset( const std::list > & theObjects, const ModelHighAPI_Double & theValue, - const bool theReversed) + const bool theReversed, + const std::string & theJointType) { std::shared_ptr aFeature = compositeFeature()->addFeature(SketchPlugin_Offset::ID()); - return OffsetPtr(new SketchAPI_Offset(aFeature, theObjects, theValue, theReversed)); + return OffsetPtr(new SketchAPI_Offset(aFeature, theObjects, theValue, theReversed, theJointType)); } //-------------------------------------------------------------------------------------- @@ -986,7 +1030,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")