[MAIN PART OF THE CFF]


[MACHINE NAMES]
Machine:
Model:
Customer:

[REVISION NUMBER]
0.1

[REVISION NOTES]
0.1 Original version

[MAIN]
{START OF FILE}
{PROGRAM INIT}
{VALIDATE PLATE}
{OUTPUT PROFILES}
{END OF FILE}

[PROCESS NAMES]
CUT2=Plasma

[SECTION PART OF THE CFF]


[START OF FILE]
%

[PROGRAM INIT]
{INFO}
{UNITS}
{MODE}
$REG_STATE := 1

[INFO]
(Post processor: Puremotion THC Pronest)

[UNITS]
IF $UNITS=INCH
	{LINENO :M}G20
ELSE
	{LINENO :M}G21
END

[MODE]
IF $MODE=ABSOLUTE
	{LINENO :M}G90
ELSE
	{LINENO :M}G91
END
{LINENO :M}G40 G91.1
{LINENO :M}F1
{LINENO :M}M101

[STEP AND REPEAT START]
{LINENO :M}G97

[STEP AND REPEAT END]
{LINENO :M}G98

[VALIDATE PLATE]
IF $VALIDATEPLATE = TRUE
	$X := $INITPTX
	$Y := $INITPTY
	IF $INITPTLOCATION = LOWERLEFT
		$X := $SHEETMAXX
		$Y := $SHEETMAXY
	ELSE
		IF $INITPTLOCATION = LOWERRIGHT
			$X := $SHEETMINX
			$Y := $SHEETMAXY
		ELSE
			IF $INITPTLOCATION = UPPERRIGHT
				$X := $SHEETMINX
				$Y := $SHEETMINY
			ELSE
				$X := $SHEETMAXX
				$Y := $SHEETMINY
			END
		END
	END
	$MOTION := DEFAULT
	$MOTION := {RAPID MOTION CODE}
	{RAPID MOTION}
	IF $INITPTLOCATION = LOWERLEFT
		$X := $SHEETMINX
		$Y := $SHEETMINY
	ELSE
		IF $INITPTLOCATION = LOWERRIGHT
			$X := $SHEETMAXX
			$Y := $SHEETMINY
		ELSE
			IF $INITPTLOCATION = UPPERRIGHT
				$X := $SHEETMAXX
				$Y := $SHEETMAXY
			ELSE
				$X := $SHEETMINX
				$Y := $SHEETMAXY
			END
		END
	END
	{RAPID MOTION}
END

[END OF FILE]
{CANCEL CURRENT OFFSET}
{END OF PROGRAM}

[END OF PROGRAM]
IF $RETURNTOINIT=TRUE
	{LINEAR MOTION TO INIT}
END
M05
M30
IF $KERF_USED = 1
	$KERF_USED := 'NPROMPT($KERF_WARN_MES)
END

[LINEAR MOTION TO INIT]
{LINENO :M}{INIT PT MOTION CODE:M}{RETURNINITPTX}{RETURNINITPTY}

[CANCEL CURRENT OFFSET]
IF $PROCESS=SCRIBE1
	{LINENO :M}M70
END
IF $PROCESS=SCRIBE2
	{LINENO :M}M72
END


[OUTPUT START INTERIOR PROFILE]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CANCEL PREVIOUS OFFSET}
{OUTPUT TORCH SPACING}
{ACTIVATE NEXT OFFSET}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END

[OUTPUT START EXTERIOR PROFILE]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CANCEL PREVIOUS OFFSET}
{OUTPUT TORCH SPACING}
{ACTIVATE NEXT OFFSET}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END

[OUTPUT START OPEN PROFILE]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CANCEL PREVIOUS OFFSET}
{OUTPUT TORCH SPACING}
{ACTIVATE NEXT OFFSET}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END

[OUTPUT START CROP]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CANCEL PREVIOUS OFFSET}
{OUTPUT TORCH SPACING}
{ACTIVATE NEXT OFFSET}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END

[OUTPUT TORCH SPACING]
IF {TORCH SPACING REQUIRED}
	IF $NUMTORCHES = 1 || $NUMTORCHES = 0
		(Set 1 torch.)
		{OUTPUT STOP}
	ELSE
		(Set {NUMTORCHES} torches at {TORCHSPACING}{TORCHUNITS}.)
		{OUTPUT STOP}
	END
