Advertisement
Guest User

gcode.pas

a guest
Aug 17th, 2013
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.12 KB | None | 0 0
  1. Uses Classes, SysUtils, StrUtils;
  2.  
  3. Type
  4.     TCode = Record
  5.         fCmd,
  6.         fParam : String;
  7.     End;
  8.  
  9.     TCoord = Record
  10.         X, Y, Z : Real;
  11.     End;
  12.     TCoordArray = Array Of TCoord;
  13.  
  14. Const
  15.     ccNullCode : TCode = (fCmd : ''; fParam : '');
  16.  
  17. Var
  18.     gInputFile,
  19.     gOutputFile : TStringList;
  20.     gCoords : TCoordArray;
  21.     gLastX,
  22.     gLastY,
  23.     gLastZ: Real;
  24.     gScaleFactor : Real;
  25.     gCurrentZ : Integer;
  26.  
  27. Function IsAlpha(Const aChar : Char): Boolean;
  28. Begin
  29.     Result := aChar In ['a'..'z', 'A'..'Z'];
  30. End;
  31.  
  32. Function IsNumber(Const aChar : Char): Boolean;
  33. Begin
  34.     Result := aChar In ['0'..'9', '.', '-'];
  35. End;
  36.  
  37. Function GetAlpha(Var aString: String): String;
  38. Var
  39.     lDigit : Char;
  40. Begin
  41.     Result := '';
  42.     If aString <> '' Then
  43.     Begin
  44.         lDigit := aString[1];
  45.         If IsAlpha(lDigit) Then
  46.         Begin
  47.             Delete(aString, 1, 1);
  48.             Result := '' + lDigit;
  49.         End;
  50.     End;
  51. End;
  52.  
  53. Function GetNumber(Var aString: String): String;
  54. Var
  55.     lDigit : Char;
  56. Begin
  57.     Result := '';
  58.     If aString <> '' Then
  59.     Begin
  60.         lDigit := aString[1];
  61.         If IsNumber(lDigit) Then
  62.             While (IsNumber(lDigit)) And (aString <> '') Do
  63.             Begin
  64.                 Delete(aString, 1, 1);
  65.                 Result := Result + lDigit;
  66.                 If aString <> '' Then
  67.                     lDigit := aString[1];
  68.             End;
  69.     End;
  70. End;
  71.  
  72. Function GetNextParam(Var aString : String): TCode;
  73. Begin
  74.     Result := ccNullCode;
  75.     If aString <> '' Then
  76.         If IsAlpha(aString[1]) Then
  77.         Begin
  78.             Result.fCmd := GetAlpha(aString);
  79.             Result.fParam := GetNumber(aString);
  80.         End;
  81. End;
  82.  
  83. Function ParseParamsXYZ(Var aString : String): TCoord;
  84. Var
  85.     lCode : TCode;
  86.     lHasX, lHasY, lHasZ : Boolean;
  87. Begin
  88.     lHasX := False;
  89.     lHasY := False;
  90.     lHasZ := False;
  91.     While (aString <> '') Do
  92.     Begin
  93.         lCode := GetNextParam(aString);
  94.         If lCode.fCmd = 'X' Then
  95.         Begin
  96.             lHasX := True;
  97.             Result.X := StrToFloat(lCode.fParam);
  98.         End;
  99.         If lCode.fCmd = 'Y' Then
  100.         Begin
  101.             lHasY := True;
  102.             Result.Y := StrToFloat(lCode.fParam);
  103.         End;
  104.         If lCode.fCmd = 'Z' Then
  105.         Begin
  106.             lHasZ := True;
  107.             Result.Z := StrToFloat(lCode.fParam);
  108.         End;
  109.     End;
  110.     If Not lHasX Then
  111.         Result.X := gLastX;
  112.     If Not lHasY Then
  113.         Result.Y := gLastY;
  114.     If Not lHasZ Then
  115.         Result.Z := gLastZ;
  116. End;
  117.  
  118. Procedure AddXY(Const aX, aY : Integer);
  119. Begin
  120.     SetLength(gCoords, Length(gCoords) + 1);
  121.     gCoords[High(gCoords)].X := aX;
  122.     gCoords[High(gCoords)].Y := aY;
  123.     gCoords[High(gCoords)].Z := gCurrentZ;
  124. End;
  125.  
  126. Procedure DrawLine2d(Const aX1, aY1, aX2, aY2 : Integer);
  127. Var
  128.     yUnit,
  129.     xUnit,
  130.     yDiff,
  131.     xDiff,
  132.     yPos,
  133.     xPos,
  134.     ErrorTerm,
  135.     Leng,
  136.     i : Integer;
  137. Begin
  138.     yPos := aX1;
  139.     xPos := aY1;
  140.     yDiff := aY2 - aY1;
  141.     If yDiff < 0 Then
  142.     Begin
  143.         yDiff := yDiff * -1;
  144.         yUnit := -1;
  145.     End
  146.     Else
  147.         yUnit := 1;
  148.     xDiff := aX2 - aX1;
  149.     If xDiff < 0 Then
  150.     Begin
  151.         xDiff := xDiff * -1;
  152.         xUnit := -1;
  153.     End
  154.     Else
  155.         xUnit := 1;
  156.     ErrorTerm := 0;
  157.     If xDiff > yDiff Then
  158.     Begin
  159.         Leng := xDiff + 1;
  160.         i := 0;
  161.         While i < Leng Do
  162.         Begin
  163.             AddXY(xPos, yPos);
  164.             xPos := xPos + xUnit;
  165.             ErrorTerm := ErrorTerm + yDiff;
  166.             If ErrorTerm > xDiff Then
  167.             Begin
  168.                 ErrorTerm := ErrorTerm - xDiff;
  169.                 yPos := yPos + yUnit;
  170.             End;
  171.             Inc(i);
  172.         End;
  173.     End
  174.     Else
  175.     Begin
  176.         Leng := yDiff + 1;
  177.         i := 0;
  178.         While i < Leng Do
  179.         Begin
  180.             AddXY(xPos, yPos);
  181.             yPos := yPos + yUnit;
  182.             ErrorTerm := ErrorTerm + xDiff;
  183.             If ErrorTerm > xDiff Then
  184.             Begin
  185.                 ErrorTerm := ErrorTerm - yDiff;
  186.                 xPos := xPos + xUnit;
  187.             End;
  188.             Inc(i);
  189.         End;
  190.     End;
  191. End;
  192.  
  193. Procedure DrawLine3d(Const aX1, aY1, aZ1, aX2, aY2, aZ2 : Real);
  194. Var
  195.     lRX1,
  196.     lRY1,
  197.     lRZ1,
  198.     lRX2,
  199.     lRY2,
  200.     lRZ2 : Integer;
  201. Begin
  202.     lRX1 := Round(aX1);
  203.     lRY1 := Round(aY1);
  204.     lRZ1 := Round(aZ1);
  205.     lRX2 := Round(aX2);
  206.     lRY2 := Round(aY2);
  207.     lRZ2 := Round(aZ2);
  208.     If lRZ1 = lRZ2 Then
  209.         If Not((lRX1 = lRX2) And (lRY1 = lRY2)) Then
  210.             DrawLine2d(lRX1, lRY1, lRX2, lRY2)
  211.         Else
  212.     Else
  213.         Inc(gCurrentZ);
  214. End;
  215.  
  216. Procedure Startup;
  217. Begin
  218.     gInputFile := TStringList.Create;
  219.     gOutputFile := TStringList.Create;
  220.     gInputFile.LoadFromFile(ParamStr(1));
  221.     gScaleFactor := StrToFloat(ParamStr(3));
  222. End;
  223.  
  224. Procedure CloseUp;
  225. Begin
  226.     gOutputFile.SaveToFile(ParamStr(2));
  227.     FreeAndNil(gInputFile);
  228.     FreeAndNil(gOutputFile);
  229. End;
  230.  
  231. Var
  232.     lTmp : String;
  233.     lCtrl : Integer;
  234.     lCode : TCode;
  235.     lCoords : TCoord;
  236.  
  237. Begin
  238.     Startup;
  239.     gLastX := 0;
  240.     gLastY := 0;
  241.     gLastZ := 0;
  242.     gCurrentZ := 0;
  243.     For lCtrl := 0 To gInputFile.Count - 1 Do
  244.     Begin
  245.         lTmp := gInputFile[lCtrl];
  246.         lTmp := DelChars(lTmp, ' ');
  247.         lTmp := Copy2SymbDel(lTmp, ';');
  248.         If lTmp <> '' Then
  249.         Begin
  250.             lCode := GetNextParam(lTmp);
  251.             If (lCode.fCmd = 'G') And (lCode.fParam = '1') Then
  252.             Begin
  253.                 lCoords := ParseParamsXYZ(lTmp);
  254.                 DrawLine3D(
  255.                     gLastX * gScaleFactor,
  256.                     gLastY * gScaleFactor,
  257.                     gLastZ * gScaleFactor,
  258.                     lCoords.X * gScaleFactor,
  259.                     lCoords.Y * gScaleFactor,
  260.                     lCoords.Z * gScaleFactor
  261.                 );
  262.                 gLastX := lCoords.X;
  263.                 gLastY := lCoords.Y;
  264.                 gLastZ := lCoords.Z;
  265.             End;
  266.         End;
  267.     End;
  268.     For lCtrl := 0 To Length(gCoords) - 1 Do
  269.     Begin
  270.         gOutputFile.Add(
  271.             IntToStr(Round(gCoords[lCtrl].X)) + ',' +
  272.             IntToStr(Round(gCoords[lCtrl].Y)) + ',' +
  273.             IntToStr(Round(gCoords[lCtrl].Z))
  274.         );
  275.     End;
  276.     CloseUp;
  277. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement