Making gcode visualizer parse relative extruder correctly

issue: MatterHackers/MCCentral#3913
Made prusa layer changes show by default
Problems with GCode from Simplify3D and relative extrusion
This commit is contained in:
Lars Brubaker 2021-09-08 16:32:23 -07:00
parent 1feb3d6616
commit ffb743f925
4 changed files with 52 additions and 21 deletions

View file

@ -114,20 +114,34 @@ namespace MatterControl.Printing
"; LAYER:",
";LAYER:",
"; layer ",
";LAYER_CHANGE" // prusa slicer default
};
public static bool IsLayerChange(string line)
{
return LayerLineStartTokens.Any(l => line.StartsWith(l));
return LayerChangeString(line) != null;
}
public static string LayerChangeString(string line)
{
for (int i = 0; i < LayerLineStartTokens.Length; i++)
{
if (line.StartsWith(LayerLineStartTokens[i]))
{
return LayerLineStartTokens[i];
}
}
return null;
}
public static int GetLayerNumber(string line)
{
var layerToken = LayerLineStartTokens.FirstOrDefault(t => line.StartsWith(t));
var layerChangeString = LayerChangeString(line);
if (layerToken != null)
if (layerChangeString != null)
{
line = line.Substring(layerToken.Length);
line = line.Substring(layerChangeString.Length);
// Find the first digits after the layer start token
var match = FirstDigitsAfterToken.Match(line);

View file

@ -224,14 +224,15 @@ namespace MatterControl.Printing
double ePosition = lastEPosition;
if (GetFirstNumberAfter("E", lineToParse, ref ePosition))
{
if (instruction.MovementType == PrinterMachineInstruction.MovementTypes.Absolute)
if (instruction.XyzeMovementType == PrinterMachineInstruction.MovementTypes.Relative
|| instruction.ExtuderRelativeOverride)
{
double deltaEPosition = ePosition - lastEPosition;
filamentMm += deltaEPosition;
filamentMm += ePosition;
}
else
{
filamentMm += ePosition;
double deltaEPosition = ePosition - lastEPosition;
filamentMm += deltaEPosition;
}
lastEPosition = ePosition;
@ -650,7 +651,7 @@ namespace MatterControl.Printing
break;
case 'M':
loadedGCodeFile.ParseMLine(lineString);
loadedGCodeFile.ParseMLine(lineString, machineInstructionForLine);
break;
case 'T':
@ -878,7 +879,7 @@ namespace MatterControl.Printing
{
double ePosition = processingMachineState.EPosition;
var position = processingMachineState.Position;
if (processingMachineState.MovementType == PrinterMachineInstruction.MovementTypes.Relative)
if (processingMachineState.XyzeMovementType == PrinterMachineInstruction.MovementTypes.Relative)
{
position = Vector3.Zero;
ePosition = 0;
@ -895,16 +896,24 @@ namespace MatterControl.Printing
processingMachineState.FeedRate = (float)feedrate;
}
if (processingMachineState.MovementType == PrinterMachineInstruction.MovementTypes.Absolute)
if (processingMachineState.XyzeMovementType == PrinterMachineInstruction.MovementTypes.Absolute)
{
processingMachineState.Position = position;
processingMachineState.EPosition = (float)ePosition;
}
else
{
processingMachineState.Position += position;
}
if (processingMachineState.XyzeMovementType == PrinterMachineInstruction.MovementTypes.Relative
|| processingMachineState.ExtuderRelativeOverride)
{
processingMachineState.EPosition += (float)ePosition;
}
else
{
processingMachineState.EPosition = (float)ePosition;
}
}
if (!gcodeHasExplicitLayerChangeInfo)
@ -942,11 +951,11 @@ namespace MatterControl.Printing
break;
case "90": // G90 is Absolute Distance Mode
processingMachineState.MovementType = PrinterMachineInstruction.MovementTypes.Absolute;
processingMachineState.XyzeMovementType = PrinterMachineInstruction.MovementTypes.Absolute;
break;
case "91": // G91 is Incremental Distance Mode
processingMachineState.MovementType = PrinterMachineInstruction.MovementTypes.Relative;
processingMachineState.XyzeMovementType = PrinterMachineInstruction.MovementTypes.Relative;
break;
case "92":
@ -997,7 +1006,7 @@ namespace MatterControl.Printing
}
}
private void ParseMLine(string lineString)
private void ParseMLine(string lineString, PrinterMachineInstruction processingMachineState)
{
// take off any comments before we check its length
int commentIndex = lineString.IndexOf(';');
@ -1039,10 +1048,12 @@ namespace MatterControl.Printing
case "82":
// set extruder to absolute mode
processingMachineState.ExtuderRelativeOverride = false;
break;
case "83":
// Set extruder to relative mode
processingMachineState.ExtuderRelativeOverride = true;
break;
case "84":

View file

@ -48,7 +48,12 @@ namespace MatterControl.Printing
public byte[] byteLine;
// Absolute is the RepRap default
public MovementTypes MovementType = MovementTypes.Absolute;
public MovementTypes XyzeMovementType { get; internal set; } = MovementTypes.Absolute;
/// <summary>
/// Overrides the
/// </summary>
public bool ExtuderRelativeOverride { get; internal set; } = false;
public float SecondsThisLine;
@ -69,7 +74,8 @@ namespace MatterControl.Printing
xyzPosition = copy.xyzPosition;
FeedRate = copy.FeedRate;
EPosition = copy.EPosition;
MovementType = copy.MovementType;
XyzeMovementType = copy.XyzeMovementType;
ExtuderRelativeOverride = copy.ExtuderRelativeOverride;
SecondsToEndFromHere = copy.SecondsToEndFromHere;
ToolIndex = copy.ToolIndex;
}
@ -111,7 +117,7 @@ namespace MatterControl.Printing
get { return xyzPosition.X; }
set
{
if (MovementType == MovementTypes.Absolute)
if (XyzeMovementType == MovementTypes.Absolute)
{
xyzPosition.X = (float)value;
}
@ -127,7 +133,7 @@ namespace MatterControl.Printing
get { return xyzPosition.Y; }
set
{
if (MovementType == MovementTypes.Absolute)
if (XyzeMovementType == MovementTypes.Absolute)
{
xyzPosition.Y = (float)value;
}
@ -143,7 +149,7 @@ namespace MatterControl.Printing
get { return xyzPosition.Z; }
set
{
if (MovementType == MovementTypes.Absolute)
if (XyzeMovementType == MovementTypes.Absolute)
{
xyzPosition.Z = (float)value;
}

View file

@ -33,7 +33,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration.MappingClasses
{
public override string Convert(string value, PrinterSettings settings)
{
// Unescape newlines
// Un-escape newlines
value = value.Replace("\\n", "\n");
if (!value.Contains("; LAYER:")