Salome HOME
[bos #35151][EDF](2023-T1) Centered rectangle.
[modules/shaper.git] / src / SketchAPI / SketchAPI_Sketch.cpp
index 028b1b2d365bfe0a5ad760a34e673efcc04f807f..b3b5b2251304056ae406e5565d0a9b0694281d57 100644 (file)
@@ -533,18 +533,9 @@ std::shared_ptr<SketchAPI_Line> SketchAPI_Sketch::addLine(const std::wstring & t
 std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangle(double theX1, double theY1,
                                                                     double theX2, double theY2)
 {
-  std::shared_ptr<ModelAPI_Feature> aFeature =
-    compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
+  std::shared_ptr<ModelAPI_Feature> aFeature = compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
   return RectanglePtr(new SketchAPI_Rectangle(aFeature, theX1, theY1, theX2, theY2));
 }
-std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangle(
-    const std::shared_ptr<GeomAPI_Pnt2d> & theStartPoint,
-    const std::shared_ptr<GeomAPI_Pnt2d> & theEndPoint)
-{
-  std::shared_ptr<ModelAPI_Feature> aFeature =
-    compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
-  return RectanglePtr(new SketchAPI_Rectangle(aFeature, theStartPoint, theEndPoint));
-}
 
 static std::shared_ptr<GeomAPI_Pnt2d> pointCoordinates(
     const std::pair<std::shared_ptr<GeomAPI_Pnt2d>, ModelHighAPI_RefAttr> & thePoint)
@@ -559,29 +550,57 @@ static std::shared_ptr<GeomAPI_Pnt2d> pointCoordinates(
       anAttr = aFeature->attribute(SketchPlugin_Point::COORD_ID());
   }
 
-  std::shared_ptr<GeomDataAPI_Point2D> aPntAttr =
-      std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttr);
+  std::shared_ptr<GeomDataAPI_Point2D> aPntAttr = std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttr);
   if (aPntAttr)
     return aPntAttr->pnt();
   return std::shared_ptr<GeomAPI_Pnt2d>();
 }
 
+std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangle(
+      const std::pair<std::shared_ptr<GeomAPI_Pnt2d>, ModelHighAPI_RefAttr> & theStartPoint,
+      const std::pair<std::shared_ptr<GeomAPI_Pnt2d>, ModelHighAPI_RefAttr> & theEndPoint) 
+{
+  std::shared_ptr<ModelAPI_Feature> aFeature = compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
+  RectanglePtr aRect(new SketchAPI_Rectangle(aFeature));
+  fillAttribute("RectangleTypeByCorners", aRect->type());
+  fillAttribute(pointCoordinates(theStartPoint), aRect->startPoint());
+  fillAttribute(pointCoordinates(theEndPoint), aRect->endPoint());
+  aRect->execute();
+
+  if (!theStartPoint.second.isEmpty() && aRect->linesList()->size() >= 1) {
+    // Get end point of the first line in rectangle and apply coincidence constraint
+    FeaturePtr aLine = ModelAPI_Feature::feature(aRect->linesList()->object(0));
+    AttributePtr aLinePnt = aLine->attribute(SketchPlugin_Line::END_ID());
+    setCoincident(ModelHighAPI_RefAttr(aLinePnt), theStartPoint.second);
+  }
+
+  if (!theEndPoint.second.isEmpty() && aRect->linesList()->size() >= 4) {
+    // Get start point of the last line in rectangle and apply coincidence constraint
+    FeaturePtr aLine = ModelAPI_Feature::feature(aRect->linesList()->object(3));
+    AttributePtr aLinePnt = aLine->attribute(SketchPlugin_Line::START_ID());
+    setCoincident(ModelHighAPI_RefAttr(aLinePnt), theEndPoint.second);
+  }
+  return aRect;
+}
+
 std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangleCentered(
     const std::pair<std::shared_ptr<GeomAPI_Pnt2d>, ModelHighAPI_RefAttr> & theCenter,
     const std::pair<std::shared_ptr<GeomAPI_Pnt2d>, ModelHighAPI_RefAttr> & theCorner)
 {
-  std::shared_ptr<ModelAPI_Feature> aFeature =
-    compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
+  std::shared_ptr<ModelAPI_Feature> 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());
+  else
+    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
+  if (!theCorner.second.isEmpty() && aRect->linesList()->size() >= 4) {
+    // get start point of the last line in rectangle and apply coincidence constraint
     FeaturePtr aLine = ModelAPI_Feature::feature(aRect->linesList()->object(3));
     AttributePtr aEndPnt = aLine->attribute(SketchPlugin_Line::START_ID());
     setCoincident(ModelHighAPI_RefAttr(aEndPnt), theCorner.second);
@@ -589,6 +608,14 @@ std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangleCentered(
   return aRect;
 }
 
+std::shared_ptr<SketchAPI_Rectangle> SketchAPI_Sketch::addRectangleCentered(
+      double theCenterX, double theCenterY, 
+      double theCornerX, double theCornerY
+) {
+  std::shared_ptr<ModelAPI_Feature> aFeature = compositeFeature()->addFeature(SketchAPI_Rectangle::ID());
+  return RectanglePtr(new SketchAPI_Rectangle(aFeature, theCenterX, theCenterY, theCornerX, theCornerY, true));
+}
+
 //--------------------------------------------------------------------------------------
 std::shared_ptr<SketchAPI_Circle> SketchAPI_Sketch::addCircle(double theCenterX,
                                                               double theCenterY,