2015-06-10 17:53:17 -07:00
/ *
Copyright ( c ) 2015 , Lars Brubaker
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions are met :
1. Redistributions of source code must retain the above copyright notice , this
list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright notice ,
this list of conditions and the following disclaimer in the documentation
and / or other materials provided with the distribution .
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
of the authors and should not be interpreted as representing official policies ,
either expressed or implied , of the FreeBSD Project .
* /
using MatterHackers.Agg ;
2015-07-01 13:37:59 -07:00
using MatterHackers.Agg.Image ;
2015-06-25 12:19:19 -07:00
using MatterHackers.Agg.PlatformAbstract ;
2015-06-17 17:58:38 -07:00
using MatterHackers.Agg.UI ;
2015-06-12 17:21:51 -07:00
using MatterHackers.MatterControl.DataStorage ;
2015-06-10 17:53:17 -07:00
using MatterHackers.MatterControl.PrintQueue ;
2015-06-25 12:19:19 -07:00
using MatterHackers.MatterControl.SettingsManagement ;
2015-06-22 18:21:56 -07:00
using MatterHackers.PolygonMesh ;
2015-06-25 12:19:19 -07:00
using MatterHackers.PolygonMesh.Processors ;
2015-06-30 11:34:46 -07:00
using Newtonsoft.Json ;
2015-06-10 17:53:17 -07:00
using System ;
using System.Collections.Generic ;
using System.ComponentModel ;
2015-06-25 12:19:19 -07:00
using System.IO ;
using System.Linq ;
2015-07-02 11:23:44 -07:00
using System.Threading.Tasks ;
2015-06-10 17:53:17 -07:00
namespace MatterHackers.MatterControl.PrintLibrary.Provider
{
public class LibraryProviderSQLite : LibraryProvider
{
2015-06-22 18:21:56 -07:00
private static LibraryProviderSQLite instance = null ;
2015-06-30 11:34:46 -07:00
private PrintItemCollection baseLibraryCollection ;
2015-06-29 18:03:56 -07:00
2015-06-25 12:19:19 -07:00
private List < PrintItemCollection > childCollections = new List < PrintItemCollection > ( ) ;
private string keywordFilter = string . Empty ;
2015-06-15 18:31:43 -07:00
2015-06-25 12:19:19 -07:00
private List < PrintItemWrapper > printItems = new List < PrintItemWrapper > ( ) ;
2015-06-30 11:34:46 -07:00
public LibraryProviderSQLite ( PrintItemCollection baseLibraryCollection , LibraryProvider parentLibraryProvider )
2015-06-29 18:03:56 -07:00
: base ( parentLibraryProvider )
2015-06-25 12:19:19 -07:00
{
2015-06-30 11:34:46 -07:00
if ( baseLibraryCollection = = null )
{
baseLibraryCollection = GetRootLibraryCollection2 ( this ) ;
}
this . baseLibraryCollection = baseLibraryCollection ;
2015-06-25 12:19:19 -07:00
LoadLibraryItems ( ) ;
}
2015-06-29 18:03:56 -07:00
public static LibraryProvider Instance
2015-06-17 17:58:38 -07:00
{
get
{
if ( instance = = null )
{
2015-06-30 11:34:46 -07:00
instance = new LibraryProviderSQLite ( null , null ) ;
2015-06-17 17:58:38 -07:00
}
return instance ;
}
}
2015-07-13 13:07:26 -07:00
public override string GetPrintItemName ( int itemIndex )
{
2015-07-14 17:02:57 -07:00
return printItems [ itemIndex ] . Name ;
2015-07-13 13:07:26 -07:00
}
2015-07-27 19:03:54 -07:00
public override void RenameCollection ( int collectionIndexToRename , string newName )
{
2015-07-28 14:38:47 -07:00
childCollections [ collectionIndexToRename ] . Name = newName ;
childCollections [ collectionIndexToRename ] . Commit ( ) ;
LoadLibraryItems ( ) ;
2015-07-27 19:03:54 -07:00
}
public override void RenameItem ( int itemIndexToRename , string newName )
{
2015-07-28 14:38:47 -07:00
printItems [ itemIndexToRename ] . PrintItem . Name = newName ;
printItems [ itemIndexToRename ] . PrintItem . Commit ( ) ;
LoadLibraryItems ( ) ;
2015-07-27 19:03:54 -07:00
}
2015-06-22 18:21:56 -07:00
public static string StaticProviderKey
2015-06-15 18:31:43 -07:00
{
2015-06-22 18:21:56 -07:00
get
{
return "LibraryProviderSqliteKey" ;
}
2015-06-15 18:31:43 -07:00
}
2015-07-12 19:02:42 -07:00
public override bool Visible
{
get { return true ; }
}
2015-07-02 18:34:10 -07:00
public override void Dispose ( )
{
}
2015-06-11 16:25:12 -07:00
public override int CollectionCount
{
2015-06-15 18:31:43 -07:00
get
2015-06-12 09:48:20 -07:00
{
2015-06-25 12:19:19 -07:00
return childCollections . Count ;
2015-06-12 09:48:20 -07:00
}
2015-06-11 16:25:12 -07:00
}
public override int ItemCount
2015-06-10 17:53:17 -07:00
{
get
{
2015-06-25 12:19:19 -07:00
return printItems . Count ;
2015-06-10 17:53:17 -07:00
}
}
2015-06-11 16:25:12 -07:00
public override string KeywordFilter
2015-06-10 17:53:17 -07:00
{
get
{
2015-06-25 12:19:19 -07:00
return keywordFilter ;
2015-06-10 17:53:17 -07:00
}
set
{
2015-06-25 12:19:19 -07:00
keywordFilter = value ;
2015-06-10 17:53:17 -07:00
}
}
2015-06-15 18:31:43 -07:00
public override string Name
{
get
{
2015-07-23 14:19:28 -07:00
return "Local Library" ;
2015-06-15 18:31:43 -07:00
}
}
2015-06-29 18:03:56 -07:00
public override string ProviderData
{
2015-06-30 11:34:46 -07:00
get
{
return baseLibraryCollection . Id . ToString ( ) ;
}
2015-06-29 18:03:56 -07:00
}
2015-06-17 17:35:12 -07:00
public override string ProviderKey
{
get
{
return StaticProviderKey ;
}
}
2015-06-25 12:19:19 -07:00
public static IEnumerable < PrintItem > GetAllPrintItemsRecursive ( )
{
// NOTE: We are making the assumption that everything is reference if it does not have a 0 in eth PrintItemCollectionID.
string query = "SELECT * FROM PrintItem WHERE PrintItemCollectionID != 0;" ;
IEnumerable < PrintItem > result = ( IEnumerable < PrintItem > ) Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
return result ;
}
2015-06-30 11:34:46 -07:00
static PrintItemCollection GetRootLibraryCollection2 ( LibraryProviderSQLite rootLibrary )
2015-06-25 12:19:19 -07:00
{
// Attempt to initialize the library from the Datastore if null
2015-06-30 11:34:46 -07:00
PrintItemCollection rootLibraryCollection = Datastore . Instance . dbSQLite . Table < PrintItemCollection > ( ) . Where ( v = > v . Name = = "_library" ) . Take ( 1 ) . FirstOrDefault ( ) ;
2015-06-25 12:19:19 -07:00
// If the _library collection is still missing, create and populate it with default content
2015-06-30 11:34:46 -07:00
if ( rootLibraryCollection = = null )
2015-06-25 12:19:19 -07:00
{
2015-06-30 11:34:46 -07:00
rootLibraryCollection = new PrintItemCollection ( ) ;
rootLibraryCollection . Name = "_library" ;
rootLibraryCollection . Commit ( ) ;
2015-06-25 12:19:19 -07:00
// Preload library with Oem supplied list of default parts
string [ ] itemsToAdd = SyncCalibrationFilesToDisk ( OemSettings . Instance . PreloadedLibraryFiles ) ;
if ( itemsToAdd . Length > 0 )
{
// Import any files sync'd to disk into the library, then add them to the queue
2015-06-29 18:03:56 -07:00
rootLibrary . AddFilesToLibrary ( itemsToAdd ) ;
2015-06-25 12:19:19 -07:00
}
}
2015-06-30 11:34:46 -07:00
return rootLibraryCollection ;
2015-06-25 12:19:19 -07:00
}
static public void SaveToLibraryFolder ( PrintItemWrapper printItemWrapper , List < MeshGroup > meshGroups , bool AbsolutePositioned )
{
string [ ] metaData = { "Created By" , "MatterControl" } ;
if ( AbsolutePositioned )
{
metaData = new string [ ] { "Created By" , "MatterControl" , "BedPosition" , "Absolute" } ;
}
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 ( ) ;
// let the queue know that the item has changed so it load the correct part
QueueData . Instance . SaveDefaultQueue ( ) ;
}
printItemWrapper . OnFileHasChanged ( ) ;
}
public 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-30 11:34:46 -07:00
LibraryProviderSQLite rootLibrary = new LibraryProviderSQLite ( null , null ) ;
2015-06-29 18:03:56 -07:00
return rootLibrary . GetLibraryItems ( Path . GetFileNameWithoutExtension ( fileName ) ) . Count ( ) < = 0 ;
2015-06-25 12:19:19 -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 ( ) ;
}
2015-06-11 16:25:12 -07:00
public override void AddCollectionToLibrary ( string collectionName )
2015-06-25 12:19:19 -07:00
{
PrintItemCollection newCollection = new PrintItemCollection ( collectionName , "" ) ;
2015-06-30 11:34:46 -07:00
newCollection . ParentCollectionID = baseLibraryCollection . Id ;
2015-06-25 12:19:19 -07:00
newCollection . Commit ( ) ;
2015-06-30 11:34:46 -07:00
LoadLibraryItems ( ) ;
2015-06-25 12:19:19 -07:00
}
2015-07-23 11:48:31 -07:00
public override void AddItem ( PrintItemWrapper itemToAdd )
2015-06-25 12:19:19 -07:00
{
2015-07-23 11:48:31 -07:00
if ( itemToAdd ! = null & & itemToAdd . FileLocation ! = null )
2015-06-25 12:19:19 -07:00
{
2015-07-02 11:23:44 -07:00
// create enough info to show that we have items pending (maybe use names from this file list for them)
// refresh the display to show the pending items
//LibraryProvider.OnDataReloaded(null);
2015-06-25 12:19:19 -07:00
2015-07-23 11:48:31 -07:00
Task . Run ( ( ) = > loadFilesIntoLibraryBackgoundWorker_DoWork ( new string [ ] { itemToAdd . FileLocation } ) ) ;
2015-06-25 12:19:19 -07:00
2015-07-02 11:23:44 -07:00
if ( baseLibraryCollection ! = null )
2015-06-25 12:19:19 -07:00
{
2015-07-02 11:23:44 -07:00
LoadLibraryItems ( ) ;
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-25 12:19:19 -07:00
}
}
}
public void AddItem ( PrintItemWrapper item , int indexToInsert = - 1 )
2015-06-11 16:25:12 -07:00
{
2015-06-25 12:19:19 -07:00
if ( indexToInsert = = - 1 )
{
indexToInsert = printItems . Count ;
}
printItems . Insert ( indexToInsert , item ) ;
// Check if the collection we are adding to is the the currently visible collection.
2015-06-29 18:03:56 -07:00
List < ProviderLocatorNode > currentDisplayedCollection = GetProviderLocator ( ) ;
2015-06-30 18:49:20 -07:00
if ( currentDisplayedCollection . Count > 0 & & currentDisplayedCollection [ 0 ] . Key = = LibraryProviderSQLite . StaticProviderKey )
2015-06-25 12:19:19 -07:00
{
2015-07-01 16:26:37 -07:00
//OnItemAdded(new IndexArgs(indexToInsert));
2015-06-25 12:19:19 -07:00
}
2015-06-30 11:34:46 -07:00
item . PrintItem . PrintItemCollectionID = baseLibraryCollection . Id ;
2015-06-25 12:19:19 -07:00
item . PrintItem . Commit ( ) ;
2015-06-11 16:25:12 -07:00
}
2015-06-10 17:53:17 -07:00
2015-06-15 18:31:43 -07:00
public override PrintItemCollection GetCollectionItem ( int collectionIndex )
2015-06-10 17:53:17 -07:00
{
2015-06-25 12:19:19 -07:00
return childCollections [ collectionIndex ] ;
2015-06-10 17:53:17 -07:00
}
2015-07-14 16:16:58 -07:00
public async override Task < PrintItemWrapper > GetPrintItemWrapperAsync ( int index , ReportProgressRatio reportProgress = null )
2015-06-15 18:31:43 -07:00
{
2015-06-25 12:19:19 -07:00
if ( index > = 0 & & index < printItems . Count )
{
return printItems [ index ] ;
}
return null ;
2015-06-12 09:48:20 -07:00
}
2015-07-22 18:30:22 -07:00
public override LibraryProvider GetProviderForCollection ( PrintItemCollection collection )
2015-06-22 18:21:56 -07:00
{
2015-06-30 11:34:46 -07:00
return new LibraryProviderSQLite ( collection , this ) ;
2015-06-22 18:21:56 -07:00
}
2015-07-27 19:03:54 -07:00
void LoadLibraryItems ( )
2015-06-25 12:19:19 -07:00
{
printItems . Clear ( ) ;
IEnumerable < PrintItem > partFiles = GetLibraryItems ( KeywordFilter ) ;
if ( partFiles ! = null )
{
foreach ( PrintItem part in partFiles )
{
2015-07-20 16:09:52 -07:00
PrintItemWrapper item = new PrintItemWrapper ( part , this ) ;
2015-06-30 11:34:46 -07:00
printItems . Add ( item ) ;
2015-06-25 12:19:19 -07:00
}
}
childCollections . Clear ( ) ;
2015-06-30 11:34:46 -07:00
GetChildCollections ( ) ;
IEnumerable < PrintItemCollection > collections = GetChildCollections ( ) ;
if ( collections ! = null )
{
childCollections . AddRange ( collections ) ;
}
2015-06-30 18:49:20 -07:00
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-25 12:19:19 -07:00
}
2015-07-22 18:30:22 -07:00
public override void RemoveCollection ( int collectionIndexToRemove )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
childCollections [ collectionIndexToRemove ] . Delete ( ) ;
2015-06-30 11:34:46 -07:00
LoadLibraryItems ( ) ;
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-10 17:53:17 -07:00
}
2015-07-22 18:30:22 -07:00
public override void RemoveItem ( int itemToRemoveIndex )
2015-06-10 17:53:17 -07:00
{
2015-07-22 18:30:22 -07:00
if ( itemToRemoveIndex < 0 )
2015-06-25 12:19:19 -07:00
{
// 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 ;
}
2015-07-22 18:30:22 -07:00
2015-06-25 12:19:19 -07:00
// and remove it from the data base
2015-07-22 18:30:22 -07:00
printItems [ itemToRemoveIndex ] . Delete ( ) ;
printItems . RemoveAt ( itemToRemoveIndex ) ;
2015-06-25 12:19:19 -07:00
2015-07-27 10:27:22 -07:00
OnDataReloaded ( null ) ;
2015-06-10 17:53:17 -07:00
}
2015-06-15 18:31:43 -07:00
2015-06-30 11:34:46 -07:00
private static void AddStlOrGcode ( LibraryProviderSQLite libraryToAddTo , string loadedFileName , string extension )
2015-06-25 12:19:19 -07:00
{
PrintItem printItem = new PrintItem ( ) ;
printItem . Name = Path . GetFileNameWithoutExtension ( loadedFileName ) ;
printItem . FileLocation = Path . GetFullPath ( loadedFileName ) ;
2015-06-30 11:34:46 -07:00
printItem . PrintItemCollectionID = libraryToAddTo . baseLibraryCollection . Id ;
2015-06-25 12:19:19 -07:00
printItem . Commit ( ) ;
2015-08-03 16:46:57 -07:00
if ( ( extension ! = "" & & MeshFileIo . ValidFileExtensions ( ) . Contains ( extension ) ) )
2015-06-25 12:19:19 -07:00
{
List < MeshGroup > meshToConvertAndSave = MeshFileIo . Load ( loadedFileName ) ;
try
{
2015-07-20 16:09:52 -07:00
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem , libraryToAddTo ) ;
2015-06-25 12:19:19 -07:00
SaveToLibraryFolder ( printItemWrapper , meshToConvertAndSave , false ) ;
2015-06-29 18:03:56 -07:00
libraryToAddTo . AddItem ( printItemWrapper ) ;
2015-06-25 12:19:19 -07:00
}
catch ( System . UnauthorizedAccessException )
{
UiThread . RunOnIdle ( ( ) = >
{
//Do something special when unauthorized?
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes, unauthorized access" , "Unable to save" ) ;
} ) ;
}
catch
{
UiThread . RunOnIdle ( ( ) = >
{
StyledMessageBox . ShowMessageBox ( null , "Oops! Unable to save changes." , "Unable to save" ) ;
} ) ;
}
}
else // it is not a mesh so just add it
{
2015-07-20 16:09:52 -07:00
PrintItemWrapper printItemWrapper = new PrintItemWrapper ( printItem , libraryToAddTo ) ;
2015-06-25 12:19:19 -07:00
if ( false )
{
2015-06-29 18:03:56 -07:00
libraryToAddTo . AddItem ( printItemWrapper ) ;
2015-06-25 12:19:19 -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-29 18:03:56 -07:00
libraryToAddTo . AddItem ( printItemWrapper ) ;
2015-06-25 12:19:19 -07:00
}
}
}
private IEnumerable < PrintItemCollection > GetChildCollections ( )
{
2015-06-30 11:34:46 -07:00
string query = string . Format ( "SELECT * FROM PrintItemCollection WHERE ParentCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
IEnumerable < PrintItemCollection > result = ( IEnumerable < PrintItemCollection > ) Datastore . Instance . dbSQLite . Query < PrintItemCollection > ( query ) ;
return result ;
2015-06-25 12:19:19 -07:00
}
2015-07-20 16:09:52 -07:00
public IEnumerable < PrintItem > GetLibraryItems ( string keyphrase = null )
2015-06-25 12:19:19 -07:00
{
2015-06-30 11:34:46 -07:00
string query ;
if ( keyphrase = = null )
2015-06-25 12:19:19 -07:00
{
2015-06-30 11:34:46 -07:00
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} ORDER BY Name ASC;" , baseLibraryCollection . Id ) ;
2015-06-25 12:19:19 -07:00
}
2015-06-30 11:34:46 -07:00
else
{
query = string . Format ( "SELECT * FROM PrintItem WHERE PrintItemCollectionID = {0} AND Name LIKE '%{1}%' ORDER BY Name ASC;" , baseLibraryCollection . Id , keyphrase ) ;
}
IEnumerable < PrintItem > result = ( IEnumerable < PrintItem > ) Datastore . Instance . dbSQLite . Query < PrintItem > ( query ) ;
return result ;
2015-06-25 12:19:19 -07:00
}
2015-07-02 11:23:44 -07:00
private void loadFilesIntoLibraryBackgoundWorker_DoWork ( IList < string > fileList )
2015-06-25 12:19:19 -07:00
{
foreach ( string loadedFileName in fileList )
{
string extension = Path . GetExtension ( loadedFileName ) . ToUpper ( ) ;
2015-08-03 16:46:57 -07:00
if ( ( extension ! = "" & & MeshFileIo . ValidFileExtensions ( ) . Contains ( extension ) )
2015-06-25 12:19:19 -07:00
| | extension = = ".GCODE"
| | extension = = ".ZIP" )
{
if ( extension = = ".ZIP" )
{
ProjectFileHandler project = new ProjectFileHandler ( null ) ;
List < PrintItem > partFiles = project . ImportFromProjectArchive ( loadedFileName ) ;
if ( partFiles ! = null )
{
foreach ( PrintItem part in partFiles )
{
2015-06-29 18:03:56 -07:00
AddStlOrGcode ( this , part . FileLocation , Path . GetExtension ( part . FileLocation ) . ToUpper ( ) ) ;
2015-06-25 12:19:19 -07:00
}
}
}
else
{
2015-06-29 18:03:56 -07:00
AddStlOrGcode ( this , loadedFileName , extension ) ;
2015-06-25 12:19:19 -07:00
}
}
}
}
2015-06-10 17:53:17 -07:00
}
}