/*-------------------------------------------------------------*/ private void btnSave_Click(object sender, EventArgs e) { using (SaveFileDialog saveDialog = new SaveFileDialog()) { saveDialog.Filter = "Project files|*.PrjPnp|CSV files|*.csv|Text Files|*.txt|All Files|*.*"; saveDialog.Title = "Save project"; saveDialog.FileName = projectName; saveDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (saveDialog.ShowDialog() == DialogResult.OK) { PnpProject project = new PnpProject(saveDialog.FileName); project.Machine = pnpMachine; project.ProjectName = projectName; project.ProjectFolder = folder; project.HorizontalOriginOffset = (float)bscOrigin.ValueX; project.VerticalOriginOffset = (float)bscOrigin.ValueY; project.BoardsX = (int)bscNumberOfBoards.ValueX; project.BoardsY = (int)bscNumberOfBoards.ValueX; project.DistanceX = (float)bscDistBetwBoards.ValueX; project.DistanceY = (float)bscDistBetwBoards.ValueY; project.BoardWidth = (float)bscDimensions.ValueX; project.BoardLength = (float)bscDimensions.ValueY; project.IncludedReels = reelsToPlace; project.ExcludedReels = excludedReels; project.StackListers = stacklisters; FileOperations.SaveProject(project); } } }
/*-------------------------------------------------------------*/ private void btnLoad_Click(object sender, EventArgs e) { try { using (OpenFileDialog openDialog = new OpenFileDialog()) { openDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); openDialog.Filter = "Project files|*.PrjPnp|CSV files|*.csv|Text Files|*.txt|All Files|*.*"; openDialog.Title = "Please select a pick and place project file..."; if (openDialog.ShowDialog() == DialogResult.OK) { PnpProject project = new PnpProject(openDialog.FileName); FileOperations.LoadProject(project); ClearPhases(); projectName = project.ProjectName; folder = project.ProjectFolder; bscOrigin.ValueX = (decimal)project.HorizontalOriginOffset; bscOrigin.ValueY = (decimal)project.VerticalOriginOffset; bscNumberOfBoards.ValueX = (decimal)project.BoardsX; bscNumberOfBoards.ValueY = (decimal)project.BoardsY; bscDistBetwBoards.ValueX = (decimal)project.DistanceX; bscDistBetwBoards.ValueY = (decimal)project.DistanceY; bscDimensions.ValueX = (decimal)project.BoardWidth; bscDimensions.ValueY = (decimal)project.BoardLength; reelsToPlace = project.IncludedReels; excludedReels = project.ExcludedReels; //stacklisters = project.StackListers; //pnpMachine = project.Machine; ChangeMachineType(project.Machine); stacklisters = project.StackListers; //UpdateListView(); (included in change machinetype) if (stacklisters.Count != 0) { for (int i = 0; i < stacklisters.Count; i++) { stacklisters[i].updateAllListsEvent += UpdateAllListsEvent; GenerateTabPage(stacklisters[i]); if (stacklisters[i].Layer == ReelLayer.Top) { stacklisters[i].SetTotalList(project.TopReels); } else { stacklisters[i].SetTotalList(project.BottomReels); } } this.pnlExportButtons.Enabled = true; } } } } catch (Exception exc) { MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// Save a pick and place project /// </summary> /// <param name="project">Project to save</param> public static void SaveProject(PnpProject project) { using (StreamWriter writer = new StreamWriter(project.Path)) { //part 1: project information writer.WriteLine("ProjectName=" + project.ProjectName); writer.WriteLine("ProjectFolder=" + project.ProjectFolder); writer.WriteLine(); //part 2: machine information writer.WriteLine("#Machine information:"); string equippedNozzles = ""; int numberOfNozzles = project.Machine.EquippedNozzles.Length; for (int i = 0; i < numberOfNozzles; i++) { equippedNozzles += project.Machine.EquippedNozzles[i].ToString(); if (i != numberOfNozzles - 1) { equippedNozzles += ","; } } writer.WriteLine("MachineType={0},speed={1},equipped nozzles={2}{3}", new object[] { project.Machine.GetType(), project.Machine.DefaultSpeed, equippedNozzles, Environment.NewLine }); //Part 3: Offset and panelization writer.WriteLine("#Offset and panelization:"); writer.WriteLine("originOffsetX={1},originOffsetY={2}{0}boardsX={3},boardsY={4}{0}distanceX={5},distanceY={6}{0}boardDimX={7},boardDimY={8}{0}", new object[] { Environment.NewLine, project.HorizontalOriginOffset, project.VerticalOriginOffset, project.BoardsX, project.BoardsY, project.DistanceX, project.DistanceY, project.BoardWidth, project.BoardLength }); //part 4: components writer.WriteLine("#Included components/reels:"); writer.WriteLine(SaveStringComponents(project.IncludedReels, true)); writer.WriteLine(); writer.WriteLine("#Excluded components/reels:"); writer.WriteLine(SaveStringComponents(project.ExcludedReels, false)); writer.WriteLine(); //part 5: stackConfiguration writer.WriteLine("#Stack setup(s):"); for (int i = 0; i < project.StackListers.Count; i++) { StackList stackList_ = project.StackListers[i]; writer.WriteLine("Phase=" + stackList_.PhaseNumber.ToString()); writer.WriteLine(stackList_.GetSaveString()); } } }
/// <summary> /// Load a pick and place project from the project.path /// </summary> /// <param name="project">Project to load data to</param> /// <exception cref="PickAndPlace.FileOperationsException">Thrown when data is missing or when a line could not be decoded</exception> public static void LoadProject(PnpProject project) { List <PnpComponent> includedComponents = new List <PnpComponent>(); List <PnpComponent> excludedComponents = new List <PnpComponent>(); //project.stackListers = new List<StackList>(); using (StreamReader reader = new StreamReader(project.Path)) { while (!reader.EndOfStream) { string curLine = reader.ReadLine(); //# is a line with comment if (curLine.StartsWith("#") || String.IsNullOrWhiteSpace(curLine)) { continue; } string[] splitedLine = curLine.Split(new char[] { ',', '=' }, StringSplitOptions.None); switch (splitedLine[0]) { case "ProjectName": project.ProjectName = splitedLine[1]; break; case "ProjectFolder": project.ProjectFolder = splitedLine[1]; break; case "MachineType": project.Machine = (IMachine)Assembly.GetExecutingAssembly().CreateInstance(splitedLine[1]); project.Machine.DefaultSpeed = Convert.ToInt32(splitedLine[3]); for (int i = 5; i < splitedLine.Length; i++) { Nozzle nozzle = PNPconverterTools.StringToNozzle(splitedLine[i]); project.Machine.SetNozzle(i - 5, nozzle); } break; case "originOffsetX": project.HorizontalOriginOffset = float.Parse(splitedLine[1]); project.VerticalOriginOffset = float.Parse(splitedLine[3]); break; case "boardsX": project.BoardsX = Convert.ToInt32(splitedLine[1]); project.BoardsY = Convert.ToInt32(splitedLine[3]); break; case "distanceX": project.DistanceX = float.Parse(splitedLine[1]); project.DistanceY = float.Parse(splitedLine[3]); break; case "boardDimX": project.BoardWidth = float.Parse(splitedLine[1]); project.BoardLength = float.Parse(splitedLine[3]); break; case "Designator": //load new component string designator = splitedLine[1]; string manufacturerPartNumber_ = splitedLine[3]; float x = float.Parse(splitedLine[5]); float y = float.Parse(splitedLine[7]); int rotation = Convert.ToInt32(splitedLine[9]); Layer layer_; if (splitedLine[11] == Layer.Bottom.ToString()) { layer_ = Layer.Bottom; } else { layer_ = Layer.Top; } Location location_ = new Location(x, y, rotation, layer_); string comment = splitedLine[13]; bool included = Convert.ToBoolean(splitedLine[15]); PnpComponent comp = new PnpComponent(designator, location_, comment, manufacturerPartNumber_); if (included) { includedComponents.Add(comp); } else { excludedComponents.Add(comp); } break; case "Phase": //last part of the file string remainingLines = reader.ReadToEnd(); string[] remainingLinesSplited = remainingLines.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); //1) make reels from the components: project.IncludedReels = ComponentsToReels(includedComponents, project.Machine.DefaultSpeed); project.ExcludedReels = ComponentsToReels(excludedComponents, project.Machine.DefaultSpeed); List <Reel> completeReelList = new List <Reel>(project.IncludedReels); completeReelList.AddRange(project.ExcludedReels); //the completeReelList contains all reels, however these reels where not splited List <Reel> topReels, bottomReels; Reel.SplitReelList(completeReelList, out topReels, out bottomReels); completeReelList.Clear(); completeReelList.AddRange(topReels); completeReelList.AddRange(bottomReels); //topReels and bottomReels contain all reels, also the excluded reels //they will be reused later //2) read each line StackList newStackList = new StackList(project.Machine, Convert.ToInt32(splitedLine[1])); newStackList.Name = "stackList"; project.StackListers.Add(newStackList); int index = -1; for (int i = 0; i < remainingLinesSplited.Length; i++) { splitedLine = remainingLinesSplited[i].Split(new char[] { '=', ',' }); if (splitedLine[0] != "Phase") { index++; //Stacks are saved in order (starting at reel 0 -> reel n) string designator_ = splitedLine[1]; if (String.IsNullOrWhiteSpace(designator_)) { continue; //empty stack } bool locked = Convert.ToBoolean(splitedLine[5]); //find the reel in the completeReelList Reel matchingReel = completeReelList.Find(reel => reel.GetDesignators().Contains(designator_)); matchingReel.Speed = Convert.ToInt32(splitedLine[3]); newStackList.AddReel(matchingReel, locked, index); project.ReelsInStackList.Add(matchingReel); } else { //make a new phase //Phase=X (X=phase number) newStackList = new StackList(project.Machine, Convert.ToInt32(splitedLine[1])); newStackList.Name = "stackList"; project.StackListers.Add(newStackList); index = -1; } } //Reusing topReels and bottomReels Reel.SplitReelList(project.ReelsInStackList, out topReels, out bottomReels); project.TopReels = topReels; project.BottomReels = bottomReels; break; default: throw new FileOperationsException(String.Format("Unable to read file: {0}{2}Problem with reading folowing line:{2}{1}", project.Path, curLine, Environment.NewLine)); } } } if (project.StackListers.Count == 0) { //no phases saved project.IncludedReels = ComponentsToReels(includedComponents, project.Machine.DefaultSpeed); project.ExcludedReels = ComponentsToReels(excludedComponents, project.Machine.DefaultSpeed); } if ((project.HorizontalOriginOffset == -1f) || (project.VerticalOriginOffset == -1f) || (project.BoardsX == -1) || (project.BoardsY == -1) || (project.DistanceX == -1f) || (project.DistanceY == -1f) || (project.BoardWidth == -1f) || (project.BoardLength == -1f) || (project.Machine == null)) { throw new FileOperationsException("Not all data was found in the file"); } }