diff --git a/CustomWidgets/ExportQueueItemWindow.cs b/CustomWidgets/ExportQueueItemWindow.cs index 45dd8592d..3966c88a2 100644 --- a/CustomWidgets/ExportQueueItemWindow.cs +++ b/CustomWidgets/ExportQueueItemWindow.cs @@ -210,7 +210,7 @@ namespace MatterHackers.MatterControl if (streamToSaveTo != null) { streamToSaveTo.Close (); - Close (); + Close(); } // windows vista +: filePathToSave 'test.stl' // windows xp: filePathToSave 'test' diff --git a/ICSharpCode.SharpZipLib.dll b/ICSharpCode.SharpZipLib.dll new file mode 100644 index 000000000..fe643ebc6 Binary files /dev/null and b/ICSharpCode.SharpZipLib.dll differ diff --git a/Ionic.Zip.dll b/Ionic.Zip.dll deleted file mode 100644 index 95fa92885..000000000 Binary files a/Ionic.Zip.dll and /dev/null differ diff --git a/MatterControl.csproj b/MatterControl.csproj index 5feec7499..94975ba49 100644 --- a/MatterControl.csproj +++ b/MatterControl.csproj @@ -194,8 +194,9 @@ - - Ionic.Zip.dll + + False + .\ICSharpCode.SharpZipLib.dll PdfSharp.dll diff --git a/PartsSheet.cs b/PartsSheet.cs index ecc5ea31f..7f3371410 100644 --- a/PartsSheet.cs +++ b/PartsSheet.cs @@ -231,6 +231,7 @@ namespace MatterHackers.MatterControl document.Info.Subject = "This is a list of the parts that are in a queue from MatterControl."; document.Info.Keywords = "MatterControl, STL, 3D Printing"; + int nextPartToPrintIndex = 0; int plateNumber = 1; bool done = false; @@ -241,11 +242,14 @@ namespace MatterHackers.MatterControl } try { + // save the final document document.Save(pathAndFileToSaveTo); + // Now try and open the document. This will lanch whatever PDF viewer is on the system and ask it + // to show the file (at least on Windows). Process.Start(pathAndFileToSaveTo); } - catch { - + catch (Exception) + { } OnDoneSaving(); diff --git a/PrintQueue/PrintQueueMenu.cs b/PrintQueue/PrintQueueMenu.cs index f186488d2..407bf9f22 100644 --- a/PrintQueue/PrintQueueMenu.cs +++ b/PrintQueue/PrintQueueMenu.cs @@ -56,17 +56,34 @@ namespace MatterHackers.MatterControl.PrintQueue void SetMenuItems() { - //Set the name and callback function of the menu items - menuItems = new TupleList> + // The pdf export library is not working on the mac at the moment so we don't include the + // part sheet export option on mac. + if (MatterHackers.Agg.UI.WindowsFormsAbstract.GetOSType() == WindowsFormsAbstract.OSType.Mac) { - {"STL", null}, - {new LocalizedString(" Import from Zip").Translated, importQueueFromZipMenu_Click}, - {new LocalizedString(" Export to Zip").Translated, exportQueueToZipMenu_Click}, - {"GCode", null}, - {new LocalizedString(" Export to Folder").Translated, exportGCodeToFolderButton_Click}, - {new LocalizedString("Extra").Translated, null}, - {new LocalizedString(" Create Part Sheet").Translated, createPartsSheetsButton_Click}, - }; + //Set the name and callback function of the menu items + menuItems = new TupleList> + { + {"STL", null}, + {new LocalizedString(" Import from Zip").Translated, importQueueFromZipMenu_Click}, + {new LocalizedString(" Export to Zip").Translated, exportQueueToZipMenu_Click}, + {"GCode", null}, + {new LocalizedString(" Export to Folder").Translated, exportGCodeToFolderButton_Click}, + }; + } + else + { + //Set the name and callback function of the menu items + menuItems = new TupleList> + { + {"STL", null}, + {new LocalizedString(" Import from Zip").Translated, importQueueFromZipMenu_Click}, + {new LocalizedString(" Export to Zip").Translated, exportQueueToZipMenu_Click}, + {"GCode", null}, + {new LocalizedString(" Export to Folder").Translated, exportGCodeToFolderButton_Click}, + {new LocalizedString("Extra").Translated, null}, + {new LocalizedString(" Create Part Sheet").Translated, createPartsSheetsButton_Click}, + }; + } BorderDouble padding = MenuDropList.MenuItemsPadding; //Add the menu items to the menu itself @@ -99,13 +116,19 @@ namespace MatterHackers.MatterControl.PrintQueue if (parts.Count > 0) { SaveFileDialogParams saveParams = new SaveFileDialogParams("Save Parts Sheet|*.pdf"); + saveParams.ActionButtonLabel = new LocalizedString("Save Parts Sheet").Translated; string saveParamsTitleLbl = new LocalizedString("MatterContol").Translated; string saveParamsTitleLblFull = new LocalizedString ("Save").Translated; saveParams.Title = string.Format("{0}: {1}",saveParamsTitleLbl,saveParamsTitleLblFull); System.IO.Stream streamToSaveTo = FileDialog.SaveFileDialog(ref saveParams); - if (streamToSaveTo != null) + if (streamToSaveTo != null) + { + streamToSaveTo.Close (); + } + + if (saveParams.FileName != null) { PartsSheet currentPartsInQueue = new PartsSheet(parts, saveParams.FileName); diff --git a/PrinterCommunication.cs b/PrinterCommunication.cs index 833311cdd..ba153c7c5 100644 --- a/PrinterCommunication.cs +++ b/PrinterCommunication.cs @@ -665,6 +665,8 @@ namespace MatterHackers.MatterControl { string lineToWrite = LinesToWriteQueue[0]; + lineToWrite = ApplyPrintLeveling(lineToWrite, false, false); + WriteToPrinter(lineToWrite + "\r\n", lineToWrite); LinesToWriteQueue.RemoveAt(0); System.Threading.Thread.Sleep(1); @@ -830,18 +832,18 @@ namespace MatterHackers.MatterControl string lineToParse = foundStringEventArgs.LineToCheck; Vector3 positionRead = Vector3.Zero; - GCodeFile.GetFirstNumberAfter('X', lineToParse, ref positionRead.x); - GCodeFile.GetFirstNumberAfter('Y', lineToParse, ref positionRead.y); - GCodeFile.GetFirstNumberAfter('Z', lineToParse, ref positionRead.z); + GCodeFile.GetFirstNumberAfter("X:", lineToParse, ref positionRead.x); + GCodeFile.GetFirstNumberAfter("Y:", lineToParse, ref positionRead.y); + GCodeFile.GetFirstNumberAfter("Z:", lineToParse, ref positionRead.z); int xPosition = lineToParse.IndexOf('X'); int secondXPosition = lineToParse.IndexOf("Count", xPosition); if (secondXPosition != -1) { Vector3 currentPositionRead = Vector3.Zero; - GCodeFile.GetFirstNumberAfter('X', lineToParse, ref currentPositionRead.x, secondXPosition - 1); - GCodeFile.GetFirstNumberAfter('Y', lineToParse, ref currentPositionRead.y, secondXPosition - 1); - GCodeFile.GetFirstNumberAfter('Z', lineToParse, ref currentPositionRead.z, secondXPosition - 1); + GCodeFile.GetFirstNumberAfter("X:", lineToParse, ref currentPositionRead.x, secondXPosition - 1); + GCodeFile.GetFirstNumberAfter("Y:", lineToParse, ref currentPositionRead.y, secondXPosition - 1); + GCodeFile.GetFirstNumberAfter("Z:", lineToParse, ref currentPositionRead.z, secondXPosition - 1); lastReportedPosition = currentPositionRead; } @@ -1312,9 +1314,9 @@ namespace MatterHackers.MatterControl newDestination = Vector3.Zero; } - GCodeFile.GetFirstNumberAfter('X', lineBeingSent, ref newDestination.x); - GCodeFile.GetFirstNumberAfter('Y', lineBeingSent, ref newDestination.y); - GCodeFile.GetFirstNumberAfter('Z', lineBeingSent, ref newDestination.z); + GCodeFile.GetFirstNumberAfter("X", lineBeingSent, ref newDestination.x); + GCodeFile.GetFirstNumberAfter("Y", lineBeingSent, ref newDestination.y); + GCodeFile.GetFirstNumberAfter("Z", lineBeingSent, ref newDestination.z); if (movementMode == PrinterMachineInstruction.MovementTypes.Relative) { @@ -1329,7 +1331,8 @@ namespace MatterHackers.MatterControl if (ActivePrinter.DoPrintLeveling) { - lineBeingSent = PrintLeveling.Instance.ApplyLeveling(currentDestination, movementMode, lineBeingSent, addLFCR, includeSpaces); + string inputLine = lineBeingSent; + lineBeingSent = PrintLeveling.Instance.ApplyLeveling(currentDestination, movementMode, inputLine, addLFCR, includeSpaces); } } @@ -1341,7 +1344,7 @@ namespace MatterHackers.MatterControl lineBeingSent = lineBeingSent.ToUpper().Trim(); if (lineBeingSent.StartsWith("G0") || lineBeingSent.StartsWith("G1")) { - if (GCodeFile.GetFirstNumberAfter('E', lineBeingSent, ref gcodeRequestedExtrusionPosition)) + if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) { double delta = gcodeRequestedExtrusionPosition - previousGcodeRequestedExtrusionPosition; if (extruderMode == PrinterMachineInstruction.MovementTypes.Relative) @@ -1356,7 +1359,7 @@ namespace MatterHackers.MatterControl } else if (lineBeingSent.StartsWith("G92")) { - if (GCodeFile.GetFirstNumberAfter('E', lineBeingSent, ref gcodeRequestedExtrusionPosition)) + if (GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref gcodeRequestedExtrusionPosition)) { previousGcodeRequestedExtrusionPosition = gcodeRequestedExtrusionPosition; currentActualExtrusionPosition = gcodeRequestedExtrusionPosition; @@ -1374,7 +1377,7 @@ namespace MatterHackers.MatterControl if (lineBeingSent.StartsWith("G0") || lineBeingSent.StartsWith("G1")) { double feedRate = 0; - if (GCodeFile.GetFirstNumberAfter('F', lineBeingSent, ref feedRate)) + if (GCodeFile.GetFirstNumberAfter("F", lineBeingSent, ref feedRate)) { lineBeingSent = GCodeFile.ReplaceNumberAfter('F', lineBeingSent, feedRate * FeedRateRatio); } diff --git a/PrinterControls/PrintLeveling.cs b/PrinterControls/PrintLeveling.cs index 5c7de53bb..1e118182b 100644 --- a/PrinterControls/PrintLeveling.cs +++ b/PrinterControls/PrintLeveling.cs @@ -85,9 +85,9 @@ namespace MatterHackers.MatterControl && lineBeingSent[2] == ' ') { double extruderDelta = 0; - GCodeFile.GetFirstNumberAfter('E', lineBeingSent, ref extruderDelta); + GCodeFile.GetFirstNumberAfter("E", lineBeingSent, ref extruderDelta); double feedRate = 0; - GCodeFile.GetFirstNumberAfter('F', lineBeingSent, ref feedRate); + GCodeFile.GetFirstNumberAfter("F", lineBeingSent, ref feedRate); string newLine = "G1 "; @@ -97,9 +97,9 @@ namespace MatterHackers.MatterControl if (movementMode == PrinterMachineInstruction.MovementTypes.Relative) { Vector3 relativeMove = Vector3.Zero; - GCodeFile.GetFirstNumberAfter('X', lineBeingSent, ref relativeMove.x); - GCodeFile.GetFirstNumberAfter('Y', lineBeingSent, ref relativeMove.y); - GCodeFile.GetFirstNumberAfter('Z', lineBeingSent, ref relativeMove.z); + GCodeFile.GetFirstNumberAfter("X", lineBeingSent, ref relativeMove.x); + GCodeFile.GetFirstNumberAfter("Y", lineBeingSent, ref relativeMove.y); + GCodeFile.GetFirstNumberAfter("Z", lineBeingSent, ref relativeMove.z); outPosition = PrintLeveling.Instance.ApplyLevelingRotation(relativeMove); } diff --git a/ProjectFileHandler.cs b/ProjectFileHandler.cs index 9cbd92c5a..bcf1c8df8 100644 --- a/ProjectFileHandler.cs +++ b/ProjectFileHandler.cs @@ -37,7 +37,7 @@ using System.IO; using System.Diagnostics; using System.Collections.Generic; -using Ionic.Zip; +using ICSharpCode.SharpZipLib.Zip; using MatterHackers.Agg.UI; using MatterHackers.MatterControl.DataStorage; @@ -173,7 +173,6 @@ namespace MatterHackers.MatterControl public void ExportToProjectArchive(string savedFileName = null) { - if (savedFileName == null) { savedFileName = defaultProjectPathAndFileName; @@ -197,24 +196,54 @@ namespace MatterHackers.MatterControl StreamWriter sw = new System.IO.StreamWriter(fs); sw.Write(jsonString); sw.Close(); - - ZipFile zip = new ZipFile(); - zip.AddFile(defaultManifestPathAndFileName).FileName = Path.GetFileName(defaultManifestPathAndFileName); + + FileStream outputFileStream = File.Create(savedFileName); + ZipOutputStream zipStream = new ZipOutputStream(outputFileStream); + zipStream.SetLevel(3); + CopyFileToZip(zipStream, defaultManifestPathAndFileName); { foreach (KeyValuePair item in this.sourceFiles) { - zip.AddFile(item.Key).FileName = Path.GetFileName(item.Key); + CopyFileToZip(zipStream, item.Key); } } - zip.Save(savedFileName); + zipStream.IsStreamOwner = true; // Makes the Close also Close the underlying stream + zipStream.Close(); + } + + private static void CopyFileToZip(ZipOutputStream zipStream, string sourceFile) + { + if (File.Exists(sourceFile)) + { + ZipEntry newEntry = new ZipEntry(Path.GetFileName(sourceFile)); + FileInfo fi = new FileInfo(sourceFile); + newEntry.DateTime = fi.LastWriteTime; + newEntry.Size = fi.Length; + zipStream.PutNextEntry(newEntry); + using (FileStream streamReader = File.OpenRead(sourceFile)) + { + CopyStream(streamReader, zipStream); + } + zipStream.CloseEntry(); + } + } + + public static void CopyStream(Stream input, Stream output) + { + byte[] buffer = new byte[4096]; + int read; + while ((read = input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer, 0, read); + } } public List OpenFromDialog() { OpenFileDialogParams openParams = new OpenFileDialogParams("Zip file|*.zip"); - System.IO.Stream streamToLoadFrom = FileDialog.OpenFileDialog(ref openParams); - if (streamToLoadFrom != null) + FileDialog.OpenFileDialog(ref openParams); + if (openParams.FileNames != null) { string loadedFileName = openParams.FileName; return ImportFromProjectArchive(loadedFileName); @@ -233,9 +262,9 @@ namespace MatterHackers.MatterControl } if (System.IO.File.Exists(loadedFileName)) - { - - ZipFile zip = ZipFile.Read(loadedFileName); + { + FileStream fs = File.OpenRead(loadedFileName); + ZipFile zip = new ZipFile(fs); int projectHashCode = zip.GetHashCode(); //If the temp folder doesn't exist - create it, otherwise clear it @@ -253,20 +282,37 @@ namespace MatterHackers.MatterControl List printItemList = new List(); Project projectManifest = null; - foreach (ZipEntry e in zip) - { - e.Extract(stagingFolder, ExtractExistingFileAction.OverwriteSilently); - if (e.FileName == "manifest.json") + foreach (ZipEntry zipEntry in zip) + { + if (!zipEntry.IsFile) { - e.Extract(stagingFolder, ExtractExistingFileAction.OverwriteSilently); - string extractedFileName = Path.Combine(stagingFolder, e.FileName); - StreamReader sr = new System.IO.StreamReader(extractedFileName); - projectManifest = (Project)Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd(), typeof(Project)); - sr.Close(); + continue; // Ignore directories } - else if (System.IO.Path.GetExtension(e.FileName).ToUpper() == ".STL" || System.IO.Path.GetExtension(e.FileName).ToUpper() == ".GCODE") + + if (zipEntry.Name == "manifest.json" + || System.IO.Path.GetExtension(zipEntry.Name).ToUpper() == ".STL" + || System.IO.Path.GetExtension(zipEntry.Name).ToUpper() == ".GCODE") { - e.Extract(stagingFolder, ExtractExistingFileAction.OverwriteSilently); + string extractedFileName = Path.Combine(stagingFolder, zipEntry.Name); + + string neededPathForZip = Path.GetDirectoryName(extractedFileName); + if (!Directory.Exists(neededPathForZip)) + { + Directory.CreateDirectory(neededPathForZip); + } + + Stream zipStream = zip.GetInputStream(zipEntry); + using (FileStream streamWriter = File.Create(extractedFileName)) + { + CopyStream(zipStream, streamWriter); + } + + if (zipEntry.Name == "manifest.json") + { + StreamReader sr = new System.IO.StreamReader(extractedFileName); + projectManifest = (Project)Newtonsoft.Json.JsonConvert.DeserializeObject(sr.ReadToEnd(), typeof(Project)); + sr.Close(); + } } } diff --git a/StaticData/PrinterSettings/SeeMeCNC/Orion ABS/config.ini b/StaticData/PrinterSettings/SeeMeCNC/Orion ABS/config.ini index 169b99313..b9e1ad21f 100644 --- a/StaticData/PrinterSettings/SeeMeCNC/Orion ABS/config.ini +++ b/StaticData/PrinterSettings/SeeMeCNC/Orion ABS/config.ini @@ -1,7 +1,7 @@ avoid_crossing_perimeters = 1 bed_shape = circular bed_size = 260,260 -bed_temperature = 70 +bed_temperature = 90 bottom_solid_layers = 5 bridge_acceleration = 0 bridge_fan_speed = 100 @@ -32,11 +32,11 @@ filament_diameter = 1.75 fill_angle = 0 fill_density = 0.2 fill_pattern = rectilinear -first_layer_bed_temperature = 70 +first_layer_bed_temperature = 90 first_layer_extrusion_width = 0.6 first_layer_height = 0.35 first_layer_speed = 40% -first_layer_temperature = 182 +first_layer_temperature = 230 g0 = 0 gap_fill_speed = 30 gcode_arcs = 0 @@ -102,7 +102,7 @@ support_material_pattern = rectilinear support_material_spacing = 2.5 support_material_speed = 3 support_material_threshold = 0 -temperature = 188 +temperature = 230 threads = 4 toolchange_gcode = top_infill_extrusion_width = 0.6