1 // GEOM SKETCHER : basic sketcher
3 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : Sketcher_Profile.cxx
25 // Author : Damien COQUERET
30 #include "Sketcher_Profile.hxx"
32 #include <TopoDS_Vertex.hxx>
33 #include <TopoDS_Face.hxx>
36 #include <BRepLib.hxx>
37 #include <BRepBuilderAPI_MakeVertex.hxx>
38 #include <BRepBuilderAPI_MakeEdge.hxx>
39 #include <BRepBuilderAPI_MakeWire.hxx>
40 #include <BRepBuilderAPI_MakeFace.hxx>
41 #include <Geom2d_Line.hxx>
42 #include <Geom2d_Circle.hxx>
43 #include <Geom_Surface.hxx>
44 #include <Precision.hxx>
45 #include <GeomAPI.hxx>
47 #include <TCollection_AsciiString.hxx>
49 #include <SALOMEconfig.h>
50 #include CORBA_SERVER_HEADER(SALOMEDS)
52 #include "utilities.h"
54 //=======================================================================
56 // command to build a profile
57 //=======================================================================
58 Sketcher_Profile::Sketcher_Profile()
63 //=======================================================================
65 // command to build a profile
66 //=======================================================================
67 Sketcher_Profile::Sketcher_Profile(const char* aCmd)
69 enum {line, circle, point, none} move;
71 Standard_Integer i = 1;
72 Standard_Real x0, y0, x, y, dx, dy;
73 x0 = y0 = x = y = dy = 0;
76 Standard_Boolean first, stayfirst, face, close;
77 first = Standard_True;
78 stayfirst = face = close = Standard_False;
82 BRepBuilderAPI_MakeWire MW;
83 gp_Ax3 DummyHP(gp::XOY());
85 TopLoc_Location TheLocation;
86 Handle(Geom_Surface) Surface;
88 myOK = Standard_False;
90 TCollection_AsciiString aCommand(CORBA::string_dup(aCmd));
91 TCollection_AsciiString aToken = aCommand.Token(":", 1);
93 TCollection_AsciiString aTab[aCommand.Length()];
94 while(aToken.Length() != 0) {
95 if(aCommand.Token(":", n + 1).Length() > 0)
96 aTab[n] = aCommand.Token(":", n + 1);
97 aToken = aCommand.Token(":", ++n);
102 Standard_Real length = 0, radius = 0, angle = 0;
106 TCollection_AsciiString a[aTab[0].Length()];
107 aToken = aTab[i].Token(" ", 1);
108 while(aToken.Length() != 0) {
109 if(aTab[i].Token(" ", n1 + 1).Length() > 0)
110 a[n1] = aTab[i].Token(" ", n1 + 1);
111 aToken = aTab[i].Token(" ", ++n1);
115 switch(a[0].Value(1))
119 if (n1 != 3) goto badargs;
121 MESSAGE("profile : The F instruction must precede all moves");
124 x0 = x = a[1].RealValue();
125 y0 = y = a[2].RealValue();
126 stayfirst = Standard_True;
131 if (n1 != 4) goto badargs;
132 P.SetLocation(gp_Pnt(a[1].RealValue(), a[2].RealValue(), a[3].RealValue()));
133 stayfirst = Standard_True;
138 if (n1 != 7) goto badargs;
139 gp_Vec vn(a[1].RealValue(), a[2].RealValue(), a[3].RealValue());
140 gp_Vec vx(a[4].RealValue(), a[5].RealValue(), a[6].RealValue());
141 if (vn.Magnitude() <= Precision::Confusion() || vx.Magnitude() <= Precision::Confusion()) {
142 MESSAGE("profile : null direction");
145 gp_Ax2 ax(P.Location(), vn, vx);
147 stayfirst = Standard_True;
152 if (n1 != 2) goto badargs;
153 length = a[1].RealValue();
162 if (n1 != 2) goto badargs;
163 length = a[1].RealValue();
172 if (n1 != 2) goto badargs;
173 length = a[1].RealValue();
174 if (Abs(length) > Precision::Confusion())
182 if (n1 != 3) goto badargs;
183 Standard_Real vx = a[1].RealValue();
184 Standard_Real vy = a[2].RealValue();
189 length = Sqrt(vx * vx + vy * vy);
190 if (length > Precision::Confusion()) {
201 if (n1 != 2) goto badargs;
202 angle = a[1].RealValue() * PI180;
208 Standard_Real c = Cos(angle);
209 Standard_Real s = Sin(angle);
210 Standard_Real t = c * dx - s * dy;
211 dy = s * dx + c * dy;
218 if (n1 != 3) goto badargs;
219 Standard_Real vx = a[1].RealValue();
220 Standard_Real vy = a[2].RealValue();
221 length = Sqrt(vx * vx + vy * vy);
222 if (length > Precision::Confusion()) {
232 if (n1 != 3) goto badargs;
233 radius = a[1].RealValue();
234 if (Abs(radius) > Precision::Confusion()) {
235 angle = a[2].RealValue() * PI180;
244 if (n1 != 2) goto badargs;
245 length = a[1].RealValue();
247 if (Abs(dx) < Precision::Confusion()) {
248 MESSAGE("profile : cannot intersect, arg "<<i-1);
251 length = (length - x) / dx;
253 else if (a[0] == "IY") {
254 if (Abs(dy) < Precision::Confusion()) {
255 MESSAGE("profile : cannot intersect, arg "<<i-1);
258 length = (length - y) / dy;
260 if (Abs(length) > Precision::Confusion())
269 close = Standard_True;
270 else if(a[0] == "WF") {
271 close = Standard_True;
272 face = Standard_True;
279 MESSAGE("profile : unknown code "<<a[i]);
294 Handle(Geom2d_Line) l = new Geom2d_Line(gp_Pnt2d(x,y),gp_Dir2d(dx,dy));
295 BRepBuilderAPI_MakeEdge ME (GeomAPI::To3d(l,P),0,length);
305 Standard_Boolean sense = Standard_True;
312 gp_Ax2d ax(gp_Pnt2d(x-radius*dy,y+radius*dx),gp_Dir2d(dy,-dx));
317 Handle(Geom2d_Circle) c = new Geom2d_Circle(ax,radius,sense);
318 BRepBuilderAPI_MakeEdge ME (GeomAPI::To3d(c,P),0,angle);
333 MP = BRepBuilderAPI_MakeVertex(gp_Pnt(x, y, 0.0));
345 stayfirst = Standard_False;
347 if(!(dx == 0 && dy == 0))
348 myLastDir.SetCoord(dx, dy, 0.0);
356 if ((i == n) && close) {
357 // the closing segment
360 length = Sqrt(dx * dx + dy * dy);
362 if (length > Precision::Confusion()) {
370 // get the result, face or wire
373 } else if (move == point) {
379 BRepBuilderAPI_MakeFace MF (P, MW.Wire());
391 if(!TheLocation.IsIdentity())
399 MESSAGE("profile : bad number of arguments");