2014-04-19 14:02:51 -07:00
/ *
Copyright ( c ) 2014 , Kevin Pope
All rights reserved .
Redistribution and use in source and binary forms , with or without
2015-04-08 15:20:10 -07:00
modification , are permitted provided that the following conditions are met :
2014-04-19 14:02:51 -07:00
1. Redistributions of source code must retain the above copyright notice , this
2015-04-08 15:20:10 -07:00
list of conditions and the following disclaimer .
2014-04-19 14:02:51 -07:00
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
2015-04-08 15:20:10 -07:00
and / or other materials provided with the distribution .
2014-04-19 14:02:51 -07:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
The views and conclusions contained in the software and documentation are those
2015-04-08 15:20:10 -07:00
of the authors and should not be interpreted as representing official policies ,
2014-04-19 14:02:51 -07:00
either expressed or implied , of the FreeBSD Project .
* /
using MatterHackers.Agg ;
2015-04-08 15:20:10 -07:00
using MatterHackers.Agg.PlatformAbstract ;
using MatterHackers.Agg.UI ;
2014-04-19 14:02:51 -07:00
using MatterHackers.MatterControl.DataStorage ;
using MatterHackers.MatterControl.PrintQueue ;
2014-05-12 18:30:35 -07:00
using MatterHackers.MatterControl.SettingsManagement ;
2014-10-24 14:55:27 -07:00
using MatterHackers.PolygonMesh ;
using MatterHackers.PolygonMesh.Processors ;
2015-06-10 17:53:17 -07:00
using MatterHackers.MatterControl.PrintLibrary.Provider ;
2015-04-08 15:20:10 -07:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
using System.IO ;
using System.Linq ;
2014-04-19 14:02:51 -07:00
namespace MatterHackers.MatterControl.PrintLibrary
{
2015-06-10 17:53:17 -07:00
public class LibrarySQLiteData
2015-04-08 15:20:10 -07:00
{
private List < PrintItemWrapper > printItems = new List < PrintItemWrapper > ( ) ;
public List < PrintItemWrapper > PrintItems
{
get { return printItems ; }
}
private DataStorage . PrintItemCollection libraryCollection ;
2015-06-10 17:53:17 -07:00
private static LibrarySQLiteData instance ;
2015-04-08 15:20:10 -07:00
2015-06-10 17:53:17 -07:00
public static LibrarySQLiteData Instance
2015-04-08 15:20:10 -07:00
{
get
{
if ( instance = = null )
{
2015-06-10 17:53:17 -07:00
instance = new LibrarySQLiteData ( ) ;
2015-04-08 15:20:10 -07:00
instance . LoadLibraryItems ( ) ;
}
return instance ;
}
}
2015-06-22 18:21:56 -07:00
static public void SaveToLibraryFolder2 ( PrintItemWrapper printItemWrapper , List < MeshGroup > meshGroups , bool AbsolutePositioned )
2015-04-08 15:20:10 -07:00
{
2015-01-26 10:53:32 -08:00
string [ ] metaData = { "Created By" , "MatterControl" } ;
if ( AbsolutePositioned )
{
metaData = new string [ ] { "Created By" , "MatterControl" , "BedPosition" , "Absolute" } ;
}
2015-04-08 15:20:10 -07:00
if ( printItemWrapper . FileLocation . Contains ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath ) )
{
MeshOutputSettings outputInfo = new MeshOutputSettings ( MeshOutputSettings . OutputType . Binary , metaData ) ;
MeshFileIo . Save ( meshGroups , printItemWrapper . FileLocation , outputInfo ) ;
}
else // save a copy to the library and update this to point at it
{
string fileName = Path . ChangeExtension ( Path . GetRandomFileName ( ) , ".amf" ) ;
printItemWrapper . FileLocation = Path . Combine ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath , fileName ) ;
MeshOutputSettings outputInfo = new MeshOutputSettings ( MeshOutputSettings . OutputType . Binary , metaData ) ;
MeshFileIo . Save ( meshGroups , printItemWrapper . FileLocation , outputInfo ) ;
printItemWrapper . PrintItem . Commit ( ) ;
2015-01-25 18:08:19 -08:00
// let the queue know that the item has changed so it load the correct part
QueueData . Instance . SaveDefaultQueue ( ) ;
}
2014-10-24 14:55:27 -07:00
2015-04-08 15:20:10 -07:00
printItemWrapper . OnFileHasChanged ( ) ;
}
private string keywordFilter = "" ;
public string KeywordFilter
{
get { return keywordFilter ; }
set
{
if ( this . keywordFilter ! = value )
{
this . keywordFilter = value ;
LoadLibraryItems ( ) ;
}
}
}
public void AddItem ( PrintItemWrapper item , int indexToInsert = - 1 )
{
if ( indexToInsert = = - 1 )
{
indexToInsert = PrintItems . Count ;
}
PrintItems . Insert ( indexToInsert , item ) ;
2015-06-23 15:37:49 -07:00
// Check if the collection we are adding to is the the currently visible collection.
List < ProviderLocatorNode > currentDisplayedCollection = LibraryProvider . Instance . GetProviderLocator ( ) ;
if ( currentDisplayedCollection . Count > 0 & & currentDisplayedCollection [ 1 ] . Key = = LibraryProviderSQLite . StaticProviderKey )
{
OnItemAdded ( new IndexArgs ( indexToInsert ) ) ;
}
2015-06-10 17:53:17 -07:00
item . PrintItem . PrintItemCollectionID = LibraryCollection . Id ;
item . PrintItem . Commit ( ) ;
2015-04-08 15:20:10 -07:00
}
public void RemoveItem ( PrintItemWrapper printItemWrapper )
{
int index = PrintItems . IndexOf ( printItemWrapper ) ;
if ( index < 0 )
{
// It may be possible to have the same item in the remove list twice.
// so if it is not in the PrintItems then ignore it.
return ;
}
PrintItems . RemoveAt ( index ) ;
// and remove it from the data base
printItemWrapper . Delete ( ) ;
OnItemRemoved ( new IndexArgs ( index ) ) ;
}
public PrintItemWrapper GetPrintItemWrapper ( int index )
{
2015-06-23 17:57:21 -07:00
if ( index > = 0 & & index < ItemCount )
2015-04-08 15:20:10 -07:00
{
return PrintItems [ index ] ;
}
return null ;
}
public DataStorage . PrintItemCollection LibraryCollection
{
get
{
// Attempt to initialize the library from the Datastore if null
if ( libraryCollection = = null )
{
libraryCollection = DataStorage . Datastore . Instance . dbSQLite . Table < DataStorage . PrintItemCollection > ( ) . Where ( v = > v . Name = = "_library" ) . Take ( 1 ) . FirstOrDefault ( ) ;
}
// If the _library collection is still missing, create and populate it with default content
if ( libraryCollection = = null )
{
libraryCollection = new PrintItemCollection ( ) ;
libraryCollection . Name = "_library" ;
libraryCollection . Commit ( ) ;
// Preload library with Oem supplied list of default parts
2015-06-10 17:53:17 -07:00
string [ ] itemsToAdd = LibrarySQLiteData . SyncCalibrationFilesToDisk ( OemSettings . Instance . PreloadedLibraryFiles ) ;
2015-04-08 15:20:10 -07:00
if ( itemsToAdd . Length > 0 )
{
// Import any files sync'd to disk into the library, then add them to the queue
2015-06-10 17:53:17 -07:00
LibrarySQLiteData . Instance . LoadFilesIntoLibrary ( itemsToAdd ) ;
2015-04-08 15:20:10 -07:00
}
}
return libraryCollection ;
}
}
internal static string [ ] SyncCalibrationFilesToDisk ( List < string > calibrationPrintFileNames )
{
// Ensure the CalibrationParts directory exists to store/import the files from disk
string tempPath = Path . Combine ( ApplicationDataStorage . Instance . ApplicationUserDataPath , "data" , "temp" , "calibration-parts" ) ;
Directory . CreateDirectory ( tempPath ) ;
// Build a list of temporary files that should be imported into the library
return calibrationPrintFileNames . Where ( fileName = >
{
// Filter out items that already exist in the library
2015-06-10 17:53:17 -07:00
return LibrarySQLiteData . Instance . GetLibraryItems ( Path . GetFileNameWithoutExtension ( fileName ) ) . Count ( ) < = 0 ;
2015-04-08 15:20:10 -07:00
} ) . Select ( fileName = >
{
// Copy calibration prints from StaticData to the filesystem before importing into the library
string tempFile = Path . Combine ( tempPath , Path . GetFileName ( fileName ) ) ;
using ( FileStream outstream = File . OpenWrite ( tempFile ) )
using ( Stream instream = StaticData . Instance . OpenSteam ( Path . Combine ( "OEMSettings" , "SampleParts" , fileName ) ) )
{
instream . CopyTo ( outstream ) ;
}
// Project the new filename to the output
return tempFile ;
} ) . ToArray ( ) ;
}
internal IEnumerable < DataStorage . PrintItem > GetLibraryItems ( string keyphrase = null )
{
if ( LibraryCollection = = null )
{
return null ;
}
else
{
string query ;
if ( keyphrase = = null )
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} ORDER BY Name ASC;" , libraryCollection . Id ) ;
}
else
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} AND Name LIKE '%{1}%' ORDER BY Name ASC;" , libraryCollection . Id , keyphrase ) ;
}
IEnumerable < DataStorage . PrintItem > result = ( IEnumerable < DataStorage . PrintItem > ) DataStorage . Datastore . Instance . dbSQLite . Query < DataStorage . PrintItem > ( query ) ;
return result ;
}
}
public void LoadLibraryItems ( )
{
PrintItems . Clear ( ) ;
IEnumerable < DataStorage . PrintItem > partFiles = GetLibraryItems ( keywordFilter ) ;
if ( partFiles ! = null )
{
foreach ( PrintItem part in partFiles )
{
PrintItems . Add ( new PrintItemWrapper ( part ) ) ;
}
}
OnDataReloaded ( null ) ;
}
public void OnDataReloaded ( EventArgs e )
{
2015-06-10 17:53:17 -07:00
LibraryProvider . OnDataReloaded ( e ) ;
2015-04-08 15:20:10 -07:00
}
public void OnItemAdded ( EventArgs e )
{
2015-06-10 17:53:17 -07:00
LibraryProvider . OnItemAdded ( e ) ;
2015-04-08 15:20:10 -07:00
}
public void OnItemRemoved ( EventArgs e )
{
2015-06-10 17:53:17 -07:00
LibraryProvider . OnItemRemoved ( e ) ;
2015-04-08 15:20:10 -07:00
}
public void SaveLibraryItems ( )
{
//
}
2015-06-23 17:57:21 -07:00
public int ItemCount
2015-04-08 15:20:10 -07:00
{
get
{
return PrintItems . Count ;
}
}
private ReportProgressRatio fileLoadReportProgress = null ;
public void LoadFilesIntoLibrary ( IList < string > files , ReportProgressRatio reportProgress = null , RunWorkerCompletedEventHandler callback = null )
{
this . fileLoadReportProgress = reportProgress ;
if ( files ! = null & & files . Count > 0 )
{
BackgroundWorker loadFilesIntoLibraryBackgroundWorker = new BackgroundWorker ( ) ;
loadFilesIntoLibraryBackgroundWorker . WorkerReportsProgress = true ;
loadFilesIntoLibraryBackgroundWorker . DoWork + = new DoWorkEventHandler ( loadFilesIntoLibraryBackgoundWorker_DoWork ) ;
loadFilesIntoLibraryBackgroundWorker . RunWorkerCompleted + = new RunWorkerCompletedEventHandler ( loadFilesIntoLibraryBackgroundWorker_RunWorkerCompleted ) ;
if ( callback ! = null )
{
loadFilesIntoLibraryBackgroundWorker . RunWorkerCompleted + = callback ;
}
loadFilesIntoLibraryBackgroundWorker . RunWorkerAsync ( files ) ;
}
}
private void loadFilesIntoLibraryBackgoundWorker_DoWork ( object sender , DoWorkEventArgs e )
{
IList < string > fileList = e . Argument as IList < string > ;
foreach ( string loadedFileName in fileList )
{
string extension = Path . GetExtension ( loadedFileName ) . ToUpper ( ) ;
if ( MeshFileIo . ValidFileExtensions ( ) . Contains ( extension )
| | extension = = ".GCODE"
2015-03-16 11:25:13 -07:00
| | extension = = ".ZIP" )
2015-04-08 15:20:10 -07:00
{
2015-03-16 11:25:13 -07:00
if ( extension = = ".ZIP" )
{
ProjectFileHandler project = new ProjectFileHandler ( null ) ;
List < PrintItem > partFiles = project . ImportFromProjectArchive ( loadedFileName ) ;
if ( partFiles ! = null )
{
foreach ( PrintItem part in partFiles )
{
AddStlOrGcode ( part . FileLocation , Path . GetExtension ( part . FileLocation ) . ToUpper ( ) ) ;
}
}
}
else
{
AddStlOrGcode ( loadedFileName , extension ) ;
}
2015-04-08 15:20:10 -07:00
}
}
}
2014-10-24 14:55:27 -07:00
2015-03-16 11:25:13 -07:00
private static void AddStlOrGcode ( string loadedFileName , string extension )
{
PrintItem printItem = new PrintItem ( ) ;
printItem . Name = Path . GetFileNameWithoutExtension ( loadedFileName ) ;
printItem . FileLocation = Path . GetFullPath ( loadedFileName ) ;
2015-06-10 17:53:17 -07:00
printItem . PrintItemCollectionID = LibrarySQLiteData . Instance . LibraryCollection . Id ;
2015-03-16 11:25:13 -07:00
printItem . Commit ( ) ;
if ( MeshFileIo . ValidFileExtensions ( ) . Contains ( extension ) )
{
List < MeshGroup > meshToConvertAndSave = MeshFileIo . Load ( loadedFileName ) ;
try
{
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem ) ;
2015-06-22 18:21:56 -07:00
SaveToLibraryFolder2 ( printItemWrapper , meshToConvertAndSave , false ) ;
2015-06-10 17:53:17 -07:00
Instance . AddItem ( printItemWrapper ) ;
2015-03-16 11:25:13 -07:00
}
catch ( System . UnauthorizedAccessException )
{
2015-06-11 12:06:40 -07:00
UiThread . RunOnIdle ( ( ) = >
2015-03-16 11:25:13 -07:00
{
//Do something special when unauthorized?
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes, unauthorized access" , "Unable to save" ) ;
} ) ;
}
catch
{
2015-06-11 12:06:40 -07:00
UiThread . RunOnIdle ( ( ) = >
2015-03-16 11:25:13 -07:00
{
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes." , "Unable to save" ) ;
} ) ;
}
}
else // it is not a mesh so just add it
{
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem ) ;
2015-04-15 10:08:36 -07:00
if ( false )
{
2015-06-10 17:53:17 -07:00
LibrarySQLiteData . Instance . AddItem ( printItemWrapper ) ;
2015-04-15 10:08:36 -07:00
}
else // save a copy to the library and update this to point at it
{
string sourceFileName = printItem . FileLocation ;
string newFileName = Path . ChangeExtension ( Path . GetRandomFileName ( ) , Path . GetExtension ( printItem . FileLocation ) ) ;
string destFileName = Path . Combine ( ApplicationDataStorage . Instance . ApplicationLibraryDataPath , newFileName ) ;
File . Copy ( sourceFileName , destFileName , true ) ;
printItemWrapper . FileLocation = destFileName ;
printItemWrapper . PrintItem . Commit ( ) ;
// let the queue know that the item has changed so it load the correct part
2015-06-10 17:53:17 -07:00
LibrarySQLiteData . Instance . AddItem ( printItemWrapper ) ;
2015-04-15 10:08:36 -07:00
}
2015-03-16 11:25:13 -07:00
}
}
2015-04-08 15:20:10 -07:00
private void loadFilesIntoLibraryBackgroundWorker_RunWorkerCompleted ( object sender , RunWorkerCompletedEventArgs e )
{
}
}
2014-04-19 14:02:51 -07:00
}