
/* Definition of system variables and macros */

_EditorLang0 = "scall";
_EditorLang1 = "DinSCall";
_EditorLang2 = "IselSCall";

ConfigEdit "WRITE";	/* der zu verwendende externe Editor */

PI = 3.14159265358979323846;

(MacroDef "_fmtCoord") = "sprint \"%.2lf\" %1 + 0.0";
(MacroDef "_fmtSpeed") = "sprint \"%.1lf\" %1 + 0.0";
(MacroDef "_fmtFac") = "sprint \"%.4lf\" %1 + 0.0";
(MacroDef "_fmtI16") = "sprint \"%d\" %1 + 0L";
(MacroDef "_fmtI32") = "sprint \"%dL\" %1 + 0L";
(MacroDef "_fmtHex") = "sprint \"0x%.8XL\" %1 + 0L";
_fdspCoord = "%9.3lf";
_fdspInt = "%9.0lf";

/* speed and acceleration for positioning: Defaults */
_drvPosiSpeedMax = 20.0;
_drvPosiAccelMax = 200.0;
MvPar;			/* Apply */

_StopFlag = 0;
_KeyCode = 0; _AllowManStep = 0;
(MacroDef "_RefTest") = "('1' == Mlimit '?') + ('1' == Mtest '?');";
(MacroDef "_PrgExec") =
"_octMinMax_stat = 0;
 if(%1 == 1){fCall %2;};
 if(%1 == 2){dinCall %2;};
 if(%1 == 3){hpglCall %2;};
 if(%1 == 10){iselCall %2;};
 if(%1 >= 100){vhfCall %2 %4 %5 %6;}";
(MacroDef "_PrgDraw") = 
"_octMinMax_stat = 1; _octMinMax_sflag = 3;
 if(%1 == 1){fCall %2;};
 if(%1 == 2){dinCall %2;};
 if(%1 == 3){hpglCall %2;};
 if(%1 == 10){iselCall %2;};
 if(%1 >= 100){vhfCall %2 %4 %5 %6;}";
(MacroDef "_PrgOn") = "local \"i\"; i = 1; for 8{
 if((0 != 4 and _oMode[i]) and (0 != _oStatPrv[i])){_oSet i 1;} i = i + 1;
}";
(MacroDef "_PrgOff") = "local \"i\"; i = 1; for 8{if(4 and _oMode[i]){_oSet i 0;} i = i + 1;}";
(MacroDef "_PrgStart") = "rmpMode 'A'; fcall _path & \"/IoStat.ts\"; _PrgOn;";
(MacroDef "_PrgEnd") = "rmpMode 'Y'; _PrgOff; MtransFlag01 = _vciFlag01 = _g3sFlag01 = '1';";
(MacroDef "_PrgStop") = "_vciStop = _vciCurr - Mstat; _oStatPrv = _oStat; _PrgOff;";
(MacroDef "_PrgCont") = "_PrgOn;";
(MacroDef "_PrgAbort") = 
"_vciCurr = _vciCurr - Mstat; mreset; Mstop '0'; _StopFlag = 1; _PrgEnd; mreset 1;";

_vciStop = 0L;
(MacroDef "_vciGotoStart") = "_PrgStart; _dspUpdate;
	_mt0; _mtX; _mode = 'X';
	_ocxNext[2] = zup; mxf;
	_ocxNext[0] = _vciOcStart[0]; _ocxNext[1] = _vciOcStart[1]; mxf;
	_ocxNext[2] = _vciOcStart[2]; mxl;";
(MacroDef "_vciLeaveEnd") = 
	"wait 0; mreset; _ocxNext[2] = zup; mxf; wait 0; _PrgEnd; _dspUpdate;";

_autoDraw = 0;  /* show graphic automatically after file open */
_autoClear = 1; /* clear screen automatically before showing new graphic */
ML_Color = 0L;	/* current color for displaying ml, mld (G01) */

(MacroDef "_MouseMoveXY") = 
"MtransFlag01 = '0'; mreset;
 if(getoc[2] < zup){z zup; mf;} x %1; y %2; mf;
 MtransFlag01 = '1'; wait 0;";

/* control HPGL Units: HpglUnitFlag < 0: Set in Autoexec.ts */
HpglUnitFlag = 0;

/* Preset IO descriptors */
_o1 = _o2 = _o3 = _o4 = _o5 = _o6 = _o7 = _o8 = "";
_i1 = _i2 = _i3 = _i4 = _i5 = _i6 = _i7 = _i8 = "";

/* Beschriftung der Ein-/Ausgänge 1-8 */
_i0Label = "Eingänge";
_i1Label = _i2Label = _i3Label = _i4Label = _i5Label = _i6Label = _i7Label = _i8Label = "";
_o0Label = "Ausgänge";
_o1Label = _o2Label = _o3Label = _o4Label = _o5Label = _o6Label = _o7Label = _o8Label = "";