END

[OUTPUT END INTERIOR PROFILE]
IF {KERF STILL ON}
	{KERF OFF}
END

[OUTPUT END EXTERIOR PROFILE]
IF {KERF STILL ON}
	{KERF OFF}
END

[OUTPUT END OPEN PROFILE]
IF {KERF STILL ON}
	{KERF OFF}
END

[OUTPUT END CROP]
IF {KERF STILL ON}
	{KERF OFF}
END

[LINENO]
MODAL_ARGUMENT=$LINENUMBER
IF $USELINENUMBERS = EVERYLINE
	{NWORD}
END

[PART NAME COMMENT]
$SAVEPARTNAME := $PARTNAME
$SAVENUM := $PARTSEQUENCENUMBER
IF $SAVENUM != $LASTSAVENUM || $SAVEPARTNAME != $LASTSAVEPARTNAME
	IF $PARTSEQUENCENUMBER > 0
		(Seq {PART SEQUENCE NUMBER} - {PARTNAME})
	ELSE
		({PARTNAME})
	END
END

[PART SEQUENCE NUMBER]
ARGUMENT=$PARTSEQUENCENUMBER
FORMAT=%d

[PARTNAME]
ARGUMENT=$PARTNAME
FORMAT=%s

[CHANGE OFFSETS]
{CANCEL PREVIOUS OFFSET}
{ACTIVATE CURRENT OFFSET}

[CANCEL PREVIOUS OFFSET]
IF $PROCESSONSTATE = TRUE && $PROCESS != $LASTPROCESS
	IF $LASTPROCESS=SCRIBE1
		{LINENO :M}M70
	END
	IF $LASTPROCESS=SCRIBE2
		{LINENO :M}M72
	END
ELSE
	IF $PROCESSONSTATE = FALSE && $PROCESS != $NEXTPROCESS
		{CANCEL CURRENT OFFSET}
	END
END

[ACTIVATE CURRENT OFFSET]
IF $PROCESS != $LASTPROCESS
	IF ($PROCESS=PUNCH1 || $PROCESS=PUNCH2 || $PROCESS=PUNCH3 || $PROCESS=PUNCH4 || $PROCESS=PUNCH5 || $PROCESS=PUNCH6) && $STOPBEFOREPUNCH = TRUE
		{OUTPUT STOP}
	ELSE
		IF ($PROCESS=SCRIBE1 || $PROCESS=SCRIBE2) && $STOPBEFORESCRIBE = TRUE
			{OUTPUT STOP}
		ELSE
			IF ($PROCESS=CUT1 || $PROCESS=CUT2 || $PROCESS=CUT3) && $STOPBEFORECUT = TRUE
				{OUTPUT STOP}
			END
		END
	END
	IF $PROCESS=SCRIBE1
		{LINENO :M}M71
	END
	IF $PROCESS=SCRIBE2
		{LINENO :M}M73
	END
END


[ACTIVATE NEXT OFFSET]
IF $PROCESS != $NEXTPROCESS
	IF ($NEXTPROCESS=PUNCH1 || $NEXTPROCESS=PUNCH2 || $NEXTPROCESS=PUNCH3 || $NEXTPROCESS=PUNCH4 || $NEXTPROCESS=PUNCH5 || $NEXTPROCESS=PUNCH6) && $STOPBEFOREPUNCH = TRUE
		{OUTPUT STOP}
	ELSE
		IF ($NEXTPROCESS=SCRIBE1 || $NEXTPROCESS=SCRIBE2) && $STOPBEFORESCRIBE = TRUE
			{OUTPUT STOP}
		ELSE
			IF ($NEXTPROCESS=CUT1 || $NEXTPROCESS=CUT2 || $NEXTPROCESS=CUT3) && $STOPBEFORECUT = TRUE
				{OUTPUT STOP}
			END
		END
	END
	IF $NEXTPROCESS=SCRIBE1
		{LINENO :M}M71
	END
	IF $NEXTPROCESS=SCRIBE2
		{LINENO :M}M73
	END
END


[PROCESS MOTION CODE]
IF {SURPASSES RAPID THRESHOLD}
	{RAPID MOTION CODE}
