/* TrepOval - cut an oval (racetrack) hole in a panel,
	without cutting all the material away,
	unlike making a pocket. */

#include <stdio.h>
#include <math.h>

double llX, llY, urX, urY, Xsize, Ysize, ToolDia,  FeedRate,
	      FinishWOC, FinishFeed, Offset, X, Y,
	      CurX, CurY, CurZ, ToolRadius, HoleRadius, angle;
double DepthPerPass, Thickness;
double LineNo;
char FileName[256];
FILE *OutFile;
int EXIT_SUCCESS=1;
int EXIT_FAILURE=0;

void outNum(RealNum, SigFrac)
double RealNum;
long SigFrac;
{
  double i;
  int j;
  char format[8];

  for (i = 1.0, j = 0; j <= 6 && i <= fabs(RealNum); i *= 10.0, j++)
    {}
  j += SigFrac-1;  /* J <= # int digits + 1 for decimal pt + #frac digits */
  if (RealNum < 0.0 )
    j += 1;          /* add a position for the minus sign */
  sprintf(format,"%%%d.%dlf",j,SigFrac);
    fprintf(OutFile, format, (RealNum));
}



void WriteLineNo()
{
  putc('N', OutFile);
  outNum(LineNo, 0L);
  LineNo += 10.0;
  putc(' ', OutFile);
}


