void initialize_db()
        {
            // if settings database does not exist, generate it
            if (Directory.Exists(cotangent.CCOptions.SettingsDBPath) == false)
            {
                populate_defaults();
                SettingsSerializer serializer = new SettingsSerializer();
                serializer.GenerateSettingsFolder(this, cotangent.CCOptions.SettingsDBPath);
                reset_db();
            }

            try {
                DebugUtil.Log("Reading settings database from {0}", cotangent.CCOptions.SettingsDBPath);
                populate_from_disk(cotangent.CCOptions.SettingsDBPath);
            } catch (Exception e) {
                DebugUtil.Log("MachineDatabase: fatal exception restoring : " + e.Message);
                if (FPlatform.InUnityEditor())
                {
                    throw;
                }
            }

            // [TODO] sync w/ new known settings?
            List <MachinePreset> new_defaults = populate_defaults();

            foreach (var preset in new_defaults)
            {
                SettingsSerializer serializer  = new SettingsSerializer();
                Manufacturer       mfg         = FindManufacturerByUUID(preset.Settings.BaseMachine.ManufacturerUUID);
                MachineModel       model       = FindModelByUUID(mfg, preset.Settings.BaseMachine.ModelUUID);
                string             machinePath = serializer.CreateNewSettingsFolder(this, mfg, model, cotangent.CCOptions.SettingsDBPath);
                preset.SourcePath = Path.Combine(machinePath, preset.Settings.Identifier + ".txt");
                serializer.StoreSettings(this, preset, true);
            }
        }
        public void StorePreset(MachinePreset preset)
        {
            if (preset.SourcePath.Length == 0)
            {
                DebugUtil.Log(2, "MachineDatabase.StorePreset: preset with id " + preset.Settings.Identifier + " has no path!");
                return;
            }
            SettingsSerializer serializer = new SettingsSerializer();

            serializer.StoreSettings(this, preset, false);
        }
        public MachineModel CreateDerivedMachine(Manufacturer mfg, MachineModel derivedFrom, MachinePreset initialPreset, string name)
        {
            string existingMachineDir = Path.GetDirectoryName(initialPreset.SourcePath);
            string useMfgDir          = Directory.GetParent(existingMachineDir).FullName;

            string newMachineDir = Path.Combine(useMfgDir, name);

            if (Directory.Exists(newMachineDir))
            {
                throw new Exception("ALREADY_EXISTS");
            }
            try {
                Directory.CreateDirectory(newMachineDir);
            } catch (Exception) {
                throw new Exception("CANNOT_CREATE");
            }
            if (!Directory.Exists(newMachineDir))
            {
                throw new Exception("ALREADY_EXISTS");
            }

            string newPresetPath = Path.Combine(newMachineDir, "Default.txt");

            MachineModel model = new MachineModel()
            {
                Name = name,
                UUID = System.Guid.NewGuid().ToString()
            };

            add_machine(mfg, model, false);

            MachinePreset newPreset = new MachinePreset(initialPreset.Settings.CloneAs <PlanarAdditiveSettings>(), newPresetPath);

            newPreset.Settings.Identifier = "Defaults";

            newPreset.Settings.BaseMachine.ManufacturerName = mfg.Name;
            newPreset.Settings.BaseMachine.ManufacturerUUID = mfg.UUID;
            newPreset.Settings.BaseMachine.ModelIdentifier  = model.Name;
            newPreset.Settings.BaseMachine.ModelUUID        = model.UUID;

            SettingsSerializer serializer = new SettingsSerializer();

            serializer.StoreSettings(this, newPreset, true);

            model.Presets.Add(newPreset);
            model.DefaultPreset = newPreset;

            return(model);
        }
        public MachinePreset CreateDerivedPreset(MachineModel model, MachinePreset derivedFrom, string name)
        {
            string machineDir = Path.GetDirectoryName(derivedFrom.SourcePath);
            string newPath    = Path.Combine(machineDir, name + ".txt");

            MachinePreset newPreset = new MachinePreset(derivedFrom.Settings.CloneAs <PlanarAdditiveSettings>(), newPath);

            newPreset.Settings.Identifier = name;
            SettingsSerializer serializer = new SettingsSerializer();

            serializer.StoreSettings(this, newPreset, true);

            //model.Presets.Add(newPreset);
            model.Presets.Insert(1, newPreset);
            return(newPreset);
        }
        public MachineModel CreateManufacturer(string mfgName, string mfgUUID, string defaultMachineUUID)
        {
            Manufacturer new_mfg = new Manufacturer()
            {
                Name = mfgName, UUID = mfgUUID
            };

            add_manufacturer(new_mfg);

            MachinePreset preset = new MachinePreset(new GenericPrinterSettings(mfgName, mfgUUID, defaultMachineUUID));

            MachineModel model = new MachineModel()
            {
                Name    = "Unknown", UUID = defaultMachineUUID,
                Presets = new List <MachinePreset>()
                {
                    preset
                }
            };

            add_machine(new_mfg, model);

            SettingsSerializer serializer  = new SettingsSerializer();
            string             machinePath = serializer.CreateNewSettingsFolder(this, new_mfg, model, cotangent.CCOptions.SettingsDBPath);

            preset.Settings.Identifier = "Defaults";
            preset.Settings.BaseMachine.ManufacturerName = mfgName;
            preset.Settings.BaseMachine.ManufacturerUUID = mfgUUID;
            preset.Settings.BaseMachine.ModelIdentifier  = "(Unknown)";
            preset.Settings.BaseMachine.ModelUUID        = defaultMachineUUID;

            preset.SourcePath = Path.Combine(machinePath, "Default.txt");
            serializer.StoreSettings(this, preset, true);

            model.Presets.Add(preset);
            model.DefaultPreset = preset;

            return(model);
        }
        /// <summary>
        /// Scan through a top-level 'manufacturer' folder for a list of machine folders,
        /// and then restore any settings files from each of those.
        /// </summary>
        bool read_manufacturer(string mfgPath, ref List <MachinePreset> presetsForModels)
        {
            SettingsSerializer serializer = new SettingsSerializer();

            string[] folders = Directory.GetDirectories(mfgPath);
            foreach (string machineFolder in folders)
            {
                List <PlanarAdditiveSettings> settings;
                List <string> sourceFilePaths;
                if (serializer.RestoreFromFolder(machineFolder, out settings, out sourceFilePaths) == false)
                {
                    DebugUtil.Log(2, "MachineDatabase: did not find any valid settings files in folder " + machineFolder);
                    continue;
                }

                for (int i = 0; i < settings.Count; ++i)
                {
                    MachinePreset preset = new MachinePreset(settings[i], sourceFilePaths[i]);
                    presetsForModels.Add(preset);
                }
            }

            return(presetsForModels.Count > 0);
        }