ELSE
	{LINEAR MOTION CODE}
END

[PROCESS ON MOTION]
IF {MOTION REQUIRED}
	$MOTION := {PROCESS MOTION CODE}
	IF {SURPASSES RAPID THRESHOLD}
		{RAPID MOTION}
	ELSE
		{LINENO :M}{LINEAR MOTION CODE :M}{CURRENTX :M}{CURRENTY :M}
	END
END

[RAPID MOTION]
{LINENO :M}{RAPID MOTION CODE :M}{CURRENTX :M}{CURRENTY :M}

[LINEAR MOTION]
IF {RAPID MOTION ALLOWED}
	{RAPID MOTION}
ELSE
	{FEEDRATE LINE}
	{ADD KERF VALUE}
	{LINENO :M}{LINEAR MOTION CODE :M}{CURRENTX :M}{CURRENTY :M}
END

[CLOCKWISE MOTION]
IF {ARC TOO SMALL}
	{LINEAR MOTION}
ELSE
	{FEEDRATE LINE}
	{ADD KERF VALUE}
	{LINENO :M}{CLOCKWISE MOTION CODE :M}{CURRENTX :M}{CURRENTY :M}{CURRENTI}{CURRENTJ}
END

[COUNTERCLOCKWISE MOTION]
IF {ARC TOO SMALL}
	{LINEAR MOTION}
ELSE
	{FEEDRATE LINE}
	{ADD KERF VALUE}
	{LINENO :M}{COUNTERCLOCKWISE MOTION CODE :M}{CURRENTX :M}{CURRENTY :M}{CURRENTI}{CURRENTJ}
END

[RAPID MOTION CODE]
MODAL_ARGUMENT=$MOTION
G00

[LINEAR MOTION CODE]
IF {RAPID MOTION ALLOWED}
	{RAPID MOTION CODE}
ELSE
	MODAL_ARGUMENT=$MOTION
	G01
END

[CLOCKWISE MOTION CODE]
IF {ARC TOO SMALL}
	{LINEAR MOTION CODE}
ELSE
	MODAL_ARGUMENT=$MOTION
	G02
END

[COUNTERCLOCKWISE MOTION CODE]
IF {ARC TOO SMALL}
	{LINEAR MOTION CODE}
ELSE
	MODAL_ARGUMENT=$MOTION
	G03
END

[INIT PT MOTION CODE]
IF {RAPID INIT MOTION ALLOWED}
	{RAPID MOTION CODE}
ELSE
	MODAL_ARGUMENT=$MOTION
	G01
END

[ADD FEEDRATE]
IF $NOFEEDRATE=0
	IF $FEEDRATE > 0.0 && $FEEDRATE != $LASTFEEDRATE
		{FEEDRATE :M}
		$FEEDRATE:=$FEEDRATE
	END
END

[FEEDRATE LINE]
IF $NOFEEDRATE=0
	IF $FEEDRATE > 0.0 && $FEEDRATE != $LASTFEEDRATE
		{LINENO :M}{FEEDRATE :M}
		$FEEDRATE:=$FEEDRATE
	END
END

[ADD KERF VALUE]
IF $KERF > 0.0 && $KERF != $LASTKERF
	IF $KERFDIR=LEFT || $KERFDIR=RIGHT
		{KERF DIRECTION}
		$KERF:=$KERF
	END
END

[OUTPUT KERF LEFT]
IF $KERF > 0
	{WARNING KERF}
	$KERF_USED := 1
	$KERF:=$KERF
END

[OUTPUT KERF RIGHT]
IF $KERF > 0
	{WARNING KERF}
	$KERF_USED := 1
	$KERF:=$KERF
END

[WARNING KERF]
{LINENO :M}(Attempt to use G41/G42 command. Please set pre-kerf option in Pronest)

[OUTPUT KERF OFF]
{LINENO :M}G40

[KERF OFF]
{OUTPUT KERF OFF}

[KERF DIRECTION]
IF ($PROCESS != SCRIBE1) && ($PROCESS != SCRIBE2)
	IF $KERFDIR = LEFT
		{OUTPUT KERF LEFT}
	END
	IF $KERFDIR = RIGHT
		{OUTPUT KERF RIGHT}
	END
	IF $KERFDIR = OFF
		{OUTPUT KERF OFF}
	END
