LOCAL bitOffsetXstart, bitX, bitY, btZ; LOCAL Xfactor, Yfactor, Zfactor; LOCAL stockWidth, stockHeight, stockStep; LOCAL patternHeight, patternHeightPosition, patternHeightStep; LOCAL xmin, functionWidth, xmax, ymin, functionHeight, ymax; LOCAL fxy, level, minFxy, maxFxy, range, rangeFactor, x, y; FN(fX, fY) BEGIN LOCAL retval; retval := 2 * (COS(fX*fY) * SIN(fY*fX)) + 1; RETURN retval; END; AddToList(iListNumber, iListIndex, lineOfCode) BEGIN CASE IF iListNumber == 0 THEN L0(iListIndex) := lineOfCode END; IF iListNumber == 1 THEN L1(iListIndex) := lineOfCode END; IF iListNumber == 2 THEN L2(iListIndex) := lineOfCode END; IF iListNumber == 3 THEN L3(iListIndex) := lineOfCode END; IF iListNumber == 4 THEN L4(iListIndex) := lineOfCode END; IF iListNumber == 5 THEN L5(iListIndex) := lineOfCode END; IF iListNumber == 6 THEN L6(iListIndex) := lineOfCode END; IF iListNumber == 7 THEN L7(iListIndex) := lineOfCode END; IF iListNumber == 8 THEN L8(iListIndex) := lineOfCode END; DEFAULT L9(iListIndex) := lineOfCode; END; RETURN iListIndex + 1; END; WriteColumnDown(iListNumber, iListIndex, X) BEGIN LOCAL bitZ, lineOfCode, Zlimited; lineOfCode := "X" + STRING(X, 6, 4) + "|"; FOR Y FROM stockHeight + 2 * stockStep DOWNTO -2 * stockStep STEP stockStep DO bitZ := FN(xmin + X * Xfactor, ymin + Y * Yfactor) * Zfactor; Zlimited := MIN(ROUND(bitZ, 4), patternHeightPosition); lineOfCode := lineOfCode + "Y" + STRING(Y, 6, 4) + " Z-" + STRING(Zlimited, 6, 4) + "|"; END; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); RETURN iListIndex; END; WriteColumnUp(iListNumber, iListIndex, X) BEGIN LOCAL bitZ, lineOfCode, Zlimited; lineOfCode := "X" + STRING(X, 6, 4) + "|"; FOR Y FROM -2 * stockStep TO stockHeight + 2 * stockStep STEP stockStep DO bitZ := FN(xmin + X * Xfactor, ymin + Y * Yfactor) * Zfactor; Zlimited := MIN(ROUND(bitZ, 4), patternHeightPosition); lineOfCode := lineOfCode + "Y" + STRING(Y, 6, 4) + " Z-" + STRING(Zlimited, 6, 4) + "|"; END; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); RETURN iListIndex; END; WriteRowLeft(iListNumber, iListIndex, Y) BEGIN LOCAL bitZ, lineOfCode; lineOfCode := "Y" + STRING(Y, 6, 4) + "|"; FOR X FROM stockWidth + 2 * stockStep DOWNTO -2 * stockStep STEP stockStep DO bitZ := FN(xmin + X * Xfactor, ymin + Y * Yfactor) * Zfactor; lineOfCode := lineOfCode + "X" + STRING(X, 6, 4) + " Z-" + STRING(ROUND(bitZ, 4), 6, 4) + "|"; END; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); RETURN iListIndex; END; WriteRowRight(iListNumber, iListIndex, Y) BEGIN LOCAL bitZ, lineOfCode; lineOfCode := "Y" + STRING(Y, 6, 4) + "|"; FOR X FROM - 2 * stockStep TO stockWidth + 2 * stockStep STEP stockStep DO bitZ := FN(xmin + X * Xfactor, ymin + Y * Yfactor) * Zfactor; lineOfCode := lineOfCode + "X" + STRING(X, 6, 4) + " Z-" + STRING(ROUND(bitZ, 4), 6, 4) + "|"; END; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); RETURN iListIndex; END; EXPORT GCODEFN() BEGIN LOCAL iListIndex, iListNumber, lineOfCode; {"%|( L0 )|G40G49G80G90G17|M08|G04 P1"} > L0; {"%|( L1 )|G40G49G80G90G17|M08|G04 P1"} > L1; {"%|( L2 )|G40G49G80G90G17|M08|G04 P1"} > L2; {"%|( L3 )|G40G49G80G90G17|M08|G04 P1"} ? L3; {"%|( L4 )|G40G49G80G90G17|M08|G04 P1"} ? L4; {"%|( L5 )|G40G49G80G90G17|M08|G04 P1"} ? L5; {"%|( L6 )|G40G49G80G90G17|M08|G04 P1"} ? L6; {"%|( L7 )|G40G49G80G90G17|M08|G04 P1"} ? L7; {"%|( L8 )|G40G49G80G90G17|M08|G04 P1"} ? L8; {"%|( L9 )|G40G49G80G90G17|M08|G04 P1"} ? L9; functionHeight := 5; functionWidth := 5 * 320 / 240; xmin := -functionWidth / 2; xmax := xmin + functionWidth; ymin := -functionHeight / 2; ymax := ymin + functionHeight; stockWidth := 1.33; stockHeight := 1.0; stockStep := 0.008; patternHeightPosition = 0; patternHeight := .120; patternHeightStep := .12; // Find function range Xfactor := functionWidth / 320; Yfactor := functionHeight / 240; maxFxy := -99999; minFxy := 99999; FOR X FROM 0 TO 319 DO x := xmin + X * Xfactor; FOR Y FROM 0 TO 239 DO y := ymin + Y * Yfactor; fxy := FN(x, y); maxFxy := MAX(maxFxy, fxy); minFxy := MIN(minFxy, fxy); END; END; range := maxFxy - minFxy; // Set scaling factors for gcode Xfactor := functionWidth / stockWidth; Yfactor := functionHeight / stockHeight; Zfactor := patternHeight / range; // Generate G code iListNumber := 0; patternHeightPosition := patternHeightStep; WHILE patternHeightPosition <= patternHeight DO iListIndex := 2; lineOfCode := "G00 X" + STRING(-2 * stockStep, 6, 3) + " Y" + STRING(-2 * stockStep, 6, 3) + " Z0.1"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); btZ := FN(Xmin, Ymin) * Zfactor; lineOfCode := "G01 Z-" + STRING(btZ, 6, 3) + " F8"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); // Machine pattern vertically in stock coordinates FOR X FROM -2 * stockStep TO stockWidth + 2 * stockStep STEP stockStep DO iListIndex := WriteColumnUp(iListNumber, iListIndex, X); iListIndex := WriteColumnDown(iListNumber, iListIndex, X + stockStep); END; // Retract spindle to safe height, write end of file lineOfCode := "G00 Z0.1|M09|M02|%|"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); // Prep for next layer patternHeightPosition := MAX(patternHeightPosition + patternHeightStep, patternHeight); // Index to next list iListNumber := iListNumber + 1; END; // Machine pattern horizontally iListIndex := 2; lineOfCode := "G00 X0 Y0 Z0.1"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); btZ := FN(0, 0) * Zfactor; lineOfCode := "G01 Z-" + STRING(btZ, 6, 3) + " F8"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); FOR Y FROM 0 TO stockHeight STEP stockStep DO iListIndex := WriteRowRight(iListNumber, iListIndex, Y); iListIndex := WriteRowLeft(iListNumber, iListIndex, Y + stockStep); END; // Retract spindle, write end of file lineOfCode := "G00 Z03|M09|M02|%|"; iListIndex := AddToList(iListNumber, iListIndex, lineOfCode); END;