Circular Arc
DSL function
DrawArc (Initx, Inity, Initz, Endx, Endy, i, j, k, Height, TSpin, Feedrate, dx)
Curry program for the DSL function

------------------------------------------------------------------------------
------------- ARCO DE CIRCULO -------------------------------------------
---------(Parametrizado con radio)--------------------------------------------
------------------------------------------------------------------------------

-- Funcion Para Dibujar un Arco de Circulo
-- Se debe indicar punto inicial(x,y,z), punto final(x,y), radio y
-- TSpin= Tipo de giro (CW=ClockWise CCW=CounterClockWise)
DrawArcwR :: (Float, Float, Float, Float, Float, Float, Float, String, Float, Float) -> IO()
DrawArcwR (Initx, Inity, Initz, Endx, Endy, Height, Radius, TSpin, Feed, dx) =
do Perforate
Draw
Restore
where
-- InitPOS = writefile(GotoXYZ(Initx, Inity,Initz))
Perforate = DrawHole(Initx, Inity, Initz, Height, Feed, dx)
Draw = writefile([Spin(TSpin),X Endx, Y Endy, R Radius, F Feed])
Restore = writefile(GotoZ(Initz))

------------------------------------------------------------------------------
------------- ARCO DE CIRCULO -----------------------------------------
---(Parametrizado con el centro de circunferencia)----------------------------
------------------------------------------------------------------------------

{-- FUNCION AUXILIAR --}
FAUX_DrawArc :: (Float, Float, Float, Float, Float, Float, Float, Float, Float,
String, Float, Float, Float) -> IO()
FAUX_DrawArc(InitX, InitY, InitZ, Endx, Endy, i, j, k, Height, TSpin, Feedrate,
halfdx, control) = do Draw

where
Draw = if ((Height >= control)&&((Height-.control) >= halfdx))||(Height==control)
then do
writefile(GotoXY(InitX,InitY))
writefile(DrawZ(control,Feedrate))
writefile([Spin(TSpin),X Endx, Y Endy, I i, J j, K k, F Feedrate])
writefile(GotoZ(InitZ))
FAUX_DrawArc(InitX,InitY,InitZ,Endx,Endy,i,j,k,Height,TSpin,Feedrate,halfdx,(control+.halfdx))
else if ((Height >= control)&&((Height-.control) < halfdx))
then do --Se usa para compensar....
writefile(GotoXY(InitX,InitY))
writefile(DrawZ(control,Feedrate))
writefile([Spin(TSpin),X Endx, Y Endy, I i, J j, K k, F Feedrate])
FAUX_DrawArc(InitX,InitY,InitZ,Endx,Endy,i,j,k,Height,TSpin,Feedrate,halfdx,(control+.(Height-.control)))
else done

{-- FUNCION PRINCIPAL --}

-- Funcion para dibujar un Arco de Circulo
-- Se debe indicar punto inicial (x,y,z), punto final (x,y)
-- centro de la circunferencia (i,j,k)
-- Tipo de giro (TSpin) { CW=ClockWise CCW=CounterClockWise }
DrawArc :: (Float, Float, Float, Float, Float, Float, Float, Float, Float, String, Float, Float) -> IO()
DrawArc (Initx, Inity, Initz, Endx, Endy, i, j, k, Height, TSpin, Feedrate, dx) = do InitPOS
Perforate

where
InitPOS = writefile(GotoXYZ(Initx, Inity, Initz))
-- Si el ancho de la herramienta es mayor que la profundidad
Perforate = if (Height<dx)
then do
writefile(DrawZ(Height,Feedrate))
writefile([Spin(TSpin),X Endx, Y Endy, I i, J j, K k,
F Feedrate])
-- Si el ancho de la herramienta es menor que la profundidad
else do
FAUX_DrawArc(Initx,Inity,Initz,Endx,Endy,i,j,k,Height,TSpin, Feedrate,(0.5*.dx),(0.5*.dx))

example figure