END

[OUTPUT STOP]
{LINENO :M}M00

[OUTPUT AHCON]
IF $REG_STATE = 0
	$REG_STATE := 1
	{LINENO :M}M104
END

[OUTPUT AHCOFF]
IF $REG_STATE = 1
	$REG_STATE := 0
	{LINENO :M}M103
END

[OUTPUT CUT2 ON]
{LINENO :M}M03
IF $ISLEADIN = 1
	{OUTPUT AHCOFF}
END
{FEEDRATE LINE}

[OUTPUT CUT2 OFF]
{OUTPUT AHCON}
{LINENO :M}M05
$KERF:=0.0
$FEEDRATE:=0.0

[OUTPUT CUT2 OFFUP]
{OUTPUT AHCON}
{LINENO :M}M05
$KERF:=0.0
$FEEDRATE:=0.0

[OUTPUT SCRIBE1 ON]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CHANGE OFFSETS}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END
{LINENO :M}M08

[OUTPUT SCRIBE1 OFF]
{LINENO :M}M07
$KERF:=0.0
$FEEDRATE:=0.0

[OUTPUT SCRIBE2 ON]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CHANGE OFFSETS}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END
{LINENO :M}M10

[OUTPUT SCRIBE2 OFF]
{LINENO :M}M09
$KERF:=0.0
$FEEDRATE:=0.0

[OUTPUT PUNCH1 ON]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CHANGE OFFSETS}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END
{LINENO :M}M08
{LINENO :M}G04F0.5
{LINENO :M}M07
$KERF:=0.0
$FEEDRATE:=0.0

[OUTPUT PUNCH2 ON]
IF $USELINENUMBERS = STARTOFPROFILE
	{NWORD}
END
{CHANGE OFFSETS}
{PROCESS ON MOTION}
IF $PARTNAMEASCOMMENT = TRUE
	{PART NAME COMMENT}
END
{LINENO :M}M10
{LINENO :M}G04F0.5
{LINENO :M}M09
$KERF:=0.0
$FEEDRATE:=0.0

[COMMENT FORMAT]
(%s)

[FORMAT PART OF THE CFF]


[INITPTX]
ARGUMENT=($INITPTX - $INITPTX) * $CONVERSION
FORMAT=X%1.2lf

[INITPTY]
ARGUMENT=($INITPTY - $INITPTY) * $CONVERSION
FORMAT=Y%1.2lf

[CONVERSION]
IF $UNITS=INCH
	1.00
ELSE
	25.40
END

[RETURNINITPTX]
IF $MODE=ABSOLUTE
	ARGUMENT=($INITPTX-$INITPTX) * $CONVERSION * $XYIJDECIMALSHIFT
ELSE
	ARGUMENT=($INITPTX - $X) * $CONVERSION * $XYIJDECIMALSHIFT
END
FORMAT=X{XY FORMAT}

[RETURNINITPTY]
IF $MODE=ABSOLUTE
	ARGUMENT=($INITPTY-$INITPTY) * $CONVERSION * $XYIJDECIMALSHIFT
ELSE
	ARGUMENT=($INITPTY - $Y) * $CONVERSION * $XYIJDECIMALSHIFT
END
FORMAT=Y{XY FORMAT}

[NWORD]
FORMAT=N%01d
ARGUMENT=$LINENUMBER

[NUMTORCHES]
ARGUMENT=$NUMTORCHES
FORMAT=%d

[TORCHSPACING]
ARGUMENT=$TORCHSPACING * $CONVERSION
FORMAT=%1.3lf

[TORCHUNITS]
IF $UNITS = INCH
	in
ELSE
	mm
END

[XY FORMAT]
IF $PRECISION=NORMAL
	%1.2lf
ELSE
	%1.3lf
END

[IJ FORMAT]
IF $PRECISION=NORMAL
	%1.2lf
ELSE
	%1.3lf
END

[FEEDRATE FORMAT]
IF $UNITS=INCH
	%1.1lf
ELSE
	%1.0lf
END

[DWELL FORMAT]
%1.2lf

[XYIJ DECIMAL SHIFT]
1

[FEEDRATE DECIMAL SHIFT]
1

[KERF DECIMAL SHIFT]
1

