303 lines
10 KiB
C#
303 lines
10 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.IO;
|
|
|
|
using MatterHackers.Agg;
|
|
using MatterHackers.Agg.UI;
|
|
using MatterHackers.MatterControl.DataStorage;
|
|
using MatterHackers.MatterControl.PrintQueue;
|
|
using MatterHackers.GCodeVisualizer;
|
|
|
|
using MatterHackers.Localizations;
|
|
|
|
using MatterHackers.MatterControl.SlicerConfiguration;
|
|
|
|
|
|
namespace MatterHackers.MatterControl.PrintLibrary
|
|
{
|
|
public class ExportLibraryItemWindow : SystemWindow
|
|
{
|
|
CheckBox showInFolderAfterSave;
|
|
private PrintLibraryListItem printQueueItem;
|
|
string pathAndFilenameToSave;
|
|
bool partIsGCode = false;
|
|
|
|
public ExportLibraryItemWindow(PrintLibraryListItem printLibraryItem)
|
|
: base(400, 250)
|
|
{
|
|
if (Path.GetExtension(printLibraryItem.printItem.FileLocation).ToUpper() == ".GCODE")
|
|
{
|
|
partIsGCode = true;
|
|
}
|
|
|
|
string exportLibraryFileTitle = LocalizedString.Get("MatterControl");
|
|
string exportLibraryFileTitleFull = LocalizedString.Get("Export File");
|
|
this.Title = string.Format("{0}: {1}", exportLibraryFileTitle, exportLibraryFileTitleFull);
|
|
this.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
|
|
|
|
// TODO: Complete member initialization
|
|
this.printQueueItem = printLibraryItem;
|
|
|
|
|
|
doLayout();
|
|
ActivePrinterProfile.Instance.ActivePrinterChanged.RegisterEvent(reloadAfterPrinterProfileChanged, ref unregisterEvents);
|
|
}
|
|
|
|
public void doLayout()
|
|
{
|
|
this.RemoveAllChildren();
|
|
TextImageButtonFactory textImageButtonFactory = new TextImageButtonFactory();
|
|
FlowLayoutWidget topToBottom = new FlowLayoutWidget(FlowDirection.TopToBottom);
|
|
topToBottom.Padding = new BorderDouble(3, 0, 3, 5);
|
|
topToBottom.AnchorAll();
|
|
|
|
|
|
FlowLayoutWidget headerContainer = new FlowLayoutWidget (FlowDirection.LeftToRight);
|
|
headerContainer.HAnchor = HAnchor.ParentLeftRight;
|
|
headerContainer.Padding = new BorderDouble (0, 3, 0, 3);
|
|
headerContainer.Margin = new BorderDouble (0, 3, 0, 0);
|
|
headerContainer.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
|
|
|
|
|
|
string fileExportLabelTxt = LocalizedString.Get("File export options");
|
|
TextWidget exportLabel = new TextWidget(string.Format("{0}:", fileExportLabelTxt));
|
|
exportLabel.TextColor = ActiveTheme.Instance.PrimaryTextColor;
|
|
headerContainer.AddChild(exportLabel);
|
|
topToBottom.AddChild(headerContainer);
|
|
|
|
|
|
FlowLayoutWidget exportStlGcodeButtonsContainer = new FlowLayoutWidget(FlowDirection.TopToBottom);
|
|
exportStlGcodeButtonsContainer.BackgroundColor = ActiveTheme.Instance.SecondaryBackgroundColor;
|
|
exportStlGcodeButtonsContainer.HAnchor = HAnchor.ParentLeftRight;
|
|
exportStlGcodeButtonsContainer.VAnchor = VAnchor.ParentBottomTop;
|
|
exportStlGcodeButtonsContainer.Padding = new BorderDouble (5);
|
|
|
|
Button cancelButton = textImageButtonFactory.Generate ("Cancel");
|
|
cancelButton.Padding = new BorderDouble (0);
|
|
cancelButton.Click += (sender, e) => {
|
|
CloseOnIdle();
|
|
};
|
|
|
|
GuiWidget gDSpacer = new GuiWidget ();
|
|
gDSpacer.HAnchor = HAnchor.ParentLeftRight;
|
|
|
|
|
|
if (!partIsGCode)
|
|
{
|
|
string exportSTLTxt = LocalizedString.Get("Export as");
|
|
string exportSTLTxtFull = string.Format ("{0} STL", exportSTLTxt);
|
|
|
|
Button exportAsSTLButton = textImageButtonFactory.Generate(exportSTLTxtFull);
|
|
exportAsSTLButton.Click += new ButtonBase.ButtonEventHandler(exportSTL_Click);
|
|
exportStlGcodeButtonsContainer.AddChild(exportAsSTLButton);
|
|
}
|
|
|
|
bool showExportGCodeButton = ActivePrinterProfile.Instance.ActivePrinter != null || partIsGCode;
|
|
|
|
if (showExportGCodeButton)
|
|
{
|
|
string exportGCodeText = LocalizedString.Get("Export as");
|
|
string exportGCodeTextFull = string.Format ("{0} GCode", exportGCodeText);
|
|
|
|
Button exportGCode = textImageButtonFactory.Generate(exportGCodeTextFull);
|
|
exportGCode.Click += new ButtonBase.ButtonEventHandler(exportGCode_Click);
|
|
exportStlGcodeButtonsContainer.AddChild(exportGCode);
|
|
}
|
|
|
|
GuiWidget vSpacer = new GuiWidget();
|
|
vSpacer.VAnchor = Agg.UI.VAnchor.ParentBottomTop;
|
|
exportStlGcodeButtonsContainer.AddChild(vSpacer);
|
|
|
|
if (!showExportGCodeButton)
|
|
{
|
|
string noGCodeMessageText = LocalizedString.Get("Note");
|
|
string noGCodeMessageTextFull = LocalizedString.Get("To enable GCode export, select a printer profile");
|
|
TextWidget noGCodeMessage = new TextWidget(string.Format("{0}: {1}.", noGCodeMessageText, noGCodeMessageTextFull), textColor: RGBA_Bytes.White, pointSize: 10);
|
|
exportStlGcodeButtonsContainer.AddChild(noGCodeMessage);
|
|
}
|
|
|
|
FlowLayoutWidget buttonRow = new FlowLayoutWidget (FlowDirection.LeftToRight);
|
|
buttonRow.BackgroundColor = ActiveTheme.Instance.PrimaryBackgroundColor;
|
|
buttonRow.HAnchor = HAnchor.ParentLeftRight;
|
|
buttonRow.Padding = new BorderDouble(0);
|
|
|
|
// TODO: make this work on the mac and then delete this if
|
|
if (MatterHackers.Agg.UI.WindowsFormsAbstract.GetOSType() == WindowsFormsAbstract.OSType.Windows)
|
|
{
|
|
showInFolderAfterSave = new CheckBox(LocalizedString.Get("Show file in folder after save"), ActiveTheme.Instance.PrimaryTextColor, 10);
|
|
showInFolderAfterSave.Margin = new BorderDouble(top: 10);
|
|
exportStlGcodeButtonsContainer.AddChild(showInFolderAfterSave);
|
|
buttonRow.AddChild(gDSpacer);
|
|
buttonRow.AddChild(cancelButton);
|
|
topToBottom.AddChild (exportStlGcodeButtonsContainer);
|
|
topToBottom.AddChild(buttonRow);
|
|
}
|
|
|
|
this.AddChild(topToBottom);
|
|
}
|
|
|
|
void exportGCode_Click(object sender, MouseEventArgs mouseEvent)
|
|
{
|
|
UiThread.RunOnIdle(DoExportGCode_Click);
|
|
}
|
|
|
|
string GetExtension (string filename)
|
|
{
|
|
string extension;
|
|
int indexOfDot = filename.LastIndexOf(".");
|
|
if (indexOfDot == -1)
|
|
{
|
|
extension = "";
|
|
}
|
|
else
|
|
{
|
|
extension = filename.Substring(indexOfDot);
|
|
}
|
|
return extension;
|
|
}
|
|
|
|
void DoExportGCode_Click(object state)
|
|
{
|
|
SaveFileDialogParams saveParams = new SaveFileDialogParams("Export GCode|*.gcode", title: "Export GCode");
|
|
saveParams.Title = "MatterControl: Export File";
|
|
saveParams.ActionButtonLabel = "Export";
|
|
|
|
System.IO.Stream streamToSaveTo = FileDialog.SaveFileDialog(ref saveParams);
|
|
if (streamToSaveTo != null)
|
|
{
|
|
streamToSaveTo.Close();
|
|
|
|
|
|
string filePathToSave = saveParams.FileName;
|
|
string extension = GetExtension(filePathToSave);
|
|
|
|
if(extension == "")
|
|
{
|
|
File.Delete (filePathToSave);
|
|
filePathToSave += ".gcode";
|
|
}
|
|
|
|
if (Path.GetExtension(printQueueItem.printItem.FileLocation).ToUpper() == ".STL")
|
|
{
|
|
pathAndFilenameToSave = saveParams.FileName;
|
|
Close();
|
|
SlicingQueue.Instance.QueuePartForSlicing(printQueueItem.printItem);
|
|
printQueueItem.printItem.Done += new EventHandler(sliceItem_Done);
|
|
}
|
|
else if (partIsGCode)
|
|
{
|
|
Close();
|
|
SaveGCodeToNewLocation(printQueueItem.printItem.FileLocation,filePathToSave);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SaveGCodeToNewLocation(string source, string dest)
|
|
{
|
|
if (ActivePrinterProfile.Instance.DoPrintLeveling)
|
|
{
|
|
GCodeFile unleveledGCode = new GCodeFile(source);
|
|
PrintLeveling.Instance.ApplyLeveling(unleveledGCode);
|
|
unleveledGCode.Save(dest);
|
|
}
|
|
else
|
|
{
|
|
File.Copy(source, dest, true);
|
|
}
|
|
ShowFileIfRequested(dest);
|
|
}
|
|
|
|
void ShowFileIfRequested(string filename)
|
|
{
|
|
if (MatterHackers.Agg.UI.WindowsFormsAbstract.GetOSType() == WindowsFormsAbstract.OSType.Windows)
|
|
{
|
|
if (showInFolderAfterSave.Checked)
|
|
{
|
|
WindowsFormsAbstract.ShowFileInFolder(filename);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnClosed(EventArgs e)
|
|
{
|
|
if (unregisterEvents != null)
|
|
{
|
|
unregisterEvents(this, null);
|
|
}
|
|
base.OnClosed(e);
|
|
}
|
|
|
|
event EventHandler unregisterEvents;
|
|
|
|
void reloadAfterPrinterProfileChanged(object sender, EventArgs e)
|
|
{
|
|
doLayout();
|
|
}
|
|
|
|
void exportSTL_Click(object sender, MouseEventArgs mouseEvent)
|
|
{
|
|
UiThread.RunOnIdle(DoExportSTL_Click);
|
|
}
|
|
|
|
|
|
string CheckExtension(string fileName)
|
|
{
|
|
string extension;
|
|
int indexOfDot = fileName.LastIndexOf(".");
|
|
if (indexOfDot == -1)
|
|
{
|
|
extension = "";
|
|
}
|
|
else
|
|
{
|
|
extension = fileName.Substring(indexOfDot);
|
|
}
|
|
return extension;
|
|
}
|
|
|
|
void DoExportSTL_Click(object state)
|
|
{
|
|
SaveFileDialogParams saveParams = new SaveFileDialogParams("Save as STL|*.stl");
|
|
saveParams.Title = "MatterControl: Export File";
|
|
saveParams.ActionButtonLabel = "Export";
|
|
|
|
System.IO.Stream streamToSaveTo = FileDialog.SaveFileDialog(ref saveParams);
|
|
if (streamToSaveTo != null)
|
|
{
|
|
streamToSaveTo.Close ();
|
|
Close ();
|
|
}
|
|
|
|
|
|
string filePathToSave = saveParams.FileName;
|
|
string extension = CheckExtension(filePathToSave);
|
|
|
|
if(extension == "")
|
|
{
|
|
File.Delete (filePathToSave);
|
|
filePathToSave += ".stl";
|
|
}
|
|
|
|
File.Copy(printQueueItem.printItem.FileLocation, filePathToSave, true);
|
|
ShowFileIfRequested(filePathToSave);
|
|
|
|
}
|
|
|
|
void sliceItem_Done(object sender, EventArgs e)
|
|
{
|
|
PrintItemWrapper sliceItem = (PrintItemWrapper)sender;
|
|
|
|
sliceItem.Done -= new EventHandler(sliceItem_Done);
|
|
SaveGCodeToNewLocation(sliceItem.GCodePathAndFileName, pathAndFilenameToSave);
|
|
}
|
|
|
|
public void CloseOnIdle()
|
|
{
|
|
UiThread.RunOnIdle((state) => { Close(); });
|
|
}
|
|
|
|
|
|
}
|
|
}
|