/* Tabelle der aktuellen Ausgangs-Zustände */
_oStat = ARY 33 0;

/* Modus-Tabelle für Ausgänge: */
/* Bit 0=0: über _o... Deskriptor, nicht invertierend */
/* Bit 0=1: über _o... Deskriptor, invertierend */
/* Bit 1=1: Sondermakro _oSet.. %1 aufrufen, Parameter = Zustand 0 oder 1
  Falls z.B. _oMode[7] = 2, muss Makro _oSet7 definiert sein. */
/* Bit 2=1: Bei Stop / Progr.Ende autom. ausschalten */
_oMode = ARY 33 0;

/* Modus-Tabelle für Eingänge: */
/* 0: über _o... Deskriptor, nicht invertierend */
/* 1: über _o... Deskriptor, invertierend */
/* 2: über Sondermakro _iGet..
  Falls z.B. _iMode[7] = 2, muss Makro _iGet7 definiert sein. */
_iMode = ARY 33 0;

/* Beispiel Ausg. 5 setzen:	_oSet 5 1; */
/* Beispiel Ausg. 2 rücksetzen:	_oSet 2 0; */
/* Beispiel Eing. 4 lesen: 	print _iGet 4; */

(MacroDef "_oSet") =
"local \"stPrv\";
 stPrv = _oStat[%1];
 if(%2 == -1){_oStat[%1] = 1 - _oStat[%1];} if(%2 != -1){_oStat[%1] = %2;}
 if(_oStat[%1])
 {
  if(_oMode[%1] and 2){scall sprint \"_oSet%hd 1;\" %1;}
  if(0 == _oMode[%1] and 2){scall sprint \"out _o%hd 255 + _oMode[%%1] and 1;\" %1;}
 }
 if(_oStat[%1] == 0)
 {
  if(_oMode[%1] and 2){scall sprint \"_oSet%hd 0;\" %1;}
  if(0 == _oMode[%1] and 2){scall sprint \"out _o%hd 256 - _oMode[%%1] and 1;\" %1;}
 }
";

(MacroDef "_iGet") = 
"local \"i\";
 if(_iMode[%1] and 2){i = scall sprint \"_iGet%hd;\" %1;}
 if(0 == _iMode[%1] and 2){i = scall sprint \"_iMode[%%1] != 0 != in _i%hd;\" %1;}
i + 0;";

/* Macros for circle and rectangle */
(MacroDef "MCirc") = "z zup; mf; x %1 + %3; y %2; mf; z zdn; mld;
 x %1 - %3; mc %3 \"+LZ\" %3; x %1 + %3; mc; z zup; mf;";
(MacroDef "MRect") = "z zup; mf; x %1 + %3 / 2; y %2 - %4 / 2; mf; z zdn; mld;
 y %2 + %4 / 2;ml; x %1 - %3 / 2;ml; y %2 - %4 / 2;ml; x %1 + %3 / 2;ml;  z zup; mf;";

/* Macro for cross (graphic only) */
(MacroDef "DrawCross") = 
"local \"d\" \"nc\" \"gr\"; d = %3 / 2.0;
 nc = _ncMode; gr = _grMode;
 _ncMode = 0; _grMode = 1;
 MtransFlag01 = '0';
 x %1 - d; y %2; _grMode = 0; mf; _grMode = 1;
 x %1 + d; ml;
 x %1; y %2 - d; _grMode = 0; mf; _grMode = 1;
 y %2 + d; ml;
 _ncMode = nc; _grMode = gr;
 MtransFlag01 = '1';";

_demo = 0;

(MacroDef "ToolRad") = "(ToolPar \"rad\")[ToolPar \"curr\"] + 0.0;";
_ToolAuto = 0;	/* no tool change as default */
(Macrodef "_ToolOpen") = "";
(Macrodef "_ToolClose") = "";

(MacroDef "_SetOvr") = "SetOvr _Ovr = %1;"; _Ovr = 100;
_oStatPrv = _oStat  = ARY 9 0;
_oaValueMin = 0L; _oaValueMax = 20000L; _oaValue = _oaValueMin;
(MacroDef "_oaSet") = "_oaValue = %1;";
(MacroDef "_cmdSps") = (MacroDef "_cmdSps2") = "";
(MacroDef "_MotOn") = (MacroDef "_MotOff") = "";
(MacroDef "_MotOffErr") = "_MotOff";
(MacroDef "_doorOpen") = "0;";

(Macrodef "_cmdZLevel") = "";

(MacroDef "_g3Push") = 
"_p0 = _ocNext;
 SetDrawPar 'L' %1 -1 -1 -1;
 _g3mmStat = _octMinMax_stat; _octMinMax_stat = 0;";
(MacroDef "_g3Pop") = 
"_ocNext = _p0;
 SetDrawPar 'L' ML_Color -1 -1 -1; MvPar;
 _grMode = 0; ml; _grMode = 1; mf;
 _octMinMax_stat = _g3mmStat;";

/* Draw range limits for x, y, z */
(MacroDef "_drawLim") = 
"if('1' == Mlimit '?'){
  local \"min\" \"max\";
  local \"nc\" \"gr\" \"_g3mmStat\";
  nc = _ncMode; gr = _grMode;
  _ncMode = 0; _grMode = 1;
  _g3Push %1; 
  MtransFlag01 = '0';
  min = (getCoord 'l') - getOcToMc;
  max = (getCoord 'L') - getOcToMc;
  x min[0]; y min[1]; z min[2]; _grMode = 0; ml; _grMode = 1;
  x max[0]; ml; y max[1]; ml;
  x min[0]; ml; y min[1]; ml;
  x min[0]; y min[1]; z max[2]; _grMode = 0; ml; _grMode = 1;
  x max[0]; ml; y max[1]; ml;
  x min[0]; ml; y min[1]; ml;
  x min[0]; y min[1]; z min[2]; _grMode = 0; ml; _grMode = 1;
  z max[2]; ml;
  x max[0]; y min[1]; z min[2]; _grMode = 0; ml; _grMode = 1;
  z max[2]; ml;
  x max[0]; y max[1]; z min[2]; _grMode = 0; ml; _grMode = 1;
  z max[2]; ml;
  x min[0]; y max[1]; z min[2]; _grMode = 0; ml; _grMode = 1;
  z max[2]; ml;
  _g3Pop;
  _ncMode = nc; _grMode = gr;
  MtransFlag01 = '1';
  mreset;
 }
";

/* {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ Automatischer Z-Höhenausgleich */
if(options "bikub")
{
/* dafür sorgen, dass der Treiber die aktuelle Mc-Position ständig aktualisiert */
_drvJogFlag01S = '1';
_drvJogAmask = 0;
_drvJogSet;

ofsX = 0.0;	/* Offset Messtaster-Werkzeug in X, Y */
ofsY = 0.0;

_ofs = GetOcToMc;
(MacroDef "SetZofs") = 
"if(Mstat 'E'){
  Mreset;
  setOcToMc ARY 6 (_ofs[0]) (_ofs[1])
   (_ofs[2] + Msp2GetZ (getmc[0] - _ofs[0]) (getmc[1] - _ofs[1]));
  _MotOn; Mreset \"Vor 'Istkoord. Setzen' Z-Höhenkorrektur ausschalten!\";
  }
 MoveOcToMc ARY 6 (_ofs[0]) (_ofs[1]) 
 (_ofs[2] + Msp2GetZ (getoc[0])  (getoc[1]));
";
(MacroDef "GetZofs") = "Msp2GetZ (getoc[0] - ofsX)  (getoc[1] - ofsY);";

_o8Label = "Z-Höhenkorr.";
_oMode[8] = 2;
/* Höhenausgleich aktivieren mit Software-Schalter 8 */
(Macrodef "_oSet8") = 
"if(%1){fcall _Path & \"/ZLevel/Data.t\"; _drawZlevel; _ofs = GetOcToMc; (Macrodef \"_cmdZLevel\") = \"SetZofs;\";}
 if((0 == %1) and stPrv){(Macrodef \"_cmdZLevel\") = \"\"; MoveOcToMc _ofs;}
";

/* Datenfelder _Msp2Px,y definieren */
(Macrodef "_Msp2PxyGet") = 
"local \"dx\" \"dy\" \"ix\" \"iy\";
 dx = (_Msp2P1[0] - _Msp2P0[0]) / (_Msp2Nx - 1);
 dy = (_Msp2P1[1] - _Msp2P0[1]) / (_Msp2Ny - 1);
 ix = 0;
 for _Msp2Nx {
  _Msp2Px[ix] = _Msp2P0[0] + ix * dx;
  ix = ix + 1;
 }
 iy = 0;
 for _Msp2Ny {
  _Msp2Py[iy] = _Msp2P0[1] + iy * dy;
  iy = iy + 1;
 }";

/* Zum Anzeigen des ZLevel-Bereichs */
(Macrodef "_drawZlevel") = 
"_vciFlag01 = '0'; _g3sFlag01 = '0';
 local \"nc\" \"gr\" \"ix\" \"iy\";
 nc = _ncMode; gr = _grMode;
 _ncMode = 0; _grMode = 1;
 _g3Push 0x80A0C0L;
 MtransFlag01 = '0';
 ix = 0; for _Msp2Nx{
  x _Msp2Px[ix]; y _Msp2Py[0]; _grMode = 0; ml; y _Msp2Py[_Msp2Ny - 1]; _grMode = 1; ml;
  ix = ix + 1;
 }
 iy = 0; for _Msp2Ny{
  x _Msp2Px[0]; y _Msp2Py[iy]; _grMode = 0; ml; x _Msp2Px[_Msp2Nx - 1]; _grMode = 1; ml;
  iy = iy + 1;
 }
 MtransFlag01 = '1';
 _g3Pop;
 _ncMode = nc; _grMode = gr;
 mreset;
 _vciFlag01 = '1'; _g3sFlag01 = '1';";

/* ggf. Korrekturbereich in jeder Grafik mit anzeigen */
(MacroDef "_PrgDraw") = "if(0 != (Macrodef \"_cmdZLevel\")[0]){_drawZlevel;}" & (MacroDef "_PrgDraw");
}
/* Automatischer Z-Höhenausgleich }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} */

/* {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ Spline-Macros */
_MspDim = 4;
MspDist = 2.5;
(MacroDef "MspInit") = "_MspN = 0;";
_MOpen = 0;
(MacroDef "MOpen") = "_MOpen = 1;";	/* Befehl für "Neue Kurve beginnen" */
_MClose = 0;
(MacroDef "MClose") = "_MClose = 1;";	/* Befehl für "Kurve abschließen" */
(MacroDef "MspAdd") =
	"_MspCrv[_MspDim * _MspN] = %1;
	_MspCrv[1 + _MspDim * _MspN] = %2;
	_MspCrv[2 + _MspDim * _MspN] = %3;
	_MspCrv[3 + _MspDim * _MspN] = %4;
	_MspN = _MspN + 1;";
(MacroDef "MspExec") = 
	"MspInterpol;
	_t = 0.0;
	if(_MOpen){_MspCarry = %1;}
	_p = MspGet _t _MspCarry;

	if(_MOpen){
	 wait 0; X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; mf;
	 _Mopen = 0;
	}

	while \"_t < _MspN - 1\" {
	 _p = MspGet _t %1;
	 X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; ml;

	 if(_mode == 'G') {
	  _g3Push 0x808080L;
	  MspDrPt (_p[0]) (_p[1]) 0.3;
	  _g3Pop;
	 }
	}
	if(_MClose){
	 _p = MspGet _t;
	 X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; ml; wait 0;
	 _MClose = 0;
	}
	if(_mode == 'G') {_t = 0.0;
	  _g3Push 0xFF0000L;
	  for(_MspN) {
	   _p = MspGet _t;
	   _X = _p[0]; _Y = _p[1];
	   MspDrPt (_p[0]) (_p[1]) 0.4;
	   _t = _t + 1;}
	  _g3Pop;}
	";
(MacroDef "MspDrPt") = 
"_grMode = 0; x %1 + %3; y %2;  ml;
_grMode = 1;
x  %1 - %3;  mc %3 \"+RZ\";
x  %1 + %3;  mc;
";
(MacroDef "Goto") = "X %1; Y %2; mf;";
/* Spline-Macros }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} */

/* {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ Kreisbogen-Macros */
(MacroDef "McirExec") = 
	"McirInterpol;
	_t = 0.0;
	if(_MOpen){_MspCarry = %1;}
	_p = McirGet _t _MspCarry;

	if(_MOpen){
	 wait 0; X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; mf;
	 _MOpen = 0;
	}

	while \"_t < 1.0\" {
	 _p = McirGet _t %1;
	 X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; ml;

	 if(_mode == 'G') {
	  _g3Push 0x808080L;
	  MspDrPt (_p[0]) (_p[1]) 0.3;
	  _g3Pop;
	 }
	}
	if(_MClose){
	 _p = McirGet _t;
	 X _p[0]; Y _p[1]; Z _p[2]; A _p[3]; ml; wait 0;
	 _MClose = 0;
	}
	if(_mode == 'G') {
	  _g3Push 0xFF0000L;
	  MspDrPt (_MspCrv[0]) (_MspCrv[1]) 0.4;
	  MspDrPt (_MspCrv[_MspDim]) (_MspCrv[1 + _MspDim]) 0.4;
	  MspDrPt (_MspCrv[2 * _MspDim]) (_MspCrv[1 + 2 * _MspDim]) 0.4;
	  _g3Pop;
	}
	";
/* Kreisbogen-Macros }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} */

/* ------------------------------ Beschriftung */
wrOn = "z zdn; ml;";	/* Pen Down */
wrOff = "z zup; mf;";	/* Pen Up */
wrDlyStop = 0.0;	/* Stop-Delay */
