+ case 'F':
+ {
+ if (n1 != 3) goto badargs;
+ if (!first) {
+ MESSAGE("profile : The F instruction must precede all moves");
+ return;
+ }
+ x0 = x = a(1).RealValue();
+ y0 = y = a(2).RealValue();
+ stayfirst = Standard_True;
+ break;
+ }
+ case 'O':
+ {
+ if (n1 != 4) goto badargs;
+ P.SetLocation(gp_Pnt(a(1).RealValue(), a(2).RealValue(), a(3).RealValue()));
+ stayfirst = Standard_True;
+ break;
+ }
+ case 'P':
+ {
+ if (n1 != 7) goto badargs;
+ gp_Vec vn(a(1).RealValue(), a(2).RealValue(), a(3).RealValue());
+ gp_Vec vx(a(4).RealValue(), a(5).RealValue(), a(6).RealValue());
+ if (vn.Magnitude() <= Precision::Confusion() || vx.Magnitude() <= Precision::Confusion()) {
+ MESSAGE("profile : null direction");
+ return;
+ }
+ gp_Ax2 ax(P.Location(), vn, vx);
+ P.SetPosition(ax);
+ stayfirst = Standard_True;
+ break;
+ }
+ case 'X':
+ {
+ if (n1 != 2) goto badargs;
+ length = a(1).RealValue();
+ if (a(0) == "XX")
+ length -= x;
+ dx = 1; dy = 0;
+ move = line;
+ break;
+ }
+ case 'Y':
+ {
+ if (n1 != 2) goto badargs;
+ length = a(1).RealValue();
+ if (a(0) == "YY")
+ length -= y;
+ dx = 0; dy = 1;
+ move = line;
+ break;
+ }
+ case 'L':
+ {
+ if (n1 != 2) goto badargs;
+ length = a(1).RealValue();
+ if (Abs(length) > 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()) {
+ MESSAGE("profile : cannot intersect, arg "<<i-1);
+ return;
+ }
+ length = (length - x) / dx;
+ }
+ else if (a(0) == "IY") {
+ if (Abs(dy) < Precision::Confusion()) {
+ MESSAGE("profile : cannot intersect, arg "<<i-1);
+ return;
+ }
+ length = (length - y) / dy;
+ }
+ if (Abs(length) > 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:
+ {
+ MESSAGE("profile : unknown code " << a(i));
+ return;
+ }