From 1ba3475c3208e7c1fe74cf638b1b2a4bc80fea2d Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Wed, 19 Sep 2018 12:12:57 +0200 Subject: [PATCH] Fix queue storage in the db --- Client/Browser_Tools/BrowserJSObject.cs | 196 +++++++----------- Libs/CMS_CORE_Library.dll | Bin 9089024 -> 9089024 bytes .../Controllers/NcToolManagerController.cs | 1 + Step.Database/Controllers/QueueController.cs | 31 ++- Step.NC/NcHandler.cs | 70 ++++--- 5 files changed, 151 insertions(+), 147 deletions(-) diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index da31711b..ccbe27ac 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -1,5 +1,4 @@ using Chromium; -using Chromium.Remote; using Chromium.Remote.Event; using Chromium.WebBrowser; using Client.Config; @@ -13,15 +12,11 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; -using System.Drawing; -using System.Drawing.Imaging; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; -using System.Text; using System.Threading; -using System.Threading.Tasks; using System.Windows.Forms; using static Client.Utils.Constants; @@ -29,15 +24,17 @@ namespace CMS_Client.Browser_Tools { public class BrowserJSObject : JSObject { - //The first letter of All PUBLIC Variables and Methods must be Lower-Case (CEF Settings) + // The first letter of All PUBLIC Variables and Methods must be Lower-Case (CEF Settings) private MainForm mainForm; - private static readonly string[] _validExtensions = { "",".txt", ".cnc", ".ini", ".mpf", ".spf" }; + private static readonly string[] _validExtensions = { "", ".txt", ".cnc", ".ini", ".mpf", ".spf" }; private static readonly string[] _validImages = { ".jpg", ".jpeg", ".png" }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region CONSTRUCTOR_METHOD - //Constructor Method + + // Constructor Method public BrowserJSObject(MainForm f) { mainForm = f; @@ -54,7 +51,7 @@ namespace CMS_Client.Browser_Tools AddFunction("getChromiumVersion").Execute += getChromiumVersion; AddFunction("getClientID").Execute += getClientID; AddFunction("getConfiguredProcesses").Execute += getConfiguredProcesses; - AddFunction("getConfiguredProcessesInMainMenu").Execute += getConfiguredProcessesInMainMenu; + AddFunction("getConfiguredProcessesInMainMenu").Execute += getConfiguredProcessesInMainMenu; AddFunction("startNewProcess").Execute += startNewProcess; AddFunction("openOrStartProcess").Execute += openOrStartProcess; AddFunction("isVirtualKeybConfigured").Execute += isVirtualKeybConfigured; @@ -72,12 +69,13 @@ namespace CMS_Client.Browser_Tools AddFunction("delPPFromJob").Execute += delPPFromJob; } - #endregion + #endregion CONSTRUCTOR_METHOD /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region FORM_BEHAVIOUR_METHODS - //Minimize Main Window + // Minimize Main Window public void minimizeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode @@ -86,16 +84,13 @@ namespace CMS_Client.Browser_Tools { mainForm.WindowState = FormWindowState.Minimized; }); - else { mainForm.WindowState = FormWindowState.Minimized; } } - - - //Maximize Main Window + // Maximize Main Window public void maximizeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode @@ -104,16 +99,13 @@ namespace CMS_Client.Browser_Tools { mainForm.WindowState = FormWindowState.Maximized; }); - else { mainForm.WindowState = FormWindowState.Maximized; } } - - - //Close Main Window + // Close Main Window public void closeForm(object sender, CfrV8HandlerExecuteEventArgs e) { //If the mainform is disposed do nothing @@ -124,16 +116,17 @@ namespace CMS_Client.Browser_Tools mainForm.Close(); } - //Reload Broken Page + // Reload Broken Page private void reloadBrokenPage(object sender, CfrV8HandlerExecuteEventArgs e) { //Invoke method if is needed or call the method in STD mode mainForm.reloadBrokenPage(); } - #endregion + #endregion FORM_BEHAVIOUR_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region NC_BEHAVIOUR_METHODS public void setNcWindowState(object sender, CfrV8HandlerExecuteEventArgs e) @@ -161,23 +154,25 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(NcWindow.NcCapture); } - #endregion + #endregion NC_BEHAVIOUR_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region CHROMIUM_METHODS - //Get the Version of Chromium + // Get the Version of Chromium public void getChromiumVersion(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue(CfxRuntime.GetChromeVersion()); } - #endregion + #endregion CHROMIUM_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region STEP_METHODS - //Get the ID of STEP Client + // Get the ID of STEP Client public void getClientID(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue((int)Config.ConnectionConfig.Id); @@ -188,31 +183,31 @@ namespace CMS_Client.Browser_Tools NcWindow.ForceStepFocus(); } - //Get the option of virtual Keyb configured + // Get the option of virtual Keyb configured private void isVirtualKeybConfigured(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue((Boolean)Config.ClientConfig.ShowVirtualKeyboard); } - #endregion + + #endregion STEP_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region PROCESSES_METHODS - //Read all configured processes + // Read all configured processes public void getConfiguredProcesses(object sender, CfrV8HandlerExecuteEventArgs e) { - e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar==false))); - } + e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == false))); + } - //Read all configured processes in main menu + // Read all configured processes in main menu public void getConfiguredProcessesInMainMenu(object sender, CfrV8HandlerExecuteEventArgs e) { e.SetReturnValue(JsonConvert.SerializeObject(Config.ExtSoftwaresConfig.Where(X => X.inMainMenuBar == true))); } - - - //Start a new process + // Start a new process public void startNewProcess(object sender, CfrV8HandlerExecuteEventArgs e) { if (e.Arguments.Count() == 0) @@ -222,9 +217,7 @@ namespace CMS_Client.Browser_Tools t.Start(e.Arguments[0].StringValue); } - - - //Open the last window or Start a new process + // Open the last window or Start a new process public void openOrStartProcess(object sender, CfrV8HandlerExecuteEventArgs e) { if (e.Arguments.Count() == 0) @@ -234,8 +227,7 @@ namespace CMS_Client.Browser_Tools t.Start(e.Arguments[0].StringValue); } - - //Function used in Thread + // Function used in Thread private void OpenStartNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); @@ -251,21 +243,21 @@ namespace CMS_Client.Browser_Tools } } - - //Function used in Thread + // Function used in Thread private void OpenNew(object id) { Software sft = Config.ExtSoftwaresConfig.FirstOrDefault(X => X.id == (string)id); if (sft != null) Process.Start(sft.path, sft.arguments); } - #endregion + #endregion PROCESSES_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region FILESYSTEM_METHODS - //Read all drives in Operating System + // Read all drives in Operating System public void getOSdriveList(object sender, CfrV8HandlerExecuteEventArgs e) { List drivelist = new List(); @@ -290,8 +282,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(drivelist)); } - - //Read all files in directory + // Read all files in directory public void getFileList(object sender, CfrV8HandlerExecuteEventArgs e) { List filelist = new List(); @@ -312,7 +303,6 @@ namespace CMS_Client.Browser_Tools { foreach (String item in Directory.GetDirectories(p)) { - filelist.Add(new Models.File { Name = Path.GetFileName(item), @@ -320,7 +310,6 @@ namespace CMS_Client.Browser_Tools Path = Path.GetFullPath(item), IsDirectory = true }); - } } catch (Exception ex) @@ -338,7 +327,6 @@ namespace CMS_Client.Browser_Tools Path = Path.GetFullPath(item), IsDirectory = false }); - } } catch (Exception ex) @@ -348,8 +336,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(filelist)); } - - //Upload and activate the program + // Upload and activate the program public async void uploadAndActivateProgram(object sender, CfrV8HandlerExecuteEventArgs e) { String fileToUpload = ""; @@ -362,7 +349,7 @@ namespace CMS_Client.Browser_Tools //Check the arguments numbers if (e.Arguments.Length < 1 || e.Arguments[0] == null) { - e.SetReturnValue(Constants.Uploadpage +"INVALID_ARGUMENTS"); + e.SetReturnValue(Constants.Uploadpage + "INVALID_ARGUMENTS"); return; } @@ -370,7 +357,7 @@ namespace CMS_Client.Browser_Tools fileToUpload = e.Arguments[0].StringValue; if (!System.IO.File.Exists(fileToUpload)) { - e.SetReturnValue(Constants.Uploadpage+";FILE_NOT_FOUND"); + e.SetReturnValue(Constants.Uploadpage + ";FILE_NOT_FOUND"); return; } @@ -399,7 +386,7 @@ namespace CMS_Client.Browser_Tools //Add the content to the form form.Add(new ByteArrayContent(filecontent), "file", fileName); - if(imagecontent != null) + if (imagecontent != null) form.Add(new ByteArrayContent(imagecontent), "image", imageName); //Send them @@ -407,17 +394,16 @@ namespace CMS_Client.Browser_Tools "http://" + Config.ConnectionConfig.ServerUrl + ":" + Config.ConnectionConfig.ServerPort + "/" + Constants.Uploadpage, form).Result; //Wait the answer - if(response.StatusCode == System.Net.HttpStatusCode.BadRequest) + if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) e.SetReturnValue(Constants.Uploadpage + ";" + await response.Content.ReadAsStringAsync()); - else if(response.StatusCode != System.Net.HttpStatusCode.OK) + else if (response.StatusCode != System.Net.HttpStatusCode.OK) e.SetReturnValue(Constants.Uploadpage + ";" + response.ReasonPhrase); else e.SetReturnValue(""); } - } - //Upload and add to queue + // Upload and add to queue public async void uploadAndAddToQueue(object sender, CfrV8HandlerExecuteEventArgs e) { string fileToUpload = ""; @@ -488,11 +474,9 @@ namespace CMS_Client.Browser_Tools else e.SetReturnValue(""); } - } - - //Read info of a file + // Read info of a file public void getProgramInfo(object sender, CfrV8HandlerExecuteEventArgs e) { InfoFile file = new InfoFile(); @@ -523,7 +507,6 @@ namespace CMS_Client.Browser_Tools file.Content = new List(); try { - StreamReader fileRead = new StreamReader(p); while ((line = fileRead.ReadLine()) != null && counter < 10) { @@ -540,7 +523,6 @@ namespace CMS_Client.Browser_Tools break; } } - } catch (Exception ex) { @@ -549,8 +531,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(file)); } - - //Private functions... + // Private functions private String ElaborateName(String name, DriveType type) { if (!String.IsNullOrWhiteSpace(name)) @@ -565,7 +546,6 @@ namespace CMS_Client.Browser_Tools } return "Undefined Drive"; } - } private String ElaborateType(DriveType type) @@ -577,15 +557,15 @@ namespace CMS_Client.Browser_Tools case DriveType.Network: return "NTW"; } return "SPFO"; - } - #endregion + #endregion FILESYSTEM_METHODS /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + #region JOB_METHODS - - //Read all job + + // Read all job public void openJob(object sender, CfrV8HandlerExecuteEventArgs e) { JobToStep job = new JobToStep(); @@ -602,14 +582,13 @@ namespace CMS_Client.Browser_Tools using (ZipArchive archive = ZipFile.OpenRead(jobOpenFileDialog.FileName)) { - - //Setup main Fields + // Setup main Fields job.Name = Path.GetFileName(jobOpenFileDialog.FileName); job.LastEditTimestamp = new FileInfo(jobOpenFileDialog.FileName).LastAccessTime; foreach (ZipArchiveEntry entry in archive.Entries) { - //Main program + // Main program if (entry.Name.Equals(JOB_MAIN_FILENAME, StringComparison.OrdinalIgnoreCase)) { using (var reader = new StreamReader(entry.Open())) @@ -617,7 +596,7 @@ namespace CMS_Client.Browser_Tools job.IsoMainProgram = (reader.ReadToEnd()); } } - //Add all images + // Add all images else if (_validImages.Contains(Path.GetExtension(entry.Name).ToLower())) { var bytes = default(byte[]); @@ -627,21 +606,21 @@ namespace CMS_Client.Browser_Tools entry.Open().CopyTo(memstream); bytes = memstream.ToArray(); job.Metadata.Generics.Images.Add(new Image_param() - { - Name = Path.GetFileNameWithoutExtension(entry.Name), - Base64 = "data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes) - }); + { + Name = Path.GetFileNameWithoutExtension(entry.Name), + Base64 = "data:image/" + Path.GetExtension(entry.Name).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(bytes) + }); } } - //Metadata - else if(entry.Name.Equals(JOB_METADATA_FILENAME, StringComparison.OrdinalIgnoreCase)) + // Metadata + else if (entry.Name.Equals(JOB_METADATA_FILENAME, StringComparison.OrdinalIgnoreCase)) { MetadataToFile metasFromFile = new MetadataToFile(); using (var reader = new StreamReader(entry.Open())) { metasFromFile = JsonConvert.DeserializeObject(reader.ReadToEnd()); - if(metasFromFile == null) + if (metasFromFile == null) { e.SetReturnValue(null); return; @@ -661,7 +640,6 @@ namespace CMS_Client.Browser_Tools entry.ExtractToFile(JOB_OPENING_PATH + entry.Name, true); } } - } e.SetReturnValue(JsonConvert.SerializeObject(job)); return; @@ -673,9 +651,7 @@ namespace CMS_Client.Browser_Tools } } - - - //Save all job + // Save all job public void saveJob(object sender, CfrV8HandlerExecuteEventArgs e) { MetadataToFile metafile = new MetadataToFile(); @@ -687,7 +663,7 @@ namespace CMS_Client.Browser_Tools //Call Save Dialog SaveFileDialog jobSaveFileDialog = new SaveFileDialog(); jobSaveFileDialog.Filter = "CMS Job Files(*.JOB)|*.job|Zip Files(*.ZIP)|*.zip"; - if(jobSaveFileDialog.ShowDialog() == DialogResult.OK) + if (jobSaveFileDialog.ShowDialog() == DialogResult.OK) { // Job deserialize JobToStep job = JsonConvert.DeserializeObject(e.Arguments[0].StringValue); @@ -696,7 +672,7 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("corrupted_model"))); return; } - + //Metadata metafile.Description = job.Metadata.Generics.Description; metafile.ExecutionTime = job.Metadata.Generics.ExecutionTime; @@ -715,18 +691,15 @@ namespace CMS_Client.Browser_Tools //delete Zip File if exists if (System.IO.File.Exists(jobSaveFileDialog.FileName)) System.IO.File.Delete(jobSaveFileDialog.FileName); - + //Create Zip File ZipFile.CreateFromDirectory(JOB_OPENING_PATH, jobSaveFileDialog.FileName); - } e.SetReturnValue(null); return; } - - - //Add an image + // Add an image public void addImageToJob(object sender, CfrV8HandlerExecuteEventArgs e) { OpenFileDialog imageOpenFileDialog = new OpenFileDialog(); @@ -742,25 +715,23 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(JsonConvert.SerializeObject(new ErrorContainer("file_esists"))); return; } - + //Copy the file System.IO.File.Copy(imageOpenFileDialog.FileName, newImagePath); //Send to Step e.SetReturnValue(JsonConvert.SerializeObject(new Image_param() - { - Name = Path.GetFileNameWithoutExtension(imageOpenFileDialog.FileName), - Base64 = "data:image/" + Path.GetExtension(newImagePath).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(System.IO.File.ReadAllBytes(newImagePath)) - })); + { + Name = Path.GetFileNameWithoutExtension(imageOpenFileDialog.FileName), + Base64 = "data:image/" + Path.GetExtension(newImagePath).ToLower().TrimStart('.') + ";base64," + Convert.ToBase64String(System.IO.File.ReadAllBytes(newImagePath)) + })); return; } e.SetReturnValue(null); return; } - - - //Delete an image + // Delete an image public void delImageFromJob(object sender, CfrV8HandlerExecuteEventArgs e) { //check the arguments @@ -781,12 +752,10 @@ namespace CMS_Client.Browser_Tools System.IO.File.Delete(imagePath); e.SetReturnValue(null); - return; + return; } - - - //Add a Part-Program + // Add a Part-Program public void addPPToJob(object sender, CfrV8HandlerExecuteEventArgs e) { OpenFileDialog PPOpenFileDialog = new OpenFileDialog(); @@ -815,15 +784,12 @@ namespace CMS_Client.Browser_Tools //Send to Step e.SetReturnValue(null); return; - } e.SetReturnValue(null); return; } - - - //Delete an image + // Delete an image public void delPPFromJob(object sender, CfrV8HandlerExecuteEventArgs e) { //check the arguments @@ -845,10 +811,9 @@ namespace CMS_Client.Browser_Tools e.SetReturnValue(null); return; - } + } - - //Clear the temp folder files + // Clear the temp folder files private void ClearTempPath() { DirectoryInfo di = new DirectoryInfo(JOB_OPENING_PATH); @@ -858,20 +823,19 @@ namespace CMS_Client.Browser_Tools dir.Delete(true); } - - //Clear the temp folder files + // Clear the temp folder files private string GetExtensionFromBase64(string base64img) { - base64img = base64img.Remove(0,"data:image/".Length); + base64img = base64img.Remove(0, "data:image/".Length); return base64img.Substring(0, base64img.IndexOf(";base64,")); } - //Clear the temp folder files private string GetContentFromBase64(string base64img) { return base64img.Substring(base64img.IndexOf(";base64,") + ";base64,".Length); } - #endregion + + #endregion JOB_METHODS } -} +} \ No newline at end of file diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index b903a8c06f4cf256b10e63a12399031f0beb40b4..87bda1114ebbf0b69f21beace685436defacca05 100644 GIT binary patch delta 61157 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ℑp}2?_zca^oy+QI^HYB)dT{;^53R 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 p!~a@f-O99H4L9ShxYcQA=Enx@czR9R!@z* x.Id == id && x.Process == processId).FirstOrDefault(); + // Update reps + item.Reps = reps; + item.RemainingReps = reps; + + dbCtx.SaveChanges(); + } + + public void DeleteItem(int processId, int id) + { + QueueItemsModel item = dbCtx.Queue.Where(x => x.Id == id && x.Process == processId).FirstOrDefault(); + + dbCtx.Queue.Remove(item); + + dbCtx.SaveChanges(); + } + public void ReadAndPopulateQueue() { var dbQueue = dbCtx.Queue.ToList(); - + bool foundData = false; foreach(var entity in dbQueue) { // Check if process queue exists @@ -73,7 +92,13 @@ namespace Step.Database.Controllers Status = (QUEUE_ITEM_STATUS)entity.Status }); - if((QUEUE_ITEM_STATUS)entity.Status == QUEUE_ITEM_STATUS.RUNNING) + if ((QUEUE_ITEM_STATUS)entity.Status != QUEUE_ITEM_STATUS.FINISHED && !foundData) + { + QueueRunningIndexes[entity.Process] = entity.Id - 1; + foundData = true; + } + + if ((QUEUE_ITEM_STATUS)entity.Status == QUEUE_ITEM_STATUS.RUNNING) QueueRunningIndexes[entity.Process] = entity.Id - 1; } } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 882ce641..838d69aa 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -307,7 +307,7 @@ namespace Step.NC // Check if queue exists for the process if (PartProgramQueue.ContainsKey(item.ProcessId) && PartProgramQueue[item.ProcessId].ElementAtOrDefault(QueueRunningIndexes[item.ProcessId]) != null) { - // Set status + // Set status based on queue status if (item.Status == QUEUE_STATUS.RUNNING || item.Status == QUEUE_STATUS.CLOSING) PartProgramQueue[item.ProcessId][QueueRunningIndexes[item.ProcessId]].Status = QUEUE_ITEM_STATUS.RUNNING; @@ -318,6 +318,11 @@ namespace Step.NC PartProgramQueue[item.ProcessId][QueueRunningIndexes[item.ProcessId]].Status = QUEUE_ITEM_STATUS.WAITING_OPERATOR; } } + // Update data + using (QueueController queueController = new QueueController()) + { + queueController.UpdateQueue(); + } return NO_ERROR; } @@ -342,33 +347,33 @@ namespace Step.NC return NO_ERROR; } - public CmsError SwapQueueItems(int processId, int item1Index, int item2Index) - { - item1Index = item1Index - 1; - item2Index = item2Index - 1; + //public CmsError SwapQueueItems(int processId, int item1Index, int item2Index) + //{ + // item1Index = item1Index - 1; + // item2Index = item2Index - 1; - // Check if there is a queue - if (!PartProgramQueue.ContainsKey(processId)) - return INCORRECT_PARAMETERS_ERROR; - // Check if items exists - if (PartProgramQueue[processId].ElementAtOrDefault(item1Index) == null || PartProgramQueue[processId].ElementAtOrDefault(item2Index) == null) - return INCORRECT_PARAMETERS_ERROR; + // // Check if there is a queue + // if (!PartProgramQueue.ContainsKey(processId)) + // return INCORRECT_PARAMETERS_ERROR; + // // Check if items exists + // if (PartProgramQueue[processId].ElementAtOrDefault(item1Index) == null || PartProgramQueue[processId].ElementAtOrDefault(item2Index) == null) + // return INCORRECT_PARAMETERS_ERROR; - // Create a item - DTOQueueModel tmp = PartProgramQueue[processId][item1Index]; + // // Create a item + // DTOQueueModel tmp = PartProgramQueue[processId][item1Index]; - // Swap item 1 with 2 - PartProgramQueue[processId][item1Index] = PartProgramQueue[processId][item2Index]; - // Swap 2 with tmp - PartProgramQueue[processId][item2Index] = tmp; + // // Swap item 1 with 2 + // PartProgramQueue[processId][item1Index] = PartProgramQueue[processId][item2Index]; + // // Swap 2 with tmp + // PartProgramQueue[processId][item2Index] = tmp; - // Swap ids - PartProgramQueue[processId][item2Index].Id = item2Index + 1; - // Swap 2 with tmp - PartProgramQueue[processId][item1Index].Id = item1Index + 1; + // // Swap ids + // PartProgramQueue[processId][item2Index].Id = item2Index + 1; + // // Swap 2 with tmp + // PartProgramQueue[processId][item1Index].Id = item1Index + 1; - return NO_ERROR; - } + // return NO_ERROR; + //} public CmsError MoveQueueItems(int processId, int itemId, int newIndex, out List queue) { @@ -402,9 +407,7 @@ namespace Step.NC queue = PartProgramQueue[processId]; using (QueueController queueController = new QueueController()) - { queueController.UpdateQueue(); - } return NO_ERROR; } @@ -428,6 +431,10 @@ namespace Step.NC model = PartProgramQueue[processId][itemIndex]; + // Update database + using (QueueController queueController = new QueueController()) + queueController.UpdateReps(processId, itemIndex, reps); + return NO_ERROR; } @@ -444,6 +451,10 @@ namespace Step.NC if (tmpQueueItem != null) PartProgramQueue[processId].Remove(tmpQueueItem); } + + // Update db + using (QueueController queueController = new QueueController()) + queueController.DeleteItem(processId, id); return NO_ERROR; } @@ -452,9 +463,11 @@ namespace Step.NC { // Check if there is a queue if (PartProgramQueue.ContainsKey(processId)) - { PartProgramQueue[processId] = new List(); - } + + // Update db + using (QueueController queueController = new QueueController()) + queueController.UpdateQueue(); return NO_ERROR; } @@ -1259,6 +1272,7 @@ namespace Step.NC { config.MultitoolOptionActive = false; categories.Add("shankType"); + config.ToolsConfiguration = config.ToolsConfiguration.Where(x => !(x.Name == "shankId")).ToList(); } if (!ToolManagerConfig.FamilyOpt) @@ -1736,7 +1750,7 @@ namespace Step.NC return cmsError; } - // Update tool + // R tool cmsError = UpdateNcTools(toolsManager); } }