Esempio n. 1
0
        public static void GetExtrudersUsed(List <bool> extrudersUsed, IEnumerable <IObject3D> printableItems, PrinterSettings settings, bool checkForMeshFile)
        {
            extrudersUsed.Clear();

            if (!printableItems.Any())
            {
                return;
            }

            int extruderCount = settings.GetValue <int>(SettingsKey.extruder_count);

            // Make sure we only consider 1 extruder if in spiral vase mode
            if (settings.GetValue <bool>(SettingsKey.spiral_vase) &&
                extrudersUsed.Count(used => used == true) > 1)
            {
                extruderCount = 1;
            }

            for (int extruderIndex = 0; extruderIndex < extruderCount; extruderIndex++)
            {
                extrudersUsed.Add(false);
            }

            // If we have support enabled and are using an extruder other than 0 for it
            if (printableItems.Any(i => i.WorldOutputType() == PrintOutputTypes.Support))
            {
                if (settings.GetValue <int>(SettingsKey.support_material_extruder) != 0)
                {
                    int supportExtruder = Math.Max(0, Math.Min(extruderCount - 1, settings.GetValue <int>(SettingsKey.support_material_extruder)));
                    extrudersUsed[supportExtruder] = true;
                }

                if (settings.GetValue <int>(SettingsKey.support_material_interface_extruder) != 0)
                {
                    int supportExtruder = Math.Max(0, Math.Min(extruderCount - 1, settings.GetValue <int>(SettingsKey.support_material_interface_extruder)));
                    extrudersUsed[supportExtruder] = true;
                }
            }

            // If we have raft enabled and are using an extruder other than 0 for it
            if (settings.GetValue <bool>(SettingsKey.create_raft))
            {
                if (settings.GetValue <int>(SettingsKey.raft_extruder) != 0)
                {
                    int raftExtruder = Math.Max(0, Math.Min(extruderCount - 1, settings.GetValue <int>(SettingsKey.raft_extruder) - 1));
                    extrudersUsed[raftExtruder] = true;
                }
            }

            for (int extruderIndex = 0; extruderIndex < extruderCount; extruderIndex++)
            {
                IEnumerable <IObject3D> itemsThisExtruder = GetItemsForExtruder(printableItems, extruderCount, extruderIndex, checkForMeshFile);
                extrudersUsed[extruderIndex] |= itemsThisExtruder.Any();
            }
        }
Esempio n. 2
0
        public void Merge(PrinterSettingsLayer destinationLayer, PrinterSettings settingsToImport, List <PrinterSettingsLayer> rawSourceFilter, bool setLayerName)
        {
            HashSet <string> skipKeys = new HashSet <string>
            {
                "layer_id",
            };

            if (!setLayerName)
            {
                skipKeys.Add(SettingsKey.layer_name);
            }

            var destinationFilter = new List <PrinterSettingsLayer>
            {
                OemLayer,
                BaseLayer,
                destinationLayer,
            }.Where(layer => layer != null);

            var sourceFilter = rawSourceFilter.Where(layer => layer != null);

            foreach (var keyName in PrinterSettings.KnownSettings)
            {
                if (settingsToImport.Contains(keyName))
                {
                    // Compare the value to import to the layer cascade value and only set if different
                    string currentValue = this.GetValue(keyName, destinationFilter).Trim();
                    string importValue  = settingsToImport.GetValue(keyName, sourceFilter).Trim();

                    if (!string.IsNullOrEmpty(importValue) &&
                        currentValue != keyName &&
                        !skipKeys.Contains(keyName))
                    {
                        destinationLayer[keyName] = importValue;
                    }
                }
            }

            if (setLayerName)
            {
                destinationLayer[SettingsKey.layer_name] = settingsToImport.GetValue(SettingsKey.layer_name, sourceFilter);
            }

            this.Save();

            ApplicationController.Instance.ReloadAdvancedControlsPanel();
        }