[DWELL DECIMAL SHIFT]
1

[ANGLE DECIMAL SHIFT]
0

[CURRENTX]
MODAL_ARGUMENT=$X
IF $MODE=ABSOLUTE
	ARGUMENT=($X - $INITPTX) * $CONVERSION * $XYIJDECIMALSHIFT
ELSE
	ARGUMENT=($X - $LASTX) * $CONVERSION * $XYIJDECIMALSHIFT
END
FORMAT=X{XY FORMAT}

[CURRENTY]
MODAL_ARGUMENT=$Y
IF $MODE=ABSOLUTE
	ARGUMENT=($Y - $INITPTY) * $CONVERSION * $XYIJDECIMALSHIFT
ELSE
	ARGUMENT=($Y - $LASTY) * $CONVERSION * $XYIJDECIMALSHIFT
END
FORMAT=Y{XY FORMAT}

[CURRENTI]
ARGUMENT=($I - $LASTX) * $CONVERSION * $XYIJDECIMALSHIFT
FORMAT=I{IJ FORMAT}

[CURRENTJ]
ARGUMENT=($J - $LASTY) * $CONVERSION * $XYIJDECIMALSHIFT
FORMAT=J{IJ FORMAT}


[FEEDRATE]
MODAL_ARGUMENT=$FEEDRATE
ARGUMENT=$FEEDRATE * $CONVERSION * $FEEDRATEDECIMALSHIFT
FORMAT=F{FEEDRATE FORMAT}

[KERF VALUE]
MODAL_ARGUMENT=$KERF
ARGUMENT=$KERF * $CONVERSION * $KERFDECIMALSHIFT
FORMAT=K%1.3f

[OUTPUT DWELL]
ARGUMENT=$DWELL * $DWELLDECIMALSHIFT
FORMAT={LINENO :M}G04F{DWELL FORMAT}

[CONDITIONS PART OF THE CFF]


[MAXLINENO]
9999

[TORCH SPACING REQUIRED]
($TORCHSPACING != $PREVTORCHSPACING || $NUMTORCHES != $PREVNUMTORCHES)

[KERF STILL ON]
$KERFDIR = LEFT || $KERFDIR = RIGHT

[MOTION REQUIRED]
(($X - $LASTX)^2 + ($Y - $LASTY)^2)^0.5 > 0.00001

[RAPID MOTION ALLOWED]
{SURPASSES RAPID THRESHOLD} && $PROCESSONSTATE = FALSE

[SURPASSES RAPID THRESHOLD]
(($X - $LASTX)^2 + ($Y - $LASTY)^2)^0.5 > $RAPIDDISTANCE

[ARC TOO SMALL]
{ARC RADIUS} < 0.010000 || ({CHORD LENGTH} > 0.01 && {CHORD LENGTH} < 0.011000 && $ARCANGLE < 180)

[RAPID INIT MOTION ALLOWED]
(($X - $INITPTX)^2 + ($Y - $INITPTY)^2)^0.5 > $RAPIDDISTANCE && $PROCESSONSTATE = FALSE

[ARC RADIUS]
(($I - $LASTX)^2 + ($J - $LASTY)^2)^0.5

[CHORD LENGTH]
(($X - $LASTX)^2 + ($Y - $LASTY)^2)^0.5

[START LEADIN]
$ISLEADIN := 1
{OUTPUT AHCOFF}

[END LEADIN]
$ISLEADIN := 0
{OUTPUT AHCON}

[START LEADOUT]
{OUTPUT AHCOFF}

[END LEADOUT]
{OUTPUT AHCON}


[USER DEFINED VARIABLES]
SAVEPARTNAME|STRING|0
SAVENUM|INTEGER|0
RAPIDDISTANCE|DOUBLE|0.0100
DX|DOUBLE|0.0
DY|DOUBLE|0.0
KERF|DOUBLE|0.0
FEEDRATE|DOUBLE|0.0
NOFEEDRATE|INTEGER|0
NOPROBING|INTEGER|0
ISLEADIN|INTEGER|0
KERF_USED|INTEGER|0
KERF_WARN_MES|STRING|G41/G42 commands can not be used. Please set Job -> Settings -> CNC Output -> Options -> Pre-kerf option in Pronest
REG_STATE|INTEGER|1