Salome HOME
updated copyright message
[modules/shaper.git] / src / SketchPlugin / SketchPlugin_MacroArc.h
1 // Copyright (C) 2014-2023  CEA, EDF
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #ifndef SketchPlugin_MacroArc_H_
21 #define SketchPlugin_MacroArc_H_
22
23 #include <ModelAPI_IReentrant.h>
24
25 #include "SketchPlugin.h"
26 #include "SketchPlugin_SketchEntity.h"
27
28 #include <GeomAPI_IPresentable.h>
29
30 class GeomAPI_Circ2d;
31 class GeomAPI_Pnt2d;
32
33 /**\class SketchPlugin_MacroArc
34  * \ingroup Plugins
35  * \brief Feature for creation of the new arc of circle in PartSet.
36  * The visualization of this object is separated in two parts. The first one is an AIS object
37  * calculated when there is non-initialized attributes of the arc. The second is a result and
38  * it is calculated if all attributes are initialized.
39  */
40 class SketchPlugin_MacroArc: public SketchPlugin_SketchEntity,
41                              public GeomAPI_IPresentable,
42                              public ModelAPI_IReentrant
43 {
44  public:
45   /// Arc feature kind
46   inline static const std::string& ID()
47   {
48     static const std::string ID("SketchMacroArc");
49     return ID;
50   }
51
52   inline static const std::string& ARC_TYPE()
53   {
54     static const std::string ID("arc_type");
55     return ID;
56   }
57
58   static const std::string& ARC_TYPE_BY_CENTER_AND_POINTS()
59   {
60     static const std::string ID("by_center_and_points");
61     return ID;
62   }
63   static const std::string& ARC_TYPE_BY_THREE_POINTS()
64   {
65     static const std::string ID("by_three_points");
66     return ID;
67   }
68
69   inline static const std::string& ARC_TYPE_BY_TANGENT_EDGE()
70   {
71     static const std::string ID("by_tangent_edge");
72     return ID;
73   }
74
75   inline static const std::string& ARC_TYPE_BY_TRANSVERSAL_LINE()
76   {
77     static const std::string ID("by_transversal_line");
78     return ID;
79   }
80
81   /// Central 2D point of the circle which contains the arc
82   inline static const std::string& CENTER_POINT_ID()
83   {
84     static const std::string ID = "center_point";
85     return ID;
86   }
87
88   inline static const std::string& CENTER_POINT_REF_ID()
89   {
90     static const std::string ID = "center_point_ref";
91     return ID;
92   }
93
94   /// Start 2D point of the arc
95   inline static const std::string& START_POINT_1_ID()
96   {
97     static const std::string ID = "start_point_1";
98     return ID;
99   }
100
101   /// Start 2D point of the arc
102   inline static const std::string& START_POINT_2_ID()
103   {
104     static const std::string ID = "start_point_2";
105     return ID;
106   }
107
108   inline static const std::string& START_POINT_REF_ID()
109   {
110     static const std::string ID = "start_point_ref";
111     return ID;
112   }
113
114   /// End 2D point of the arc
115   inline static const std::string& END_POINT_1_ID()
116   {
117     static const std::string ID = "end_point_1";
118     return ID;
119   }
120
121   /// End 2D point of the arc
122   inline static const std::string& END_POINT_2_ID()
123   {
124     static const std::string ID = "end_point_2";
125     return ID;
126   }
127
128   /// End 2D point of the arc
129   inline static const std::string& END_POINT_3_ID()
130   {
131     static const std::string ID = "end_point_3";
132     return ID;
133   }
134
135   /// End 2D point of the arc
136   inline static const std::string& END_POINT_4_ID()
137   {
138     static const std::string ID = "end_point_4";
139     return ID;
140   }
141
142   inline static const std::string& END_POINT_REF_ID()
143   {
144     static const std::string ID = "end_point_ref";
145     return ID;
146   }
147
148   /// Passed point of the arc.
149   static const std::string& PASSED_POINT_ID()
150   {
151     static const std::string ID("passed_point");
152     return ID;
153   }
154
155   static const std::string& PASSED_POINT_REF_ID()
156   {
157     static const std::string ID("passed_point_ref");
158     return ID;
159   }
160
161   static const std::string& TANGENT_POINT_ID()
162   {
163     static const std::string ID("tangent_point");
164     return ID;
165   }
166
167   static const std::string& TRANSVERSAL_POINT_ID()
168   {
169     static const std::string ID("transversal_point");
170     return ID;
171   }
172
173   /// Reversed flag
174   inline static const std::string& REVERSED_ID()
175   {
176     static const std::string ID("reversed");
177     return ID;
178   }
179
180   /// Arc radius.
181   static const std::string& RADIUS_ID()
182   {
183     static const std::string ID("radius");
184     return ID;
185   }
186
187   /// Arc angle.
188   static const std::string& ANGLE_ID()
189   {
190     static const std::string ID("angle");
191     return ID;
192   }
193
194   /// Arc angle.
195   static const std::string& EDIT_ARC_TYPE_ID()
196   {
197     static const std::string ID("edit_arc_type");
198     return ID;
199   }
200
201   /// Returns the kind of a feature
202   SKETCHPLUGIN_EXPORT virtual const std::string& getKind()
203   {
204     static std::string MY_KIND = SketchPlugin_MacroArc::ID();
205     return MY_KIND;
206   }
207
208   /// \brief Request for initialization of data model of the feature: adding all attributes.
209   SKETCHPLUGIN_EXPORT virtual void initAttributes();
210
211   /// Called on change of any argument-attribute of this object
212   /// \param theID identifier of changed attribute
213   SKETCHPLUGIN_EXPORT virtual void attributeChanged(const std::string& theID);
214
215   /// Returns the AIS preview
216   virtual AISObjectPtr getAISObject(AISObjectPtr thePrevious);
217
218   /// Creates an arc-shape
219   SKETCHPLUGIN_EXPORT virtual void execute();
220
221   /// Reimplemented from ModelAPI_Feature::isMacro().
222   SKETCHPLUGIN_EXPORT virtual bool isMacro() const {return true;};
223
224   SKETCHPLUGIN_EXPORT virtual bool isPreviewNeeded() const {return false;};
225
226   /// Apply information of the message to current object. It fills reference object,
227   /// tangent type and tangent point refence in case of tangent arc
228   virtual std::string processEvent(const std::shared_ptr<Events_Message>& theMessage);
229
230   /// Use plugin manager for features creation.
231   SketchPlugin_MacroArc();
232
233   /// Returns shape of arc.
234   /// \param isBound  if true prepare arc, otherwice create circle containing this arc
235   GeomShapePtr getArcShape(bool isBound = true);
236
237 private:
238   /// Set fields for center, start and end points
239   void fillByCenterAndTwoPassed();
240   /// Set fields for center, start and end points by selected passed points
241   void fillByThreePassedPoints();
242   /// Set fields for center, start and end points by selected tangent or transversal edge
243   /// \param theTransversal if \c true, builds transversal arc, otherwise builds tangential arc.
244   void fillByEdge(bool theTransversal);
245
246   FeaturePtr createArcFeature();
247
248   void recalculateReversedFlagByEnd(const GeomAPI_Circ2d& theCurrentCircular);
249   void recalculateReversedFlagByPassed(const GeomAPI_Circ2d& theCurrentCircular);
250
251 private:
252   std::shared_ptr<GeomAPI_Pnt2d> myCenter;
253   std::shared_ptr<GeomAPI_Pnt2d> myStart;
254   std::shared_ptr<GeomAPI_Pnt2d> myEnd;
255
256   /// To define in which direction draw arc.
257   double myParamBefore;
258 };
259
260 #endif