/// <summary>Returns all MasterCopies in folder as TreeViewItems</summary> /// <param name="folder">The folder.</param> /// <returns>TreeViewItem</returns> /// <exception cref="System.ArgumentNullException">Parameter is null;folder</exception> public static TreeViewItem GetMasterCopiesTreeView(MasterCopyFolder folder) { if (folder == null) { throw new ArgumentNullException(nameof(folder), "Parameter is null"); } var treeViewItem = new TreeViewItem(); treeViewItem.Header = OpennessHelper.GetObjectName(folder); treeViewItem.Tag = folder; foreach (var mCopy in folder.MasterCopies) { var sub = new TreeViewItem(); sub.Header = mCopy.Name; sub.Tag = mCopy; treeViewItem.Items.Add(sub); } foreach (var subfolder in folder.Folders) { var subView = GetMasterCopiesTreeView(subfolder); treeViewItem.Items.Add(subView); } return(treeViewItem); }
/// <summary> /// Search project library for the block required and returns it /// </summary> /// <param name="libraryFolder">Folder of the project library to search in</param> /// <param name="blockName">Name of the block to be search for</param> /// <returns>Block if found, null otherwise</returns> public static MasterCopy GetMasterCopy(MasterCopyFolder libraryFolder, string blockName, TextBox log) { // look for block in current folder foreach (var masterCopy in libraryFolder.MasterCopies) { if (masterCopy.Name.Equals(blockName)) { log.AppendText("Block to be copied found in " + libraryFolder.Name); log.AppendText(Environment.NewLine); return(masterCopy); } } // if not in this folder check subfolders foreach (var subfolder in libraryFolder.Folders) { MasterCopy result = GetMasterCopy(subfolder, blockName, log); if (result != null) { return(result); } } log.AppendText("Block to be copied not found"); log.AppendText(Environment.NewLine); return(null); }
/// <summary> /// Copy provided tag table from project library to provided destination folder in plc /// </summary> public static bool CopyTagTableToFolder(string tagTableName, MasterCopyFolder libraryFolder, PlcTagTableGroup tagGroup, string destFolder, TextBox log) { // check if it's already on the right folder to proceed with the copy if (tagGroup.Name.Equals(destFolder)) { log.AppendText("Destination folder found"); log.AppendText(Environment.NewLine); // delete existing tag table if already exists DeleteTagTable(tagTableName, tagGroup, log); // create new tag table from project library tagGroup.TagTables.CreateFrom(GetMasterCopy(libraryFolder, tagTableName, log)); return(true); } // if it's not in the right folder, recursively check subfolders foreach (PlcTagTableGroup group in tagGroup.Groups) { log.AppendText("Checking " + group.Name + " subfolders"); log.AppendText(Environment.NewLine); if (CopyTagTableToFolder(tagTableName, libraryFolder, group, destFolder, log)) { return(true); } } return(false); }
/// <summary> /// Read project library master copies folder /// </summary> /// <param name="masterCopiesFolder"></param> /// <param name="path"></param> /// <returns>String containing the block name and parent folder - Folder/BlockName</returns> public static List <string> ReadProjectLibrary(MasterCopyFolder masterCopiesFolder, string path) { // check we have some master copies folder to work with if (masterCopiesFolder == null) { throw new ArgumentNullException(nameof(masterCopiesFolder), "Parameter is null"); } var masterCopies = new List <string>(); // Add new elements to list foreach (var mCopy in masterCopiesFolder.MasterCopies) { path = masterCopiesFolder.Name + "/" + mCopy.Name; masterCopies.Add(path); } // Check for elements in subfolders and add them to the list too foreach (var subfolder in masterCopiesFolder.Folders) { masterCopies.AddRange(ReadProjectLibrary(subfolder, path)); } return(masterCopies); }
/// <summary> /// Copy block from provided project library to folder in provided plc software object /// </summary> /// <param name="blockName">Name of the block to be copied</param> /// <param name="libraryFolder">Project library folder with origin block</param> /// <param name="software">Software to copy the block into</param> /// <param name="destFolder">Destination folder on which to copy the block</param> /// <returns>True if copied, false otherwise</returns> public static bool CopyBlockToFolder(string blockName, MasterCopyFolder libraryFolder, PlcBlockUserGroup software, string destFolder, TextBox log) { // checks if it's already on the right folder to proceed with the copy if (software.Name.Equals(destFolder)) { log.AppendText("Destination folder found"); log.AppendText(Environment.NewLine); // delete block if it already exists DeleteBlock(blockName, software, log); // create new block from library software.Blocks.CreateFrom(GetMasterCopy(libraryFolder, blockName, log)); return(true); } // if it's not in the right folder, recursively check subfolders foreach (var group in software.Groups) { log.AppendText("Checking " + software.Name + " subfolders"); log.AppendText(Environment.NewLine); if (CopyBlockToFolder(blockName, libraryFolder, group, destFolder, log)) { return(true); } } return(false); }
// Copy selected blocks from project library private void Btn_CopySelection_Click(object sender, EventArgs e) { // Determine if there are any devices checked. if (devicesCheckList.CheckedItems.Count != 0) { statusBox.AppendText("Systems selected: " + devicesCheckList.CheckedItems.Count); statusBox.AppendText(Environment.NewLine); // If so loop through all devices checking if they have been selected foreach (var device in MyProject.Devices) { if (devicesCheckList.CheckedItems.Contains(device.Name)) { statusBox.AppendText("Applying changes to system " + device.Name); statusBox.AppendText(Environment.NewLine); foreach (var deviceItem in device.DeviceItems) { PlcSoftware software = BlockManagement.GetSoftwareFrom(deviceItem); if (software != null) { MasterCopyFolder masterFolder = MyProject.ProjectLibrary.MasterCopyFolder; // get blocks to be copied info foreach (string item in projectLibraryCheckList.CheckedItems) { string destFolder = item.Substring(0, item.IndexOf("/")); string blockToCopy = item.Substring(item.IndexOf("/") + 1); statusBox.AppendText("Copying " + blockToCopy + " to " + destFolder); statusBox.AppendText(Environment.NewLine); // check if it's a tag table or software block if (destFolder.Equals("PLC tags")) { BlockManagement.CopyTagTableToFolder(blockToCopy, masterFolder, software.TagTableGroup, destFolder, statusBox); } else { // TO DO - Overload method to take as argument BlockGroup and BlockUserGroup // Type of BlockGroup is PlcBlockSystemGroup is not compatible with type of // Group that is PlcBlockUserGroup so the same functions can't be applied // in both cases, that's the reason for the exception when copying to the root folder if (destFolder.Equals("PLC")) { // delete block if already exists foreach (var block in software.BlockGroup.Blocks) { if (blockToCopy.Equals(block.Name)) { block.Delete(); } } // now copy block software.BlockGroup.Blocks.CreateFrom(BlockManagement.GetMasterCopy(masterFolder, blockToCopy, statusBox)); } else { foreach (var group in software.BlockGroup.Groups) { // Before copying delete block if already exists BlockManagement.DeleteBlock(blockToCopy, group, statusBox); // now copy block BlockManagement.CopyBlockToFolder(blockToCopy, masterFolder, group, destFolder, statusBox); } } } } } } } } } else { statusBox.AppendText("No systems have been selected"); statusBox.AppendText(Environment.NewLine); } }