1 // Copyright (C) 2014-2019 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "SketchAPI_MacroEllipse.h"
21 #include "SketchAPI_Line.h"
22 #include "SketchAPI_Point.h"
24 #include <GeomAPI_Pnt2d.h>
26 #include <ModelHighAPI_RefAttr.h>
27 #include <ModelHighAPI_Tools.h>
29 #include <SketchPlugin_Sketch.h>
31 #define MAJOR_AXIS_NEGATIVE (std::dynamic_pointer_cast<GeomDataAPI_Point2D>( \
32 feature()->attribute(SketchPlugin_MacroEllipse::FIRST_POINT_ID())))
33 #define MAJOR_AXIS_POSITIVE (std::dynamic_pointer_cast<GeomDataAPI_Point2D>( \
34 feature()->attribute(SketchPlugin_MacroEllipse::SECOND_POINT_ID())))
35 #define PASSED_POINT (std::dynamic_pointer_cast<GeomDataAPI_Point2D>( \
36 feature()->attribute(SketchPlugin_MacroEllipse::PASSED_POINT_ID())))
38 #define MAJOR_AXIS_NEGATIVE_REF (feature()->refattr( \
39 SketchPlugin_MacroEllipse::FIRST_POINT_REF_ID()))
40 #define MAJOR_AXIS_POSITIVE_REF (feature()->refattr( \
41 SketchPlugin_MacroEllipse::SECOND_POINT_REF_ID()))
42 #define PASSED_POINT_REF (feature()->refattr(SketchPlugin_MacroEllipse::PASSED_POINT_REF_ID()))
45 // find a parent sketch
46 static CompositeFeaturePtr sketch(FeaturePtr theFeature)
48 CompositeFeaturePtr aSketch;
49 const std::set<AttributePtr>& aRefs = theFeature->data()->refsToMe();
50 for (std::set<AttributePtr>::const_iterator anIt = aRefs.begin(); anIt != aRefs.end(); ++anIt)
51 if ((*anIt)->id() == SketchPlugin_Sketch::FEATURES_ID()) {
52 aSketch = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>((*anIt)->owner());
59 SketchAPI_MacroEllipse::SketchAPI_MacroEllipse(const std::shared_ptr<ModelAPI_Feature>& theFeature)
60 : SketchAPI_SketchEntity(theFeature)
65 SketchAPI_MacroEllipse::SketchAPI_MacroEllipse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
66 double theX1, double theY1,
67 double theX2, double theY2,
68 double theX3, double theY3,
70 : SketchAPI_SketchEntity(theFeature)
74 setByCenterAndPassedPoints();
76 setByMajorAxisAndPassedPoint();
78 initializePoints(theX1, theY1, theX2, theY2, theX3, theY3);
82 SketchAPI_MacroEllipse::SketchAPI_MacroEllipse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
83 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint1,
84 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint2,
85 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint3,
87 : SketchAPI_SketchEntity(theFeature)
91 setByCenterAndPassedPoints();
93 setByMajorAxisAndPassedPoint();
95 initializePoints(thePoint1, thePoint2, thePoint3);
99 SketchAPI_MacroEllipse::SketchAPI_MacroEllipse(const std::shared_ptr<ModelAPI_Feature>& theFeature,
100 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint1,
101 const ModelHighAPI_RefAttr& thePoint1Ref,
102 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint2,
103 const ModelHighAPI_RefAttr& thePoint2Ref,
104 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint3,
105 const ModelHighAPI_RefAttr& thePoint3Ref,
107 : SketchAPI_SketchEntity(theFeature)
111 setByCenterAndPassedPoints();
113 setByMajorAxisAndPassedPoint();
115 initializePoints(thePoint1, thePoint1Ref, thePoint2, thePoint2Ref, thePoint3, thePoint3Ref);
119 SketchAPI_MacroEllipse::~SketchAPI_MacroEllipse()
123 void SketchAPI_MacroEllipse::setByCenterAndPassedPoints()
125 fillAttribute(SketchPlugin_MacroEllipse::ELLIPSE_TYPE_BY_CENTER_AXIS_POINT(), myellipseType);
128 void SketchAPI_MacroEllipse::setByMajorAxisAndPassedPoint()
130 fillAttribute(SketchPlugin_MacroEllipse::ELLIPSE_TYPE_BY_AXIS_AND_POINT(), myellipseType);
133 void SketchAPI_MacroEllipse::initializePoints(double theX1, double theY1,
134 double theX2, double theY2,
135 double theX3, double theY3)
137 fillAttribute(MAJOR_AXIS_NEGATIVE, theX1, theY1);
138 fillAttribute(MAJOR_AXIS_POSITIVE, theX2, theY2);
139 fillAttribute(PASSED_POINT, theX3, theY3);
141 mySketch = sketch(feature());
145 void SketchAPI_MacroEllipse::initializePoints(const std::shared_ptr<GeomAPI_Pnt2d>& thePoint1,
146 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint2,
147 const std::shared_ptr<GeomAPI_Pnt2d>& thePoint3)
149 fillAttribute(thePoint1, MAJOR_AXIS_NEGATIVE);
150 fillAttribute(thePoint2, MAJOR_AXIS_POSITIVE);
151 fillAttribute(thePoint3, PASSED_POINT);
153 mySketch = sketch(feature());
157 static void fillAttribute(const std::shared_ptr<GeomAPI_Pnt2d>& thePoint,
158 const ModelHighAPI_RefAttr& thePointRef,
159 std::shared_ptr<GeomDataAPI_Point2D> thePointAttr,
160 AttributeRefAttrPtr thePointRefAttr)
162 GeomPnt2dPtr aPoint = thePoint;
163 if (!thePointRef.isEmpty()) {
164 fillAttribute(thePointRef, thePointRefAttr);
165 std::shared_ptr<GeomDataAPI_Point2D> anAttrPnt =
166 std::dynamic_pointer_cast<GeomDataAPI_Point2D>(thePointRefAttr->attr());
168 aPoint = anAttrPnt->pnt();
170 fillAttribute(aPoint, thePointAttr);
173 void SketchAPI_MacroEllipse::initializePoints(
174 const std::shared_ptr<GeomAPI_Pnt2d>& theMajorAxisPoint1,
175 const ModelHighAPI_RefAttr& theMajorAxisPoint1Ref,
176 const std::shared_ptr<GeomAPI_Pnt2d>& theMajorAxisPoint2,
177 const ModelHighAPI_RefAttr& theMajorAxisPoint2Ref,
178 const std::shared_ptr<GeomAPI_Pnt2d>& thePassedPoint,
179 const ModelHighAPI_RefAttr& thePassedPointRef)
181 fillAttribute(theMajorAxisPoint1, theMajorAxisPoint1Ref,
182 MAJOR_AXIS_NEGATIVE, MAJOR_AXIS_NEGATIVE_REF);
183 fillAttribute(theMajorAxisPoint2, theMajorAxisPoint2Ref,
184 MAJOR_AXIS_POSITIVE, MAJOR_AXIS_POSITIVE_REF);
185 fillAttribute(thePassedPoint, thePassedPointRef,
186 PASSED_POINT, PASSED_POINT_REF);
188 mySketch = sketch(feature());
192 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::center()
199 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::focus1()
206 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::focus2()
213 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::majorAxisStart()
215 if (!myMajorAxisStart)
217 return myMajorAxisStart;
220 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::majorAxisEnd()
224 return myMajorAxisEnd;
227 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::minorAxisStart()
229 if (!myMinorAxisStart)
231 return myMinorAxisStart;
234 std::shared_ptr<SketchAPI_Point> SketchAPI_MacroEllipse::minorAxisEnd()
238 return myMinorAxisEnd;
241 std::shared_ptr<SketchAPI_Line> SketchAPI_MacroEllipse::majorAxis()
248 std::shared_ptr<SketchAPI_Line> SketchAPI_MacroEllipse::minorAxis()
255 void SketchAPI_MacroEllipse::collectAuxiliary()
257 // collect auxiliary features
258 int aNbSubs = mySketch->numberOfSubs();
259 std::shared_ptr<SketchAPI_Point>* anAuxPoint[] = {
260 &myCenter, &myFocus1, &myFocus2,
261 &myMajorAxisStart, &myMajorAxisEnd,
262 &myMinorAxisStart, &myMinorAxisEnd
264 std::shared_ptr<SketchAPI_Line>* anAuxLine[] = {&myMajorAxis, &myMinorAxis};
265 for (int aPtInd = 7, aLinInd = 2; (aPtInd > 0 || aLinInd > 0) && aNbSubs >= 0; ) {
266 FeaturePtr aCurFeature = mySketch->subFeature(--aNbSubs);
267 if (aPtInd > 0 && aCurFeature->getKind() == SketchPlugin_Point::ID())
268 anAuxPoint[--aPtInd]->reset(new SketchAPI_Point(aCurFeature));
269 else if (aLinInd > 0 && aCurFeature->getKind() == SketchPlugin_Line::ID())
270 anAuxLine[--aLinInd]->reset(new SketchAPI_Line(aCurFeature));