/// <summary> /// Generate G-code instructions for the segment. /// </summary> /// <param name="s">StringBuilder to store the G-code.</param> /// <param name="printer">Printer state.</param> public override void GenerateGCode(StringBuilder s, V2GState printer) { double MovementLength = printer.Position.DistanceTo(printer.PrintPointOnBase(this.PrintPosition)); if (MovementLength > MovementThreshold) { if (printer.settings.IsVerbose) { s.Append("\n(A. PrintMovement) (Printer has to move)"); } printer.F = this.PrintPosition.Speed; printer.SetPosition(this.PrintPosition, s); // Move s.Append("\nG1"); s.Append(" X" + Math.Round(printer.Position.X, 4)); s.Append(" Y" + Math.Round(printer.Position.Y, 4)); s.Append(" Z" + Math.Round(printer.Position.Z, 4)); s.Append(" F" + Math.Round(printer.F, 4)); } else { if (printer.settings.IsVerbose) { s.Append("\n (A. PrintMovement) (Printer is already here)"); } } }
public override void GenerateGCode(StringBuilder s, V2GState printer) { V2GPrintPosition prevP = printer.Position; printer.F = this.speed; printer.SetPosition(this.p); double length = printer.Position.DistanceTo(prevP); double extrusionHeight = this.Height(); if (printer.Position.Z < 0) { printer.Position.Z = 0; // todo: this safes inside the PrintState class } if (printer.Position.Z < 0.7 && this.AllowsGroundOverride) { if (this.thickness < 700) { this.speed = 400; } extrusionHeight = 0.25; } // Locate Z in its place s.Append("\nG1"); s.Append(" Z" + Math.Round((printer.Position.Z + extrusionHeight), 4)); printer.EPerMM = this.EUnitIncrease(); // Calculate E increase double EUnitIncrease = printer.EPerMM; double EIncrease = EUnitIncrease * length; printer.E += EIncrease; // Extrude // - todo: check if coordinates are equal than previous ones s.Append("\nG1"); s.Append(" X" + Math.Round(printer.Position.X, 4)); s.Append(" Y" + Math.Round(printer.Position.Y, 4)); s.Append(" Z" + Math.Round((printer.Position.Z + extrusionHeight), 4)); s.Append(" E" + Math.Round(printer.E, 4)); s.Append(" F" + Math.Round(printer.F, 4)); if (printer.settings.IsVerbose) { s.Append(" (EUnitIncrease " + EUnitIncrease + ", thickness " + this.thickness + ", height " + extrusionHeight + ")"); } if (printer.settings.IsVerbose) { s.Append(" (PrintSegment)"); } }
/// <summary> /// Generate G-code instructions for the segment. /// </summary> /// <param name="s">StringBuilder to store the G-code.</param> /// <param name="printer">Printer state.</param> public override void GenerateGCode(StringBuilder s, V2GState printer) { V2GPrintPosition prevPrinterPosition = printer.Position; bool speedChanged = false; if (printer.F != this.PrintPosition.Speed) { printer.F = this.PrintPosition.Speed; speedChanged = true; } printer.SetPosition(this.PrintPosition, s); double length = printer.Position.DistanceTo(prevPrinterPosition); // Switch Extruder Head if Needed printer.SetHead(s, this.PrintPosition.Head); // Move to Start Point //s.Append("\nG1"); //s.Append(" Z" + Math.Round(printer.Position.Z, 4)); // Move and Extrude s.Append("\nG1"); if (prevPrinterPosition.X != printer.Position.X) { s.Append(" X" + Math.Round(printer.Position.X, 4)); } if (prevPrinterPosition.Y != printer.Position.Y) { s.Append(" Y" + Math.Round(printer.Position.Y, 4)); } if (Math.Abs(prevPrinterPosition.Z - printer.Position.Z) > 0.0001) { s.Append(" Z" + Math.Round(printer.Position.Z, 4)); } printer.IncreaseE(s, this.PrintPosition.MaterialAmount, length, this.PrintPosition.MixPercentage); if (speedChanged) { s.Append(" F" + Math.Round(printer.F, 4)); } }
public override void GenerateGCode(StringBuilder s, V2GState printer) { double MovementLength = printer.Position.DistanceTo(printer.PrintPointOnBase(this.p)); if (MovementLength > 0.001) { if (this.IsRelative) { this.SetRelativePoint(printer); } if (printer.settings.IsVerbose) { s.Append("\n(A. PrintMovement) (Printer has to move)"); } printer.F = this.speed; // Filament retract if (this.FilamentRetract > 0.0 && (MovementLength > 2.0 || ForceFilamentOperations)) { printer.E += -this.FilamentRetract; s.Append("\nG1 E" + Math.Round(printer.E, 4)); } // Add zDelta if (zDelta != 0) { printer.Position.Z += zDelta; s.Append("\nG1 Z" + Math.Round(printer.Position.Z, 4)); if (printer.settings.IsVerbose) { s.Append(" (B. PrintMovement) (move zDelta " + zDelta + ")"); } } // Move // todo: rollback and forth printer.SetPosition(this.p + new V2GPrintPosition(0, 0, zDelta)); s.Append("\nG1"); s.Append(" X" + Math.Round(printer.Position.X, 4)); s.Append(" Y" + Math.Round(printer.Position.Y, 4)); s.Append(" Z" + Math.Round(printer.Position.Z, 4)); s.Append(" F" + Math.Round(printer.F, 4)); if (printer.settings.IsVerbose) { s.Append(" (C. PrintMovement) (move towards point with zDelta " + zDelta + ")"); } // Substract zDelta if (zDelta != 0) { printer.Position.Z -= zDelta; if (printer.Position.Z < 0) { printer.Position.Z = 0.0; } s.Append("\nG1 Z" + Math.Round(printer.Position.Z, 4)); //if (printer.IsVerbose) s.Append(" (D. PrintMovement) (move zDelta " + zDelta + ")"); } // Filament feed (while moving) if (this.FilamentFeed > 0.0 && (MovementLength > 2.0 || ForceFilamentOperations)) // todo: check if this makes PLA behavior worse (length restriction wasn't here, just testing for NinjaFlex not to go out of the extruder) { if (zDelta == 0) { s.Append("\nG1"); } printer.E += this.FilamentFeed; s.Append(" E" + Math.Round(printer.E, 4)); } } else { if (printer.settings.IsVerbose) { s.Append("\n (A. PrintMovement) (Printer is already here)"); } } }