Esempio n. 3
0
        public static void RefreshActiveInstance(PrinterSettings updatedProfile)
        {
            bool themeChanged = activeInstance.GetValue(SettingsKey.active_theme_name) != updatedProfile.GetValue(SettingsKey.active_theme_name);

            activeInstance = updatedProfile;

            ActiveSliceSettings.SettingChanged.CallEvents(null, new StringEventArgs(SettingsKey.printer_name));

            if (themeChanged)
            {
                UiThread.RunOnIdle(() => SwitchToPrinterTheme(true));
            }
            else
            {
                UiThread.RunOnIdle(ApplicationController.Instance.ReloadAdvancedControlsPanel);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Loads the specified PrinterProfile, performing recovery options if required
        /// </summary>
        /// <param name="profileID">The profile ID to load</param>
        /// <param name="useActiveInstance">Return the in memory instance if already loaded. Alternatively, reload from disk</param>
        /// <returns></returns>
        public static async Task <PrinterSettings> LoadProfileAsync(string profileID, bool useActiveInstance = true)
        {
            var activePrinter = ApplicationController.Instance.ActivePrinter;

            if (useActiveInstance && activePrinter.Settings.ID == profileID)
            {
                return(activePrinter.Settings);
            }

            // Only load profiles by ID that are defined in the profiles document
            var printerInfo = Instance[profileID];

            if (printerInfo == null)
            {
                return(null);
            }

            // Attempt to load from disk, pull from the web or fall back using recovery logic
            PrinterSettings printerSettings = Instance.LoadWithoutRecovery(profileID);

            if (printerSettings != null)
            {
                // Make sure we have the name set
                if (printerSettings.GetValue(SettingsKey.printer_name) == "")
                {
                    // This can happen when a profile is pushed to a user account from the web.
                    printerSettings.SetValue(SettingsKey.printer_name, printerInfo.Name);
                }
                return(printerSettings);
            }
            else if (ApplicationController.GetPrinterProfileAsync != null)
            {
                // Attempt to load from MCWS if missing on disk
                printerSettings = await ApplicationController.GetPrinterProfileAsync(printerInfo, null);

                if (printerSettings != null)
                {
                    // If successful, persist downloaded profile and return
                    printerSettings.Save();
                    return(printerSettings);
                }
            }

            // Otherwise attempt to recover to a working profile
            return(await PrinterSettings.RecoverProfile(printerInfo));
        }
Esempio n. 5
0
        public double ExtruderTargetTemperature(int extruderIndex)
        {
            if (extruderIndex == 0)
            {
                return(printerSettings.GetValue <double>(SettingsKey.temperature));
            }
            else
            {
                // Check if there is a material override for this extruder
                // Otherwise, use the SettingsLayers that is bound to this extruder
                if (extruderIndex < printerSettings.GetValue <int>(SettingsKey.extruder_count))
                {
                    return(printerSettings.GetValue <double>($"{SettingsKey.temperature}{extruderIndex}"));
                }

                // else return the normal settings cascade
                return(printerSettings.GetValue <double>(SettingsKey.temperature));
            }
        }
Esempio n. 6
0
        internal static bool ImportFromExisting(string settingsFilePath)
        {
            if (string.IsNullOrEmpty(settingsFilePath) || !File.Exists(settingsFilePath))
            {
                return(false);
            }

            string fileName             = Path.GetFileNameWithoutExtension(settingsFilePath);
            var    existingPrinterNames = Instance.ActiveProfiles.Select(p => p.Name);

            var printerInfo = new PrinterInfo
            {
                Name  = agg_basics.GetNonCollidingName(existingPrinterNames, fileName),
                ID    = Guid.NewGuid().ToString(),
                Make  = "Other",
                Model = "Other",
            };

            bool importSuccessful = false;

            string importType = Path.GetExtension(settingsFilePath).ToLower();

            switch (importType)
            {
            case ProfileManager.ProfileExtension:
                // Add the Settings as a profile before performing any actions on it to ensure file paths resolve
            {
                Instance.Profiles.Add(printerInfo);

                var printerSettings = PrinterSettings.LoadFile(settingsFilePath);
                printerSettings.ID = printerInfo.ID;
                printerSettings.ClearValue(SettingsKey.device_token);
                printerInfo.DeviceToken = "";

                // TODO: Resolve name conflicts
                printerSettings.Helpers.SetName(printerInfo.Name);

                if (printerSettings.OemLayer.ContainsKey(SettingsKey.make))
                {
                    printerInfo.Make = printerSettings.OemLayer[SettingsKey.make];
                }

                if (printerSettings.OemLayer.ContainsKey(SettingsKey.model))
                {
                    printerInfo.Model = printerSettings.OemLayer[SettingsKey.model] ?? "Other";
                }

                printerSettings.Save();
                importSuccessful = true;
            }
            break;

            case ".ini":
                //Scope variables
            {
                var settingsToImport = PrinterSettingsLayer.LoadFromIni(settingsFilePath);
                var printerSettings  = new PrinterSettings()
                {
                    ID = printerInfo.ID,
                };

                bool containsValidSetting = false;

                printerSettings.OemLayer = new PrinterSettingsLayer();

                printerSettings.OemLayer[SettingsKey.make]  = "Other";
                printerSettings.OemLayer[SettingsKey.model] = "Other";

                foreach (var item in settingsToImport)
                {
                    if (printerSettings.Contains(item.Key))
                    {
                        containsValidSetting = true;
                        string currentValue = printerSettings.GetValue(item.Key).Trim();
                        // Compare the value to import to the layer cascade value and only set if different
                        if (currentValue != item.Value)
                        {
                            printerSettings.OemLayer[item.Key] = item.Value;
                        }
                    }
                }

                if (containsValidSetting)
                {
                    printerSettings.UserLayer[SettingsKey.printer_name] = printerInfo.Name;

                    printerSettings.ClearValue(SettingsKey.device_token);
                    printerInfo.DeviceToken = "";

                    printerInfo.Make  = printerSettings.OemLayer[SettingsKey.make] ?? "Other";
                    printerInfo.Model = printerSettings.OemLayer[SettingsKey.model] ?? "Other";

                    Instance.Profiles.Add(printerInfo);

                    printerSettings.Helpers.SetName(printerInfo.Name);

                    printerSettings.Save();
                    importSuccessful = true;
                }
            }
            break;
            }
            return(importSuccessful);
        }
Esempio n. 7
0
        internal static void AcquireNewProfile(string make, string model, string printerName)
        {
            string guid = Guid.NewGuid().ToString();

            OemProfile oemProfile = LoadHttpOemProfile(make, model);

            var layeredProfile = new PrinterSettings()
            {
                ID = guid,
                // TODO: This should really be set by the system that generates the source documents
                DocumentVersion = PrinterSettings.LatestVersion,
                OemLayer        = oemProfile.OemLayer
            };

            layeredProfile.UserLayer[SettingsKey.printer_name.ToString()] = printerName;

            // Import named macros as defined in the following printers: (Airwolf Axiom, HD, HD-R, HD2x, HDL, HDx, Me3D Me2, Robo R1[+])
            var classicDefaultMacros = layeredProfile.GetValue("default_macros");

            if (!string.IsNullOrEmpty(classicDefaultMacros))
            {
                var namedMacros = new Dictionary <string, string>();
                namedMacros["Lights On"]  = "M42 P6 S255";
                namedMacros["Lights Off"] = "M42 P6 S0";
                namedMacros["Offset 0.8"] = "M565 Z0.8;\nM500";
                namedMacros["Offset 0.9"] = "M565 Z0.9;\nM500";
                namedMacros["Offset 1"]   = "M565 Z1;\nM500";
                namedMacros["Offset 1.1"] = "M565 Z1.1;\nM500";
                namedMacros["Offset 1.2"] = "M565 Z1.2;\nM500";
                namedMacros["Z Offset"]   = "G1 Z10;\nG28;\nG29;\nG1 Z10;\nG1 X5 Y5 F4000;\nM117;";

                foreach (string namedMacro in classicDefaultMacros.Split(','))
                {
                    string gcode;
                    if (namedMacros.TryGetValue(namedMacro.Trim(), out gcode))
                    {
                        layeredProfile.Macros.Add(new GCodeMacro()
                        {
                            Name  = namedMacro.Trim(),
                            GCode = gcode
                        });
                    }
                }
            }

            // Copy OemProfile presets into user layers
            foreach (var materialPreset in oemProfile.MaterialLayers)
            {
                layeredProfile.MaterialLayers.Add(materialPreset);
            }
            foreach (var qualityPreset in oemProfile.QualityLayers)
            {
                layeredProfile.QualityLayers.Add(qualityPreset);
            }

            layeredProfile.Save();

            Instance.Profiles.Add(new PrinterInfo
            {
                Name = printerName,
                ID   = guid
            });

            UserSettings.Instance.set("ActiveProfileID", guid);

            ActiveSliceSettings.Instance = new SettingsProfile(layeredProfile);
        }
        public string ExtruderTemperature(int extruderIndex)
        {
            if (extruderIndex >= printerSettings.MaterialSettingsKeys.Count)
            {
                // MaterialSettingsKeys is empty or lacks a value for the given extruder index
                //
                // If extruder index zero was requested, return the layer cascade temperature value, otherwise null
                return((extruderIndex == 0) ? printerSettings.GetValue("temperature") : null);
            }

            string materialKey = printerSettings.MaterialSettingsKeys[extruderIndex];

            if (extruderIndex == 0 && (string.IsNullOrEmpty(materialKey) || printerSettings.UserLayer.ContainsKey("temperature")))
            {
                // In the case where a user override exists or MaterialSettingsKeys is populated with multiple extruder
                // positions but position 0 is empty and thus unassigned, use layer cascade to resolve temp
                return(printerSettings.GetValue("temperature"));
            }

            // Otherwise, use the SettingsLayers that is bound to this extruder
            PrinterSettingsLayer layer = printerSettings.GetMaterialLayer(materialKey);

            string result = "0";

            layer?.TryGetValue("temperature", out result);
            return(result);
        }
Esempio n. 9
0
        public double ExtruderTemperature(int extruderIndex)
        {
            if (extruderIndex == 0)
            {
                return(printerSettings.GetValue <double>(SettingsKey.temperature));
            }
            else
            {
                // Check if there is a material override for this extruder
                // Otherwise, use the SettingsLayers that is bound to this extruder
                if (extruderIndex < printerSettings.MaterialSettingsKeys.Count)
                {
                    string materialKey         = printerSettings.MaterialSettingsKeys[extruderIndex];
                    PrinterSettingsLayer layer = printerSettings.GetMaterialLayer(materialKey);

                    if (layer != null)
                    {
                        string result = "0";
                        if (layer.TryGetValue(SettingsKey.temperature, out result))
                        {
                            double value = 0;
                            if (double.TryParse(result, out value))
                            {
                                return(value);
                            }
                        }
                    }
                }

                // else return the normal settings cascade
                return(printerSettings.GetValue <double>(SettingsKey.temperature));
            }
        }
Esempio n. 10
0
 ///<summary>
 ///Returns the first matching value discovered while enumerating the settings layers
 ///</summary>
 public string GetValue(string sliceSetting, IEnumerable <PrinterSettingsLayer> layerCascade = null)
 {
     return(layeredProfile.GetValue(sliceSetting, layerCascade));
 }