// GEOM SKETCHER : basic sketcher // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // // File : Sketcher_Profile.cxx // Author : Damien COQUERET // Module : GEOM // $Header: using namespace std; #include "Sketcher_Profile.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include CORBA_SERVER_HEADER(SALOMEDS) //======================================================================= // profile // command to build a profile //======================================================================= Sketcher_Profile::Sketcher_Profile() { } //======================================================================= // profile // command to build a profile //======================================================================= Sketcher_Profile::Sketcher_Profile(const char* aCmd) { enum {line, circle, point, none} move; Standard_Integer i = 1; Standard_Real x0, y0, x, y, dx, dy; x0 = y0 = x = y = dy = 0; dx = 1; Standard_Boolean first, stayfirst, face, close; first = Standard_True; stayfirst = face = close = Standard_False; TopoDS_Shape S; TopoDS_Vertex MP; BRepBuilderAPI_MakeWire MW; gp_Ax3 DummyHP(gp::XOY()); gp_Pln P(DummyHP); TopLoc_Location TheLocation; Handle(Geom_Surface) Surface; myOK = Standard_False; TCollection_AsciiString aCommand(CORBA::string_dup(aCmd)); TCollection_AsciiString aToken = aCommand.Token(":", 1); int n = 0; TCollection_AsciiString aTab[aCommand.Length()]; while(aToken.Length() != 0) { if(aCommand.Token(":", n + 1).Length() > 0) aTab[n] = aCommand.Token(":", n + 1); aToken = aCommand.Token(":", ++n); } n = n - 1; while(i < n) { Standard_Real length = 0, radius = 0, angle = 0; move = point; int n1 = 0; TCollection_AsciiString a[aTab[0].Length()]; aToken = aTab[i].Token(" ", 1); while(aToken.Length() != 0) { if(aTab[i].Token(" ", n1 + 1).Length() > 0) a[n1] = aTab[i].Token(" ", n1 + 1); aToken = aTab[i].Token(" ", ++n1); } n1 = n1 - 1; switch(a[0].Value(1)) { case 'F': { if (n1 != 3) goto badargs; if (!first) { cout<<"profile : The F instruction must precede all moves"< Precision::Confusion()) move = line; else move = none; break; } case 'T': { if (n1 != 3) goto badargs; Standard_Real vx = a[1].RealValue(); Standard_Real vy = a[2].RealValue(); if (a[0] == "TT") { vx -= x; vy -= y; } length = Sqrt(vx * vx + vy * vy); if (length > Precision::Confusion()) { move = line; dx = vx / length; dy = vy / length; } else move = none; break; } case 'R': { if (n1 != 2) goto badargs; angle = a[1].RealValue() * PI180; if (a[0] == "RR") { dx = Cos(angle); dy = Sin(angle); } else { Standard_Real c = Cos(angle); Standard_Real s = Sin(angle); Standard_Real t = c * dx - s * dy; dy = s * dx + c * dy; dx = t; } break; } case 'D': { if (n1 != 3) goto badargs; Standard_Real vx = a[1].RealValue(); Standard_Real vy = a[2].RealValue(); length = Sqrt(vx * vx + vy * vy); if (length > Precision::Confusion()) { dx = vx / length; dy = vy / length; } else move = none; break; } case 'C': { if (n1 != 3) goto badargs; radius = a[1].RealValue(); if (Abs(radius) > Precision::Confusion()) { angle = a[2].RealValue() * PI180; move = circle; } else move = none; break; } case 'I': { if (n1 != 2) goto badargs; length = a[1].RealValue(); if (a[0] == "IX") { if (Abs(dx) < Precision::Confusion()) { cout<<"profile : cannot intersect, arg "< Precision::Confusion()) move = line; else move = none; break; } case 'W': { if (a[0] == "WW") close = Standard_True; else if(a[0] == "WF") { close = Standard_True; face = Standard_True; } i = n - 1; break; } default: { cout<<"profile : unknown code "<D1(angle,p,v); x = p.X(); y = p.Y(); dx = v.X() / radius; dy = v.Y() / radius; break; } case point: { MP = BRepBuilderAPI_MakeVertex(gp_Pnt(x, y, 0.0)); break; } case none: { i = n - 1; break; } } // update first first = stayfirst; stayfirst = Standard_False; if(!(dx == 0 && dy == 0)) myLastDir.SetCoord(dx, dy, 0.0); else return; myLastPoint.SetX(x); myLastPoint.SetY(y); // next segment.... i++; if ((i == n) && close) { // the closing segment dx = x0 - x; dy = y0 - y; length = Sqrt(dx * dx + dy * dy); move = line; if (length > Precision::Confusion()) { dx = dx / length; dy = dy / length; goto again; } } } // get the result, face or wire if (move == none) return; else if (move == point) S = MP; else if (face) S = BRepBuilderAPI_MakeFace(P, MW.Wire()); else S = MW; if(!TheLocation.IsIdentity()) S.Move(TheLocation); myShape = S; myOK = true; return; badargs : cout<<"profile : bad number of arguments"<