main(argc, argv)
int argc;
char *argv[];
{
  OutFile = NULL;
  printf("Enter Lower or Left center X,Y (real):");
  scanf("%lf %lf", &llX, &llY);
  getchar();
  printf("Enter Upper or Right center X,Y (real):");
  scanf("%lf %lf", &urX, &urY);
  getchar();
  printf("Enter Radius of cutout (real):");
  scanf("%lf",&HoleRadius);
  getchar();
  printf("\nEnter Tool Diameter (real):");
  scanf("%lf", &ToolDia);
  getchar();
  printf("\nEnter Feed Rate (IPM) (real):");
  scanf("%lf", &FeedRate);
  getchar();
  printf("\nEnter Finish Feed Rate, Width of Final Cut:");
  scanf("%lf %lf", &FinishFeed, &FinishWOC);
  getchar();
  printf("\nEnter depth per pass, material Thickness:");
  scanf("%lf %lf", &DepthPerPass, &Thickness);
  getchar();
  printf("\nEnter File Name for CAM output:");
  scanf("%s",FileName);
  OutFile = fopen(FileName,"w");
  if (OutFile != NULL)
    rewind(OutFile);
  else
    OutFile = tmpfile();
  if (OutFile == NULL)
    exit(EXIT_FAILURE);
  /* write header */
  fprintf(OutFile,"(TrepOval tool=%lf)\n",ToolDia);
  fprintf(OutFile,"(ll = [%lf,%lf]   ur = [%lf,%lf])\n",llX,llY,urX,urY);
  fprintf(OutFile,"(Radius = %lf  final allowance = %lf)\n",HoleRadius,FinishWOC);
  angle = atan((urY - llY) / (urX - llX));
  LineNo = 10.0;
  ToolRadius = ToolDia / 2.0;
  CurX = llX + (HoleRadius - ToolRadius - FinishWOC)*sin(angle);
  CurY = llY - (HoleRadius - ToolRadius - FinishWOC)*cos(angle);
  WriteLineNo();
  fprintf(OutFile, "G01 F");
  outNum(50.0,1L);   /* Lin Interp. */
  fprintf(OutFile, " X");   /* and go to initial pos */
  outNum(CurX, 4L);
  fprintf(OutFile, " Y");
  outNum(CurY, 4L);
  putc('\n', OutFile);
  for (CurZ = -DepthPerPass;
          CurZ >= -Thickness-DepthPerPass+0.001; CurZ -= DepthPerPass)
    {
    WriteLineNo();         /* plunge to new level */
    fprintf(OutFile, "G01 Z");
    outNum(CurZ, 4L);
    fprintf(OutFile," F");
    outNum(FeedRate/4.0, 4L);
    putc('\n', OutFile);
    X = urX + (HoleRadius - ToolRadius - FinishWOC)*sin(angle);
    Y = urY - (HoleRadius - ToolRadius - FinishWOC)*cos(angle);
    WriteLineNo();          /* first straight move */
    putc('X', OutFile);
    outNum(X, 4L);
    fprintf(OutFile," Y");
    outNum(Y, 4L);
    fprintf(OutFile," F");
    outNum(FeedRate, 4L);
    putc('\n', OutFile);
    WriteLineNo();          /* arc around UR point */
    fprintf(OutFile,"G03 X");
    X = urX - (HoleRadius - ToolRadius - FinishWOC)*sin(angle);
    Y = urY + (HoleRadius - ToolRadius - FinishWOC)*cos(angle);
    outNum(X, 4L);
    fprintf(OutFile," Y");
    outNum(Y, 4L);
    fprintf(OutFile," R");
    outNum(HoleRadius-ToolRadius-FinishWOC, 4L);
    putc('\n', OutFile);
    X = llX - (HoleRadius - ToolRadius - FinishWOC)*sin(angle);
    Y = llY + (HoleRadius - ToolRadius - FinishWOC)*cos(angle);
    WriteLineNo();         /* straight move back toward ll */
    fprintf(OutFile,"G01 X");
    outNum(X, 4L);
    fprintf(OutFile," Y");
    outNum(Y, 4L);
    fprintf(OutFile," F");
    outNum(FeedRate, 4L);
    putc('\n', OutFile);
    WriteLineNo();          /* arc around LL point */
    fprintf(OutFile,"G03 X");
    X = llX + (HoleRadius - ToolRadius - FinishWOC)*sin(angle);
    Y = llY - (HoleRadius - ToolRadius - FinishWOC)*cos(angle);
    outNum(X, 4L);
    fprintf(OutFile," Y");
    outNum(Y, 4L);
    fprintf(OutFile," R");
    outNum(HoleRadius-ToolRadius-FinishWOC, 4L);
    putc('\n', OutFile);
    }
  X = urX + (HoleRadius - ToolRadius)*sin(angle);
  Y = urY - (HoleRadius - ToolRadius)*cos(angle);
  WriteLineNo();          /* first straight move */
  fprintf(OutFile,"G01 X");
  outNum(X, 4L);
  fprintf(OutFile," Y");
  outNum(Y, 4L);
  fprintf(OutFile," F");
  outNum(FinishFeed, 4L);
  putc('\n', OutFile);
  WriteLineNo();          /* arc around UR point */
  fprintf(OutFile,"G03 X");
  X = urX - (HoleRadius - ToolRadius)*sin(angle);
  Y = urY + (HoleRadius - ToolRadius)*cos(angle);
  outNum(X, 4L);
  fprintf(OutFile," Y");
  outNum(Y, 4L);
  fprintf(OutFile," R");
  outNum(HoleRadius-ToolRadius, 4L);
  putc('\n', OutFile);
  X = llX - (HoleRadius - ToolRadius)*sin(angle);
  Y = llY + (HoleRadius - ToolRadius)*cos(angle);
  WriteLineNo();         /* straight move back toward ll */
  fprintf(OutFile,"G01 X");
  outNum(X, 4L);
  fprintf(OutFile," Y");
  outNum(Y, 4L);
  fprintf(OutFile," F");
  outNum(FeedRate, 4L);
  putc('\n', OutFile);
  WriteLineNo();          /* arc around LL point */
  fprintf(OutFile,"G03 X");
  X = llX + (HoleRadius - ToolRadius)*sin(angle);
  Y = llY - (HoleRadius - ToolRadius)*cos(angle);
  outNum(X, 4L);
  fprintf(OutFile," Y");
  outNum(Y, 4L);
  fprintf(OutFile," R");
  outNum(HoleRadius-ToolRadius, 4L);
  putc('\n', OutFile);
  X = urX + (HoleRadius - ToolRadius)*sin(angle);
  Y = urY - (HoleRadius - ToolRadius)*cos(angle);
  WriteLineNo();          /* final straight move */
  fprintf(OutFile,"G01 X");
  outNum(X, 4L);
  fprintf(OutFile," Y");
  outNum(Y, 4L);
  fprintf(OutFile," F");
  outNum(FinishFeed, 4L);
  putc('\n', OutFile);
  WriteLineNo();            /* raise tool */
  fprintf(OutFile,"G01 F25 Z");
  outNum(0.1, 4L);
  putc('\n', OutFile);
  WriteLineNo();
  fprintf(OutFile, "M02\n");   /*End of Program */
  if (OutFile != NULL)
    fclose(OutFile);
  OutFile = NULL;
  if (OutFile != NULL)
    fclose(OutFile);
  exit(EXIT_SUCCESS);
}



/* End. */
