Compare commits

...

22 Commits

Author SHA1 Message Date
3d7528e069 Merge branch 'Development' into C2025-024 2025-08-08 09:56:33 -04:00
58cc75ef71 C2025-024
Fix merge conflict
2025-08-08 09:44:51 -04:00
b5a9462e95 C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
Fix Regular Expression RO Resolution for when multi ROs  and multi-unit
2025-08-06 14:41:15 -04:00
1bc421ac6d Merge pull request 'B2025-036-SplitScreen-Print-Error' (#587) from B2025-036-SplitScreen-Print-Error into Development
ready for testing
2025-08-06 11:37:03 -04:00
ad0d091b49 B2025-036-SplitScreen-Print-Error 2025-08-06 11:28:28 -04:00
22de686a44 B2025-036-SplitScreen-Print-Error 2025-08-06 11:25:44 -04:00
3e7eb09758 Merge pull request 'C2025-039 Per the customer’s request, adjusted the “{Proc Num} (Procedure Number Only)" transition type in the Beaver Valley formats so that a procedure that contains only Word sections can be referenced.' (#586) from C2025-039_allowStepTransToAllWordProc into Development
format only change - ready for testing
2025-08-04 10:31:38 -04:00
28c681a562 C2025-024 Electronic Procedures Phase 2 - XML Export
Enhanced Doc Links
2025-08-01 13:53:08 -04:00
44025c3978 C2025-024 Electronic Procedures Phase 2 - XML Export
Multi-Unit Resolution, and Fix RO Annotation resolution in Text
2025-07-30 13:47:25 -04:00
8c32d18aec C2025-024 Electronic Procedures Phase 2 - XML Export
Multi-Unit RO Resolution
2025-07-24 08:08:18 -04:00
20c31153de C2025-024 Electronic Procedures Phase 2 - XML Export
Multi-Unit RO Resolution
2025-07-23 15:26:45 -04:00
ecb9a805e5 C2025-024 Electronic Procedures Phase 2 - XML Export
UI / menu filtering for EP only procedures
2025-07-21 13:47:23 -04:00
0577acad93 C2025-024 Electronic Procedures Phase 2 - XML Export
Removed unnecessary usings
2025-07-18 16:13:16 -04:00
d7f83fa4d4 C2025-024 Electronic Procedures Phase 2 - XML Export
Export Cleanup
2025-07-18 14:52:05 -04:00
4c4f4d52d2 C2025-024 Electronic Procedures Phase 2 - XML Export
Code refactor and added comment
2025-07-18 13:26:16 -04:00
0bf9025c0d C2025-024 Electronic Procedures Phase 2 - XML Export
Multi-unit
2025-07-17 13:59:11 -04:00
2784b57a05 C2025-023 - Electronic Procedures - Modifications to PROMS
Working on multiunit for DB Sequence
2025-07-16 14:23:55 -04:00
b9fc9748c7 C2025-024 Electronic Procedures Phase 2 - XML Export
set RO Location code for pre-existing RO usages
2025-07-16 10:09:01 -04:00
ec25f6426a C2025-024 Electronic Procedures Phase 2 - XML Export
Export code cleanup and initial set RO Location code
2025-07-15 13:43:19 -04:00
00283b4f28 C2025-024 Electronic Procedures Phase 2 - XML Export
Export code cleanup and initial set RO Location code
2025-07-15 13:31:12 -04:00
ec8e4c36a4 C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
RO image resolution for Annotations
2025-07-11 15:26:22 -04:00
92522b1229 C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
Initial check-in / adding ui options / base for export
2025-06-30 14:32:24 -04:00
13 changed files with 1344 additions and 2021 deletions

View File

@@ -180,6 +180,7 @@
<Content Include="fmtall\CPL_03all.xml" />
<Content Include="fmtall\CPSAMGDataall.xml" />
<Content Include="fmtall\CPSAMGDEVall.xml" />
<Content Include="fmtall\EPTSTBCK1all.xml" />
<Content Include="fmtall\EPTST1all.xml" />
<Content Include="fmtall\CWEall.xml" />
<Content Include="fmtall\CWEDEVall.xml" />

Binary file not shown.

Binary file not shown.

View File

@@ -175,6 +175,9 @@
<Compile Include="dlgCheckedOutProcedure.designer.cs">
<DependentUpon>dlgCheckedOutProcedure.cs</DependentUpon>
</Compile>
<Compile Include="dlgExportImportEP.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="dlgMSWordMessage.cs">
<SubType>Form</SubType>
</Compile>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,347 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using VEPROMS.CSLA.Library;
namespace VEPROMS
{
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//class inherits from normal import/export form
//then adds additional functionality
#pragma warning disable S101 // Types should be named in PascalCase
public partial class dlgExportImportEP : dlgExportImport
#pragma warning restore S101 // Types should be named in PascalCase
{
private readonly AnnotationTypeInfo _AnnotationType;
private readonly string multiseparator = ",";
private static Regex _ROAccPageTokenPattern = new Regex("[<][^<>-]+-[^<>]+[>]");
public dlgExportImportEP(string mode, FolderInfo folderInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId, int unitIndex = 0) : base(mode, folderInfo, myFrmVEPROMS, (E_UCFImportOptions)0, unitIndex)
{
_AnnotationType = AnnotationTypeInfo.Get(annotationTypeId);
_ExportBothConvertedandNot = true;
DocReplace = new Dictionary<int, byte[]>();
FormClosed += OnClose;
Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {folderInfo.Name}";
}
public dlgExportImportEP(string mode, DocVersionInfo docVersionInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId, int unitIndex = 0) : base(mode, docVersionInfo, myFrmVEPROMS, (E_UCFImportOptions)0, unitIndex)
{
_AnnotationType = AnnotationTypeInfo.Get(annotationTypeId);
_ExportBothConvertedandNot = true;
DocReplace = new Dictionary<int, byte[]>();
FormClosed += OnClose;
Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {docVersionInfo.Name} of {docVersionInfo.MyFolder.Name}";
}
public dlgExportImportEP(string mode, ProcedureInfo procedureInfo, frmVEPROMS myFrmVEPROMS, int annotationTypeId, int unitIndex = 0) : base(mode, procedureInfo, myFrmVEPROMS, (E_UCFImportOptions)0, unitIndex)
{
_AnnotationType = AnnotationTypeInfo.Get(annotationTypeId);
_ExportBothConvertedandNot = true;
DocReplace = new Dictionary<int, byte[]>();
FormClosed += OnClose;
Text = $"{mode} Electronic Procedure ({_AnnotationType.Name}) Dialog for {procedureInfo.DisplayNumber}";
}
//Overridden function to handle export of EP data
protected override void ExportEPAnnotationInfo(XmlElement xe, ItemInfo ii)
{
if (_UnitIndex > 0)
{
ii.MyDocVersion.DocVersionConfig.SelectedSlave = _UnitIndex;
ii.MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave = _UnitIndex;
}
//switch to handle customizations for different formats
switch (ii.ActiveFormat.PlantFormat.EPFormatFiles.Find(x => x.AnnotationTypeID == _AnnotationType.TypeID)?.Name)
{
default:
ExportEPAnnotationInfo_Default(xe, ii);
break;
}
ii.MyDocVersion.DocVersionConfig.SelectedSlave = 0;
ii.MyProcedure.MyDocVersion.DocVersionConfig.SelectedSlave = 0;
}
//default export of EP Data
private void ExportEPAnnotationInfo_Default(XmlElement xe, ItemInfo ii)
{
//Add tab text to item
string steptab = Volian.Print.Library.PDFReport.BuildStepTab(ii);
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "StepTab", steptab));
//Add db sequence to item
string dbsequence = dbSeq(ii);
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "dbsequence", dbsequence));
//get first transition in item and add it as an xml element
if (ii.MyContent.ContentTransitionCount > 0)
{
TransitionInfo ct = ii.MyContent.ContentTransitions[0];
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "TransitionToItemID", ct.ToID.ToString()));
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "TransitionTodbsequence", dbSeq(ct.ToID)));
}
//export EP annotation details under an EPInfo node
if (ii.ItemAnnotations != null)
{
XmlElement xepinfo = xe.OwnerDocument.CreateElement("EPInfo");
EPFields myEPFields = ii.GetValidEPFields(_AnnotationType.TypeID);
ROFSTLookup lookup = ii.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(ii.MyDocVersion);
bool epexportblank = ii.EPexportblank(_AnnotationType.TypeID); //should blank xml elements export?
//grab the current RO db so will know location of RO files and default graphics ext.
using (RODbInfo myRODB = (RODbInfoList.Get()).FirstOrDefault(x => x.RODbID == ii.MyDocVersion.DocVersionAssociations[0].MyROFst.RODbID))
{
//For each annotation in the item that is of the current EP Annotation type
foreach (var EPAnnotation in ii.ItemAnnotations.Where(x => x.TypeID == _AnnotationType.TypeID))
{
var EPAnnotationConfig = new AnnotationConfig(EPAnnotation.Config);
XmlElement xepdetails = xe.OwnerDocument.CreateElement("Details");
//include the annotation ID for reference
xepdetails.Attributes.SetNamedItem(AddAttribute(xepdetails.OwnerDocument, "AnnotationID", EPAnnotation.AnnotationID.ToString()));
//loop through each EP Field - name the xml elements the EP.name
foreach (EPField EP in myEPFields)
{
string val = EPAnnotationConfig.GetValue("EP", EP.name);
if (epexportblank || !string.IsNullOrEmpty(val))
{
if (_UnitIndex != 0)
{
val = DisplayText.ResolveUnitSpecific(ii.MyDocVersion, val);
}
XmlElement xindivid = xe.OwnerDocument.CreateElement(EP.name);
//need to resolve ROs ROSingle, ROMulti, in text
//get values
switch (EP.type.ToLower())
{
case "text":
//for text, check if any embedded ROs
//if none, set the xml element to the text
//otherwise resolve the ROs
MatchCollection matches = _ROAccPageTokenPattern.Matches(val);
if (matches.Count == 0)
{
xindivid.InnerText = val;
}
else
{
//resolve ROs
//text ROs will replace the AccID key in the text
//for binary objects like images,
//we will keep the AccID in the text and output the binary as a separate child
//XML element with the same xml name as the AccID
foreach (Match m in matches)
{
ROFSTLookup.rochild roc = lookup.GetROChildByAccPageID(m.Groups[0].Value);
// Exclude replacing Images since are binary - for those, add a sub item
if (Enumerable.Range(8, 15).Contains(roc.type))
{
xindivid.InnerText = val;
XmlElement xroid = AddGraphic(xindivid, m.Groups[0].Value, roc, myRODB, roc.type != 8);
xindivid.AppendChild(xroid);
}
else if (!string.IsNullOrEmpty(roc.value))
{
bool convertCaretToDeltaSymbol = (ii.ActiveSection != null) && ii.ActiveSection.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta;
string rocvalue = roc.value.Replace("`", "\xB0");
rocvalue = rocvalue.Replace("\xF8", "\xB0");
rocvalue = rocvalue.Replace("\x7F", "\x394"); //delta
if (convertCaretToDeltaSymbol) rocvalue = rocvalue.Replace("^", "\x394"); // delta
val = val.Replace($"{m.Groups[0].Value}", rocvalue);
xindivid.InnerText = val;
}
}
}
break;
case "rosingle":
//Get the output columns from the EPFormatFile
//set the "Item" nodes value = to those resolved items
//separated by multiseparator
XmlElement xindivid_rosingle = xindivid.OwnerDocument.CreateElement("Item");
xindivid_rosingle.Attributes.SetNamedItem(AddAttribute(xindivid_rosingle.OwnerDocument, "ROID", val));
//add values specified in EP input list
List<string> ro_single_tmp = EP.getROValuesList(EPAnnotation, val);
xindivid_rosingle.InnerText = String.Join(multiseparator, ro_single_tmp.ToArray());
//if image, add location and binary of image
// - images are type 8
// but if multiple return values could combine
// for example an text (1) + image (8) would be 9
ROFSTLookup.rochild roc_single = lookup.GetRoChild(val);
if (Enumerable.Range(8, 15).Contains(roc_single.type))
{
XmlElement xroid = AddGraphic(xindivid, val, roc_single, myRODB, roc_single.type != 8);
xindivid_rosingle.AppendChild(xroid);
}
xindivid.AppendChild(xindivid_rosingle);
break;
case "romulti":
//Get the output columns from the EPFormatFile
//create an "Item" subnode for each selected RO
//set the nodes value = to those resolved items
//separated by multiseparator
foreach (string ival in val.Split(multiseparator.ToCharArray()))
{
XmlElement xindivid_romulti = xindivid.OwnerDocument.CreateElement("Item");
xindivid_romulti.Attributes.SetNamedItem(AddAttribute(xindivid_romulti.OwnerDocument, "ROID", ival));
//add values specified in EP input list
List<string> ro_multi_tmp = EP.getROValuesList(EPAnnotation, ival);
xindivid_romulti.InnerText = String.Join(multiseparator, ro_multi_tmp.ToArray());
//if image, add location and binary of image
// - images are type 8
// but if multiple return values could combine
// for example an text (1) + image (8) would be 9
ROFSTLookup.rochild roc_multi = lookup.GetRoChild(ival);
if (Enumerable.Range(8, 15).Contains(roc_multi.type))
{
XmlElement xroid = AddGraphic(xindivid, ival, roc_multi, myRODB, roc_multi.type != 8);
xindivid_romulti.AppendChild(xroid);
}
xindivid.AppendChild(xindivid_romulti);
}
break;
case "tableinput":
xindivid.InnerText = val;
break;
default:
xindivid.InnerText = val;
break;
}
xepdetails.AppendChild(xindivid);
}
}
xepinfo.AppendChild(xepdetails);
}
}
xe.AppendChild(xepinfo);
}
}
//return a db sequence string from an Item ID
private string dbSeq(int itemID)
{
using (ItemInfo ii = ItemInfo.Get(itemID))
{
return dbSeq(ii);
}
}
//return a db sequence string from an ItemInfo
private string dbSeq(ItemInfo ii) => $"{((FolderInfo)ii.MyDocVersion.ActiveParent).Name}:{ii.MyProcedure.DisplayNumber} {ii.MyProcedure.DisplayText}:{ii.DBSequence}";
//For Exporting an RO that is an image
//returns the Location and FileName of the RO Image
private string GetROImageFileLocation(ROFSTLookup.rochild roc, RODbInfo rodb, bool isMulti)
{
string rodbpath = rodb.FolderPath;
string rocval = roc.value;
if (rocval == null) rocval = Array.Find(roc.children, x => x.value.Contains('.')).value;
if (rocval == null) return "";
string imgname;
if (isMulti)
{
imgname = rocval.Substring(rocval.IndexOf(' ') + 1, rocval.IndexOf("\r\n") - rocval.IndexOf(' ') - 1);
}
else
{
imgname = rocval.Substring(0, rocval.IndexOf('\n'));
}
int thedot = imgname.LastIndexOf('.');
string fname = imgname;
if (thedot == -1 || (thedot != (imgname.Length - 4)))
{
RODbConfig roDbCfg = new RODbConfig(rodb.Config);
fname += string.Format(".{0}", roDbCfg.GetDefaultGraphicExtension());
}
string imgfile = Path.Combine(rodbpath, fname);
return imgfile;
}
//For Exporting an RO that is an image
//returns an xmlElement
// - that is a child to xindivid
// - that has a name of Name
// - that has a value of the binary representation of the image
// - that has an attribute designating the location of the image file
private XmlElement AddGraphic(XmlElement xindivid, string Name, ROFSTLookup.rochild roc, RODbInfo rodb, bool isMulti)
{
Name = Name.Replace("<", "").Replace(">", "");
XmlElement xroid = xindivid.OwnerDocument.CreateElement(Name);
string imgfile = GetROImageFileLocation(roc, rodb, isMulti);
if (string.IsNullOrEmpty(imgfile)) return xroid;
xroid.Attributes.SetNamedItem(AddAttribute(xroid.OwnerDocument, "Location", imgfile));
if (File.Exists(imgfile))
{
using (FileStream fsIn = new FileStream(imgfile, FileMode.Open, FileAccess.Read, FileShare.Read))
{
// Create an instance of StreamReader that can read characters from the FileStream.
using (BinaryReader r = new BinaryReader(fsIn))
xroid.InnerText = Encoding.Default.GetString(r.ReadBytes((int)fsIn.Length));
}
}
return xroid;
}
//overridden - used to set the RO location for RO Images that are not in annotations
protected override void SetROLocation(ref XmlElement xindivid, ROFSTLookup.rochild roc, RODbInfo rodb, bool isMulti)
{
string imgfile = GetROImageFileLocation(roc, rodb, isMulti);
if (!string.IsNullOrEmpty(imgfile)) xindivid.Attributes.SetNamedItem(AddAttribute(xindivid.OwnerDocument, "Location", imgfile));
}
//overridden - used to set specific enhanced doc info
protected override void SetEPEnhancedDocLinks(ref XmlElement xe, ItemInfo ii)
{
EnhancedDocuments eds = ii.GetMyEnhancedDocuments();
if (eds != null && eds.Count == 1)
{
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "EnhancedDocType", eds[0].Type.ToString()));
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "EnhancedDocToItemID", eds[0].ItemID.ToString()));
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "EnhancedDocToDbSeq", dbSeq(eds[0].ItemID)));
}
}
//clear objects to release memory
private void OnClose(object sender, EventArgs e)
{
DocReplace.Clear();
DocReplace = null;
}
}
}

View File

@@ -707,15 +707,32 @@ namespace VEPROMS
else
{
int ownerid = MySessionInfo.CheckOutItem(fi.FolderID, CheckOutType.Session);
dlgExportImport dlg = new dlgExportImport(args.Index == 0 ? "Export" : "Import", fi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
if (args.Index == 1 && dlg.MyNewFolder != null)
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//form for exporting Electronic Procedures from FolderInfo
if (args.AnnotationTypeId > 0)
{
tv.AddNewNode(dlg.MyNewFolder);
dlgExportImportEP dlg = new dlgExportImportEP(args.Index == 0 ? "Export" : "Import", fi, this, args.AnnotationTypeId, args.UnitIndex);
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
if (args.Index == 1 && dlg.MyNewFolder != null)
{
tv.AddNewNode(dlg.MyNewFolder);
}
}
else
{
dlgExportImport dlg = new dlgExportImport(args.Index == 0 ? "Export" : "Import", fi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
if (args.Index == 1 && dlg.MyNewFolder != null)
{
tv.AddNewNode(dlg.MyNewFolder);
}
}
}
}
@@ -741,18 +758,40 @@ namespace VEPROMS
int ownerid = MySessionInfo.CheckOutItem(dvi.VersionID, CheckOutType.DocVersion);
dlgExportImport dlg = new dlgExportImport("Import", dvi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter
dlg.MyNewProcedure = null;
dlg.ExternalTransitionItem = null;
dlg.ShowDialog(this);
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//form for exporting Electronic Procedures from DocVersionInfo
if (args.AnnotationTypeId > 0)
{
dlgExportImportEP dlg = new dlgExportImportEP(args.Index == 0 ? "Export" : "Import", dvi, this, args.AnnotationTypeId, args.UnitIndex);
dlg.MyNewProcedure = null;
dlg.ExternalTransitionItem = null;
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
MySessionInfo.CheckInItem(ownerid);
if (dlg.MyNewProcedure != null)
tv.AddNewNode(dlg.MyNewProcedure);
if (dlg.MyNewProcedure != null)
tv.AddNewNode(dlg.MyNewProcedure);
if (dlg.ExternalTransitionItem != null)
tc.OpenItem(dlg.ExternalTransitionItem);
}
else
{
dlgExportImport dlg = new dlgExportImport("Import", dvi, this, (E_UCFImportOptions)Properties.Settings.Default.UCFImportOpt);//Added frmVEPROMS Parameter
dlg.MyNewProcedure = null;
dlg.ExternalTransitionItem = null;
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
if (dlg.MyNewProcedure != null)
tv.AddNewNode(dlg.MyNewProcedure);
if (dlg.ExternalTransitionItem != null)
tc.OpenItem(dlg.ExternalTransitionItem);
}
if (dlg.ExternalTransitionItem != null)
tc.OpenItem(dlg.ExternalTransitionItem);
}
}
@@ -768,10 +807,24 @@ namespace VEPROMS
else
{
int ownerid = MySessionInfo.CheckOutItem(pi.ItemID, CheckOutType.Procedure);
dlgExportImport dlg = new dlgExportImport("Export", pi, this, (E_UCFImportOptions)0);//Added frmVEPROMS Parameter
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//form for exporting Electronic Procedures from ProcedureInfo
if (args.AnnotationTypeId > 0)
{
dlgExportImportEP dlg = new dlgExportImportEP("Export", pi, this, args.AnnotationTypeId, args.UnitIndex);
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
}
else
{
dlgExportImport dlg = new dlgExportImport("Export", pi, this, (E_UCFImportOptions)0);//Added frmVEPROMS Parameter
dlg.ShowDialog(this);
MySessionInfo.CheckInItem(ownerid);
}
}
}
}
@@ -1215,7 +1268,7 @@ namespace VEPROMS
//Print Section
//C2025-028 Add a Quick Print Section option
void tv_PrintSection(object sender, vlnTreeEventArgs args)
{
PrintSection(sender, args, false);
@@ -1225,7 +1278,7 @@ namespace VEPROMS
PrintSection(sender, args, true);
}
void PrintSection(object sender, vlnTreeEventArgs args, bool quickprint)
void PrintSection(object sender, vlnTreeEventArgs args, bool quickprint)
{
try
{
@@ -1486,9 +1539,11 @@ namespace VEPROMS
// and if they are not the same, use the CurrentItem from the main frmVEPROMS.
ProcedureInfo piThis = null;
if (_CurrentItem != null) piThis = _CurrentItem.MyProcedure;
ProcedureInfo pi = args.Proc as ProcedureInfo;
if (piThis != null && pi.ItemID != piThis.ItemID) pi = piThis;
if (args.OringFlg == 1) // B2025-036 split screen print issue. if oringFlg == 1 the ctrl-p keys was pressed.
{
if (piThis != null && pi.ItemID != piThis.ItemID) pi = piThis;
}
// Check if Procedure Info is null
if (pi == null) return;
@@ -1530,8 +1585,11 @@ namespace VEPROMS
if (_CurrentItem != null) piThis = _CurrentItem.MyProcedure;
ProcedureInfo pi = args.Proc as ProcedureInfo;
if (piThis != null && pi.ItemID != piThis.ItemID) pi = piThis;
if (args.OringFlg == 1) // B2025-036 split screen print issue. if oringFlg == 1 the ctrl-p keys was pressed.
{
if (piThis != null && pi.ItemID != piThis.ItemID) pi = piThis;
}
// Check if Procedure Info is null
if (pi == null) return;
@@ -2198,7 +2256,7 @@ namespace VEPROMS
this.superTooltip1.SetSuperTooltip(btnResetSecurity, new SuperTooltipInfo("Reset Security", "", "WARNING this will \nREMOVE ALL PROMS USERS and Reset to the\nOriginal Volian Defaults", null, null, eTooltipColor.Gray));
this.superTooltip1.SetSuperTooltip(btnAdministrativeTools, new SuperTooltipInfo("Administrative Tools", "", "Open the PROMS Adminstration Tools Window", null, null, eTooltipColor.Gray));
this.superTooltip1.SetSuperTooltip(btnUpdateFormats, new SuperTooltipInfo("Update Formats", "", "Install New Formats \n or Re-Install Formats", null, null, eTooltipColor.Gray));
try
{
MyUserInfo = UserInfo.GetByUserID(VlnSettings.UserID);

View File

@@ -346,21 +346,21 @@ namespace VEPROMS.CSLA.Library
{
var ii = _CacheByPrimaryKey.FirstOrDefault();
while (ii.Value.Count > 0)
{
if (ii.Value[0]?.MyContent?.ContentParts != null)
{ foreach (PartInfo pi in ii.Value[0]?.MyContent?.ContentParts) pi.Dispose(); }
ii.Value[0].Dispose();
}
while (ii.Value.Count > 0)
{
if (ii.Value[0]?.MyContent?.ContentParts != null)
{ foreach (PartInfo pi in ii.Value[0]?.MyContent?.ContentParts) pi.Dispose(); }
ii.Value[0].Dispose();
}
_CacheByPrimaryKey.Remove(ii.Key);
}
while (_CacheList.Count > 0)
{
if (_CacheList[0]?.MyContent?.ContentParts != null)
{foreach (PartInfo pi in _CacheList[0]?.MyContent?.ContentParts) pi.Dispose(); }
_CacheList[0].Dispose();
}
{
if (_CacheList[0]?.MyContent?.ContentParts != null)
{foreach (PartInfo pi in _CacheList[0]?.MyContent?.ContentParts) pi.Dispose(); }
_CacheList[0].Dispose();
}
}
private bool _PrintAllAtOnce = false;
@@ -450,86 +450,86 @@ namespace VEPROMS.CSLA.Library
StringBuilder sret = new StringBuilder();
ItemInfo pitem = this;
while (!pitem.IsSection && !pitem.IsHigh)
{
{
using (StepInfo stpinfo = StepInfo.Get(pitem.ItemID))
{
string thisTab = stpinfo.MyTab.CleanText;
{
string thisTab = stpinfo.MyTab.CleanText;
string typeName = stpinfo.FormatStepData.StepEditData.TypeMenu.MenuItem;
string typeName = stpinfo.FormatStepData.StepEditData.TypeMenu.MenuItem;
if (!string.IsNullOrEmpty(thisTab))
{
thisTab = thisTab.Trim();
}
if (!string.IsNullOrEmpty(thisTab))
{
thisTab = thisTab.Trim();
}
// if the tab is null or
// if the the tab is not a letter or number OR
// the tab is an AND or OR type and is the letter "o"
// then reset the tab an empty string so that the type name along with the count of that type
// (ex. "AND 2", "OR 3")
if (string.IsNullOrEmpty(thisTab) || (thisTab != string.Empty && (!(char.IsLetterOrDigit(thisTab[0])) || ((pitem.IsAnd || pitem.IsOr || pitem.IsCaution || pitem.IsNote) && thisTab.Contains("o")))))
{
thisTab = string.Empty;
}
// if the tab is null or
// if the the tab is not a letter or number OR
// the tab is an AND or OR type and is the letter "o"
// then reset the tab an empty string so that the type name along with the count of that type
// (ex. "AND 2", "OR 3")
if (string.IsNullOrEmpty(thisTab) || (thisTab != string.Empty && (!(char.IsLetterOrDigit(thisTab[0])) || ((pitem.IsAnd || pitem.IsOr || pitem.IsCaution || pitem.IsNote) && thisTab.Contains("o")))))
{
thisTab = string.Empty;
}
if (pitem.IsRNOPart)
{
if (string.IsNullOrEmpty(thisTab))
{
sret.Insert(0, "RNO.");
}
else
{
thisTab = thisTab.Trim();
if (pitem.IsRNOPart)
{
if (string.IsNullOrEmpty(thisTab))
{
sret.Insert(0, "RNO.");
}
else
{
thisTab = thisTab.Trim();
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{
thisTab += ".";
}
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{
thisTab += ".";
}
sret.Insert(0, "RNO." + thisTab);
}
}
else if (pitem.IsCaution || pitem.IsNote)
{
// add the Caution or Note count to the tab (ex "Caution 1", "Note 2")
if (string.IsNullOrEmpty(thisTab))
{
sret.Append("{" + typeName + " " + pitem.Ordinal.ToString() + "}");
}
else
{
thisTab = thisTab.Trim(" ".ToCharArray());
sret.Append(thisTab + " " + pitem.Ordinal.ToString() + sret);
}
}
else
{
if (!string.IsNullOrEmpty(thisTab))
{
thisTab = thisTab.Trim(" ".ToCharArray());
sret.Insert(0, "RNO." + thisTab);
}
}
else if (pitem.IsCaution || pitem.IsNote)
{
// add the Caution or Note count to the tab (ex "Caution 1", "Note 2")
if (string.IsNullOrEmpty(thisTab))
{
sret.Append("{" + typeName + " " + pitem.Ordinal.ToString() + "}");
}
else
{
thisTab = thisTab.Trim(" ".ToCharArray());
sret.Append(thisTab + " " + pitem.Ordinal.ToString() + sret);
}
}
else
{
if (!string.IsNullOrEmpty(thisTab))
{
thisTab = thisTab.Trim(" ".ToCharArray());
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{
thisTab += ".";
}
}
else
{
thisTab = "{" + typeName + " " + pitem.Ordinal.ToString() + "}.";
}
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{
thisTab += ".";
}
}
else
{
thisTab = "{" + typeName + " " + pitem.Ordinal.ToString() + "}.";
}
sret.Insert(0, thisTab);
}
}
sret.Insert(0, thisTab);
}
}
pitem = pitem.ActiveParent as ItemInfo;
pitem = pitem.ActiveParent as ItemInfo;
if (pitem == null)
break;
}
if (pitem == null)
break;
}
return sret.ToString().Trim(" .)".ToCharArray());
return sret.ToString().Trim(" .)".ToCharArray());
}
public void SetHeader(VE_Font myFont, string myText)
@@ -574,11 +574,11 @@ namespace VEPROMS.CSLA.Library
}
_MyPrevious = null; // Reset list so that the next line gets a new list
if (MyPrevious != null) MyPrevious.RefreshNextItems(); // Update List for new value
//if (_ContentID != tmp.ContentID)
//{
//if (_ContentID != tmp.ContentID)
//{
if (MyContent != null) MyContent.RefreshContentItems(); // Update List for old value
_ContentID = tmp.ContentID; // Update the value
//}
//}
_MyContent = null; // Reset list so that the next line gets a new list
if (MyContent != null) MyContent.RefreshContentItems(); // Update List for new value
_DTS = tmp.DTS;
@@ -674,12 +674,12 @@ namespace VEPROMS.CSLA.Library
}
}
}
internal static void SetParentSectionAndDocVersion(ItemInfo itemInfo, IVEDrillDownReadOnly itemParent, SectionInfo sectionInfo, ProcedureInfo procInfo, DocVersionInfo docVersionInfo, bool isAutomatic = false)
{
// B2022-107: Display Progress Bar Messages/Statuses when a new ROFST binary file is loaded into the database
// Added Optional Parameter "bool isAutomatic = false" to disable the RofstLoadingStatus pop-up screen when printing baselines
if (itemInfo == null) return;
itemInfo.LoadAllAtOnce = true;
itemInfo.ActiveParent = itemParent;
@@ -721,7 +721,7 @@ namespace VEPROMS.CSLA.Library
}
}
}
/// <summary>
/// The following method is used only in print because the 'printed' data is loaded into
/// memory before printing. Find the next item from memory (do not go out to database).
@@ -784,7 +784,7 @@ namespace VEPROMS.CSLA.Library
{
bool forceConvertToText = false;
TranCheckCount++;
if (!forceConvertToText)
{
if (traninfo.MyItemToID.ActiveSection != null)
@@ -802,7 +802,7 @@ namespace VEPROMS.CSLA.Library
content.FixTransitionText(traninfo, true);
content.Save();
}
}
}
}
// B2025-020 Null Reference fix. Added check for valid index into the TransitionTypeList
if (!forceConvertToText)
@@ -812,7 +812,7 @@ namespace VEPROMS.CSLA.Library
forceConvertToText = true;
TranFixCount++;
itemInfo.MyContent.FixTransitionText(traninfo, itemInfo, "Reason for Change: Transition type is not available");
using (Content content = Content.Get(itemInfo.MyContent.ContentID))
using (Content content = Content.Get(itemInfo.MyContent.ContentID))
{
content.FixTransitionText(traninfo, true);
content.Save();
@@ -835,14 +835,14 @@ namespace VEPROMS.CSLA.Library
content.FixTransitionText(traninfo, true);
content.Save();
}
}
}
}
}
}
if (!forceConvertToText)
{
if (itemInfo.MyDocVersion != null && traninfo.MyItemToID.MyDocVersion != null && itemInfo.MyDocVersion.VersionID != traninfo.MyItemToID.MyDocVersion.VersionID) //different doc version
if (itemInfo.MyDocVersion != null && traninfo.MyItemToID.MyDocVersion != null && itemInfo.MyDocVersion.VersionID != traninfo.MyItemToID.MyDocVersion.VersionID) //different doc version
{
if (!itemInfo.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList[traninfo.TranType].TransMenu.Contains("Proc")) //internal format
{
@@ -903,7 +903,7 @@ namespace VEPROMS.CSLA.Library
if (itemInfo.MyContent.Text.Contains("Link:Transition"))
{
Content content = Content.Get(itemInfo.MyContent.ContentID);
if (itemInfo.MyContent.ContentTransitions != null)
{
foreach (TransitionInfo ct in itemInfo.MyContent.ContentTransitions)
@@ -913,7 +913,7 @@ namespace VEPROMS.CSLA.Library
}
itemInfo.MyContent.RefreshContentTransitions();
while (content.Text.Contains("Link:Transition"))
{
TranCheckCount++;
@@ -931,7 +931,7 @@ namespace VEPROMS.CSLA.Library
else // B2018-043 Eliminate infinite loop for invalid transition structure
{
// Add annotation for Invalid Transition
AddInvalidTransitionAnnotation(itemInfo,"Invalid Transition Format");
AddInvalidTransitionAnnotation(itemInfo, "Invalid Transition Format");
break;
}
}
@@ -984,16 +984,16 @@ namespace VEPROMS.CSLA.Library
ContentInfo myContent = itemInfo.MyContent;
string txt = myContent.Text;
string regDelete = @"(\\v |)\<START\]\#Link\:Transition(|Range)\:[0-9]+ [0-9]+ [0-9]+(| [0-9]+)\[END\>(\\v0 |)";
string txt2=txt;
string txt2 = txt;
do{
do {
txt = txt2;
txt2 = Regex.Replace(txt, regDelete, "");
} while(txt2 != txt);
} while (txt2 != txt);
if(txt2 != myContent.Text)
if (txt2 != myContent.Text)
{
using(Content tmp = myContent.Get())
using (Content tmp = myContent.Get())
{
tmp.Text = txt2;
tmp.Save();
@@ -1001,7 +1001,7 @@ namespace VEPROMS.CSLA.Library
AddInvalidTransitionAnnotation(itemInfo, "Removed Empty Transition Text");
}
}
private static bool IsTransitionToNonEditable(TransitionInfo ti)
{
foreach (TransitionInfo til in TransitionsToNonEditable)
@@ -1032,7 +1032,7 @@ namespace VEPROMS.CSLA.Library
public static int ROCheckCount = 0;
public static int ROFixCount = 0;
private static AnnotationType _VolianCommentType = null; // Using this to flag ro value issues with byron to braidwood
public static AnnotationType VolianCommentType
{
get
@@ -1065,7 +1065,7 @@ namespace VEPROMS.CSLA.Library
string roval = lookup.GetTranslatedRoValue(rousage.ROID, this.ActiveSection.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, this.ActiveSection.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues, false, this);
ROFSTLookup.rochild roch = lookup.GetRoChild(rousage.ROID);
this.MyContent.FixContentText(rousage, roval, roch.type, rofstinfo, this);
string newText = this.MyContent.Text;
@@ -1263,7 +1263,7 @@ namespace VEPROMS.CSLA.Library
}
}
}
public static string GetCombinedTab(ItemInfo itemInfo, string parTab)
{
string pTab = parTab == null ? "" : parTab;
@@ -1276,7 +1276,7 @@ namespace VEPROMS.CSLA.Library
// for supplemental information, bulleted tabs need to be included in the tab. The 'isletterordigit' should not occur for supinfo items -
// and this includes the parent of the supinfo since that is the tab used for supinfo concatenated with its parent. (B2017-120)
// // B2020-154: Added check for the tab to start with '(', tabs that started with this were not included in the combined tab
if (thisTab != null && thisTab != "" && (!char.IsLetterOrDigit(thisTab[0]) && thisTab[0] != '(') && !vcbHeaderCheck && !itemInfo.IsInSupInfo && (itemInfo.SupInfos == null || itemInfo.SupInfos.Count <= 0 )) return pTab;
if (thisTab != null && thisTab != "" && (!char.IsLetterOrDigit(thisTab[0]) && thisTab[0] != '(') && !vcbHeaderCheck && !itemInfo.IsInSupInfo && (itemInfo.SupInfos == null || itemInfo.SupInfos.Count <= 0)) return pTab;
if (itemInfo.FormatStepData.NumberWithLevel) pTab = itemInfo.MyHLS.MyTab.CleanText.Trim();
// if the parent tab ends with a alphanumeric and this tab is alphanumeric, add a '.' to separate them
// also, include use the separator for bullets if doing the supplemental information tab (B2017-120)
@@ -1285,7 +1285,7 @@ namespace VEPROMS.CSLA.Library
if (ms && mn) pTab = pTab.TrimEnd() + ".";
// remove ending '.' (if this is a hls, don't remove the '.')
if (!itemInfo.IsHigh && thisTab.EndsWith(".")) thisTab = thisTab.Substring(0, thisTab.Length - 1);
if (itemInfo.HasParentTab) return thisTab.Trim(); // F2020-023: if tab includes parent tab already, don't concatenate it
if (itemInfo.HasParentTab) return thisTab.Trim(); // F2020-023: if tab includes parent tab already, don't concatenate it
return pTab + thisTab.Trim();
}
@@ -1341,8 +1341,8 @@ namespace VEPROMS.CSLA.Library
// B2023-037: loading print text, resolve the RO symbols
bool GTLT = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertGTELTEPMinROValue;
bool GLTArrows = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseDashGreaterLessThenForArrowsInROValue;
string roval = lookup.GetTranslatedRoValue(rousage.ROID, sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues, GTLT || GLTArrows, itemInfo);
bool GLTArrows = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseDashGreaterLessThenForArrowsInROValue;
string roval = lookup.GetTranslatedRoValue(rousage.ROID, sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta, sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseTildaPoundCharsForSuperSubScriptInROValues, GTLT || GLTArrows, itemInfo);
ROFSTLookup.rochild roch = lookup.GetRoChild(rousage.ROID);
itemInfo.MyContent.FixContentText(rousage, roval, roch.type, rofstinfo, itemInfo);
}
@@ -1367,7 +1367,7 @@ namespace VEPROMS.CSLA.Library
}
}
}
if (itemInfo.MyContent.ContentTransitionCount > 0)
{
foreach (TransitionInfo traninfo in itemInfo.MyContent.ContentTransitions)
@@ -1440,14 +1440,14 @@ namespace VEPROMS.CSLA.Library
private float _MSWordPageCount = 0;
public float MSWordPageCount
{
get {
get {
if (_MSWordPageCount == 0) // C2018-011 Get the proper word page count from the saved pdf attachment
if (MyContent.MyEntry != null && MyContent.MyEntry.MyDocument != null)
{
PdfInfo pi = PdfInfo.Get(this, false);
if(pi != null) _MSWordPageCount = (float)pi.PageCount;// B2018-071 Don't crash on invalid MS Word section
if (pi != null) _MSWordPageCount = (float)pi.PageCount;// B2018-071 Don't crash on invalid MS Word section
}
return _MSWordPageCount;
return _MSWordPageCount;
}
set { _MSWordPageCount = value; }
}
@@ -1649,7 +1649,7 @@ namespace VEPROMS.CSLA.Library
// the addition of the parent.IsNote, the note was breaking between 2 ANDs (the 1st AND was a
// steplevel of 5, but the 2nd was a steplevel of 4). If something similar is seen with Cautions,
// that check could be added.
if (!item.IsRNOPart && !item.IsHigh && (item.MyPrevious == null || (((item.ActiveFormat.PlantFormat.FormatData.PurchaseOptions & E_PurchaseOptions.EnhancedBackgrounds) != E_PurchaseOptions.EnhancedBackgrounds)
if (!item.IsRNOPart && !item.IsHigh && (item.MyPrevious == null || (((item.ActiveFormat.PlantFormat.FormatData.PurchaseOptions & E_PurchaseOptions.EnhancedBackgrounds) != E_PurchaseOptions.EnhancedBackgrounds)
&& item.MyParent != null && item.MyParent.IsNote)))
level += firstInc;
else
@@ -1716,7 +1716,7 @@ namespace VEPROMS.CSLA.Library
}
return maxRNOLevel;
}
}
private bool ParentAndOr
{
@@ -1767,7 +1767,7 @@ namespace VEPROMS.CSLA.Library
RemoveEnhancedFromConfig(false);
}
public void RemoveEnhancedFromConfig(bool doOneStepOnly)
public void RemoveEnhancedFromConfig(bool doOneStepOnly)
{
XmlDocument xd = new XmlDocument();
if (this.MyContent.Config == null || this.MyContent.Config == "") return; // B2017-164 & B2017-172 check for null or empty config
@@ -1782,7 +1782,7 @@ namespace VEPROMS.CSLA.Library
ctmp.Config = config;
ctmp.Save();
ContentInfo.Refresh(ctmp);
_MyConfig = null; // refresh the memory value
_MyConfig = null; // refresh the memory value
}
}
if (doOneStepOnly) return;
@@ -2071,7 +2071,7 @@ namespace VEPROMS.CSLA.Library
{
bool rval = false;
ItemInfo itm = this;
while (itm != null &&!itm.IsHigh && !rval)
while (itm != null && !itm.IsHigh && !rval)
{
rval = itm.IsCautionOrNotePart;
if (!rval) itm = itm.MyParent;
@@ -2111,6 +2111,16 @@ namespace VEPROMS.CSLA.Library
return (sd.Type == type);
}
// C2025-024 - Electronic Procedures - Export
//return if should export blanks
public bool EPexportblank(int AnnTypeID)
{
if (ActiveFormat.PlantFormat.EPFormatFiles.Count == 0 || !ActiveFormat.PlantFormat.EPFormatFiles.Exists(x => x.AnnotationTypeID == AnnTypeID))
return true;
else
return ActiveFormat.PlantFormat.EPFormatFiles.Find(x => x.AnnotationTypeID == AnnTypeID).exportblank;
}
// C2025-023 - Electronic Procedures - Modifications to PROMS
//return EPFields that match this step type or a parent step type
public EPFields GetValidEPFields(int AnnTypeID)

View File

@@ -11,138 +11,157 @@ using static VEPROMS.CSLA.Library.ROFSTLookup;
namespace VEPROMS.CSLA.Library
{
//C2025-023 - Electronic Procedures - Modifications to PROMS
// class to handle storage and access of EPFormatFile and EPFormatFile details
#region EPFormatFiles
[TypeConverter(typeof(vlnListConverter<EPFormatFiles, EPFormatFile>))]
public class EPFormatFiles : vlnFormatList<EPFormatFile>
{
public EPFormatFiles(XmlNodeList xmlNodeList) : base(xmlNodeList) { }
}
#endregion
#region EPFormatFile
public class EPFormatFile : vlnFormatItem
{
#region Constructor
public EPFormatFile(XmlNode xmlNode) : base(xmlNode) { }
public EPFormatFile() : base() { }
#endregion
#region Business Fields
// Name of the EP Viewer Format File
private LazyLoad<string> _Name;
[DisplayName("Name")]
[Description("EP Viewer File Name")]
public string Name
{
get
{
return LazyLoad(ref _Name, "@Name");
}
}
// Name of the EP Viewer Format File
private LazyLoad<string> _Description;
[DisplayName("Description")]
[Description("EP Viewer Description")]
public string Description
{
get
{
return LazyLoad(ref _Description, "@Description");
}
}
// Id of Annotation Type Associated with this file
private LazyLoad<int?> _AnnotationTypeID;
[DisplayName("AnnotationTypeID")]
[Description("Id of Annotation Type Associated with this file")]
public int? AnnotationTypeID
{
get
{
return LazyLoad(ref _AnnotationTypeID, "@AnnotationTypeID");
}
}
// returns a list of fields that are defined in the EP format's structure
private EPFields _FieldList;
public EPFields FieldList
{
get
{
XmlDocument xd = GetEPFormatData(Name);
return _FieldList == null ? _FieldList = new EPFields(xd.SelectNodes("/EPFormat/EPField")) : _FieldList;
}
}
#endregion
#region Business Methods
// update all in-use annotation types that have Electronic Procedures
public static void UpdateAllInUseEPAnnotationTypes()
{
foreach (int formatid in GetAllInUseFormats())
{
PlantFormat frmt = FormatInfo.Get(formatid).PlantFormat;
foreach (EPFormatFile EP in frmt.EPFormatFiles)
//C2025-023 - Electronic Procedures - Modifications to PROMS
// class to handle storage and access of EPFormatFile and EPFormatFile details
#region EPFormatFiles
[TypeConverter(typeof(vlnListConverter<EPFormatFiles, EPFormatFile>))]
public class EPFormatFiles : vlnFormatList<EPFormatFile>
{
public EPFormatFiles(XmlNodeList xmlNodeList) : base(xmlNodeList) { }
}
#endregion
#region EPFormatFile
public class EPFormatFile : vlnFormatItem
{
#region Constructor
public EPFormatFile(XmlNode xmlNode) : base(xmlNode) { }
public EPFormatFile() : base() { }
#endregion
#region Business Fields
// Name of the EP Viewer Format File
private LazyLoad<string> _Name;
[DisplayName("Name")]
[Description("EP Viewer File Name")]
public string Name
{
get
{
return LazyLoad(ref _Name, "@Name");
}
}
// Name of the EP Viewer Format File
private LazyLoad<string> _Description;
[DisplayName("Description")]
[Description("EP Viewer Description")]
public string Description
{
get
{
return LazyLoad(ref _Description, "@Description");
}
}
// Id of Annotation Type Associated with this file
private LazyLoad<int?> _AnnotationTypeID;
[DisplayName("AnnotationTypeID")]
[Description("Id of Annotation Type Associated with this file")]
public int? AnnotationTypeID
{
get
{
return LazyLoad(ref _AnnotationTypeID, "@AnnotationTypeID");
}
}
// Return Name of Annotation that EP Format File is Attached to
public string AnnotationName()
{
return AnnotationTypeInfo.Get((int) AnnotationTypeID).Name;
}
//if xml value is blank, should element export?
//defaults to true
private LazyLoad<bool> _exportblank;
[DisplayName("exportblank")]
[Description("if xml value is blank, should element export?")]
public bool exportblank
{
get
{
return LazyLoad(ref _exportblank, "@exportblank");
}
}
// returns a list of fields that are defined in the EP format's structure
private EPFields _FieldList;
public EPFields FieldList
{
get
{
XmlDocument xd = GetEPFormatData(Name);
return _FieldList ?? (_FieldList = new EPFields(xd.SelectNodes("/EPFormat/EPField")));
}
}
#endregion
#region Business Methods
// update all in-use annotation types that have Electronic Procedures
public static void UpdateAllInUseEPAnnotationTypes()
{
foreach (int formatid in GetAllInUseFormats())
{
PlantFormat frmt = FormatInfo.Get(formatid).PlantFormat;
foreach (EPFormatFile EP in frmt.EPFormatFiles)
{
UpdateAnnotationTypeAsEP((int) EP.AnnotationTypeID);
}
}
}
#endregion
#region Data Access
// static - Load EP Format details - save to db (insert/update)
public static void UpdateEPFormat(string name, string data, string userID)
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "vesp_UpdateEPFormat";
cm.Parameters.AddWithValue("@name", name);
cm.Parameters.AddWithValue("@data", data);
cm.Parameters.AddWithValue("@userID", userID);
cm.CommandTimeout = Database.DefaultTimeout;
cm.ExecuteNonQuery();
}
}
}
UpdateAnnotationTypeAsEP((int) EP.AnnotationTypeID);
}
}
}
#endregion
#region Data Access
// static - Load EP Format details - save to db (insert/update)
public static void UpdateEPFormat(string name, string data, string userID)
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "vesp_UpdateEPFormat";
cm.Parameters.AddWithValue("@name", name);
cm.Parameters.AddWithValue("@data", data);
cm.Parameters.AddWithValue("@userID", userID);
cm.CommandTimeout = Database.DefaultTimeout;
cm.ExecuteNonQuery();
}
}
}
// load data for getting fieldlist for this EPFormat
public static XmlDocument GetEPFormatData(string name)
{
name = name.Replace(".xml", "");
// load data for getting fieldlist for this EPFormat
public static XmlDocument GetEPFormatData(string name)
{
name = name.Replace(".xml", "");
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = "Select Data FROM EPFormats where Name = @Name";
cm.Parameters.AddWithValue("@Name", name);
cm.CommandTimeout = Database.DefaultTimeout;
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
if (dr.Read())
{
XmlDocument xd = new XmlDocument();
xd.XmlResolver = null;
xd.LoadXml(dr.GetString("Data"));
return xd;
}
}
}
}
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = "Select Data FROM EPFormats where Name = @Name";
cm.Parameters.AddWithValue("@Name", name);
cm.CommandTimeout = Database.DefaultTimeout;
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
if (dr.Read())
{
XmlDocument xd = new XmlDocument();
xd.XmlResolver = null;
xd.LoadXml(dr.GetString("Data"));
return xd;
}
}
}
}
return null;
}
return null;
}
// Get all in-use formats
public static List<int> GetAllInUseFormats()
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"SELECT Distinct Formats.[FormatID]
// Get all in-use formats
public static List<int> GetAllInUseFormats()
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"SELECT Distinct Formats.[FormatID]
FROM
(
SELECT FormatID FROM Contents
@@ -153,260 +172,272 @@ namespace VEPROMS.CSLA.Library
) inuse
inner join Formats
on inuse.FormatID = Formats.FormatID";
cm.CommandTimeout = Database.DefaultTimeout;
cm.CommandTimeout = Database.DefaultTimeout;
using (DataTable dt = new DataTable())
{
using (SqlDataAdapter da = new SqlDataAdapter(cm))
{
da.Fill(dt);
return dt.AsEnumerable().Select(x => x.Field<int>("FormatID")).ToList();
}
}
using (DataTable dt = new DataTable())
{
using (SqlDataAdapter da = new SqlDataAdapter(cm))
{
da.Fill(dt);
return dt.AsEnumerable().Select(x => x.Field<int>("FormatID")).ToList();
}
}
}
}
}
}
}
}
// update an annotation type as an Electronic Procedure Annotation Type
public static void UpdateAnnotationTypeAsEP(int typeID)
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"Update AnnotationTypes
// update an annotation type as an Electronic Procedure Annotation Type
public static void UpdateAnnotationTypeAsEP(int typeID)
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"Update AnnotationTypes
SET IsEPAnnotationType = 1
WHERE TypeID = @typeID";
cm.Parameters.AddWithValue("@typeID", typeID);
cm.CommandTimeout = Database.DefaultTimeout;
cm.ExecuteNonQuery();
}
}
}
cm.Parameters.AddWithValue("@typeID", typeID);
cm.CommandTimeout = Database.DefaultTimeout;
cm.ExecuteNonQuery();
}
}
}
// Returns true if there are any EP Annotation Types
public static bool IsEPAnnotationType()
{
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"SELECT RESULT = CASE WHEN
// Returns true if there are any EP Annotation Types
public static bool IsEPAnnotationType()
{
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.Text;
cm.CommandText = @"SELECT RESULT = CASE WHEN
EXISTS(SELECT 1 FROM AnnotationTypes where IsEPAnnotationType = 1)
THEN 1 ELSE 0 END";
cm.CommandTimeout = Database.DefaultTimeout;
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
if (dr.Read() && dr.GetInt32("RESULT") == 1)
return true;
}
}
}
}
catch
{
// EP Support has not yet been added for this DB
// IsEPAnnotationType does not exist
// need to run PROMS Fixes
// until then will ignore EP code
// instead of crashing for a field not found
}
cm.CommandTimeout = Database.DefaultTimeout;
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
if (dr.Read() && dr.GetInt32("RESULT") == 1)
return true;
}
}
}
}
catch
{
// EP Support has not yet been added for this DB
// IsEPAnnotationType does not exist
// need to run PROMS Fixes
// until then will ignore EP code
// instead of crashing for a field not found
}
return false;
}
#endregion
}
return false;
}
#endregion
}
public class EPFields : vlnFormatList<EPField>
{
public class EPFields : vlnFormatList<EPField>
{
public EPFields()
{
}
public EPFields(XmlNodeList xmlNodeList) : base(xmlNodeList) { }
}
// EP field class
public class EPField : vlnFormatItem
{
public EPField(XmlNode xmlNode) : base(xmlNode) { }
public EPField() : base() { }
private LazyLoad<string> _name;
public string name
{
get
{
return LazyLoad(ref _name, "@name");
}
}
private LazyLoad<string> _type;
public string type
{
get
{
return LazyLoad(ref _type, "@type");
}
}
private LazyLoad<string> _label;
public string label
{
get
{
string tmp = LazyLoad(ref _label, "@label");
}
// EP field class
public class EPField : vlnFormatItem
{
public EPField(XmlNode xmlNode) : base(xmlNode) { }
public EPField() : base() { }
private LazyLoad<string> _name;
public string name
{
get
{
return LazyLoad(ref _name, "@name");
}
}
private LazyLoad<string> _type;
public string type
{
get
{
return LazyLoad(ref _type, "@type");
}
}
private LazyLoad<string> _label;
public string label
{
get
{
string tmp = LazyLoad(ref _label, "@label");
if (string.IsNullOrEmpty(tmp))
return LazyLoad(ref _name, "@name");
else
return tmp;
}
}
private LazyLoad<string> _text;
public string text
{
get
{
return LazyLoad(ref _text, "@text");
}
}
//roid of group item that individual sub-items will be the choices for the list/combobox for ROSINGLE and ROMULTI
private LazyLoad<string> _rosource;
public string rosource
{
get
{
return LazyLoad(ref _rosource, "@rosource");
}
}
//the columns in the RO that will be included in the exports
private LazyLoad<string> _returncols;
public List<string> returncols()
{
try
{
string tmp = LazyLoad(ref _returncols, "@returncols");
if (string.IsNullOrEmpty(tmp))
return LazyLoad(ref _name, "@name");
else
return tmp;
}
}
private LazyLoad<string> _text;
public string text
{
get
{
return LazyLoad(ref _text, "@text");
}
}
//roid of group item that individual sub-items will be the choices for the list/combobox for ROSINGLE and ROMULTI
private LazyLoad<string> _rosource;
public string rosource
{
get
{
return LazyLoad(ref _rosource, "@rosource");
}
}
//the columns in the RO that will be included in the exports
private LazyLoad<string> _returncols;
public List<string> returncols()
{
try
{
string tmp = LazyLoad(ref _returncols, "@returncols");
if (string.IsNullOrEmpty(tmp))
return new List<string>();
else
return tmp.Split(',').Select(p => p.Trim()).ToList();
}
catch
{
throw new ArgumentException($"Error in returncols for EP file: {((EPFormatFile)MyParentFormat).Name}.xml, field: {name}");
}
}
if (string.IsNullOrEmpty(tmp))
return new List<string>();
else
return tmp.Split(',').Select(p => p.Trim()).ToList();
}
catch
{
throw new ArgumentException($"Error in returncols for EP file, field: {name}");
}
}
//number of lines for a multi-line text box to span
private LazyLoad<int?> _numlines;
public int numlines
{
get
{
int? tmp = LazyLoad(ref _numlines, "@numlines");
//number of lines for a multi-line text box to span
private LazyLoad<int?> _numlines;
public int numlines
{
get
{
int? tmp = LazyLoad(ref _numlines, "@numlines");
if (tmp == null)
return 1;
if (tmp == null)
return 1;
return (int) tmp;
}
}
//step types that the EPForma Item is valid for (as a list of types)
private LazyLoad<string> _validforsteptypes;
return (int) tmp;
}
}
//step types that the EPForma Item is valid for (as a list of types)
private LazyLoad<string> _validforsteptypes;
public List<string> validforsteptypes()
{
try
{
string tmp = LazyLoad(ref _validforsteptypes, "@validforsteptypes");
return tmp.Split(',').Select(p => p.Trim()).ToList();
}
catch
{
throw new ArgumentException($"Error in validforsteptypes for EP file: {((EPFormatFile) MyParentFormat).Name}.xml, field: {name}");
}
}
public bool IsValidForStepType(string StepType)
{
List<string> tmp = validforsteptypes();
return tmp.Contains(StepType);
}
{
try
{
string tmp = LazyLoad(ref _validforsteptypes, "@validforsteptypes");
return tmp.Split(',').Select(p => p.Trim()).ToList();
}
catch
{
throw new ArgumentException($"Error in validforsteptypes for EP file, field: {name}");
}
}
public bool IsValidForStepType(string StepType)
{
List<string> tmp = validforsteptypes();
return tmp.Contains(StepType);
}
//return a list of items based on the ROsource specified in the EPFormat File
//will return all RO items under the Group that's roid = the rosource
public List<ROListItem> getROList(AnnotationInfo currAnn, bool includeblank)
{
if (string.IsNullOrEmpty(rosource))
return new List<ROListItem>();
//return a list of items based on the ROsource specified in the EPFormat File
//will return all RO items under the Group that's roid = the rosource
public List<ROListItem> getROList(AnnotationInfo currAnn, bool includeblank)
{
if (string.IsNullOrEmpty(rosource))
return new List<ROListItem>();
try
{
DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
try
{
DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
string roid = FormatRoidKey(rosource, false);
rochild[] children = lookup.GetRoChildrenByRoid(roid);
if (MyDocVersion.DocVersionAssociations != null && MyDocVersion.DocVersionAssociations.Any())
{
ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
List<ROListItem> mylist = children.Select(x => new ROListItem(x.title, x.roid.Substring(0, 12))).ToList();
if (includeblank)
mylist.Insert(0, new ROListItem("", ""));
string roid = FormatRoidKey(rosource, false);
rochild[] children = lookup.GetRoChildrenByRoid(roid);
return mylist;
}
catch (Exception Ex)
{
throw new ArgumentException($"Error in rosource for EP file: {((EPFormatFile)MyParentFormat).Name}.xml, field: {name}");
}
}
List<ROListItem> mylist = children.Select(x => new ROListItem(x.title, x.roid.Substring(0, 12))).ToList();
if (includeblank)
mylist.Insert(0, new ROListItem("", ""));
return mylist;
}
else
{
return new List<ROListItem>
{
new ROListItem("", "")
};
}
//return a list of values for the specified ROID
//given the EP items return columns
//will return all RO items under the Group that's roid = the rosource
public List<string> getROValuesList(AnnotationInfo currAnn, string roid)
{
if (string.IsNullOrEmpty(roid))
return new List<string>();
}
catch
{
throw new ArgumentException($"Error in rosource for EP file, field: {name}");
}
}
List<string> values = new List<string>();
DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
rochild ro = lookup.GetRoChild(roid);
//return a list of values for the specified ROID
//given the EP items return columns
//will return all RO items under the Group that's roid = the rosource
public List<string> getROValuesList(AnnotationInfo currAnn, string roid)
{
if (string.IsNullOrEmpty(roid))
return new List<string>();
List<string> rtncols = returncols();
List<string> values = new List<string>();
DocVersionInfo MyDocVersion = currAnn.MyItem.MyDocVersion;
ROFSTLookup lookup = MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MyDocVersion);
rochild ro = lookup.GetRoChild(roid);
if (rtncols.Count == 0)
{
values.Add(ro.value);
}
else
{
foreach (string rcol in rtncols)
{
rochild ro_indiv = Array.Find(ro.children, x => x.appid.EndsWith($".{rcol}"));
if (ro_indiv.value != null) values.Add(ro_indiv.value);
}
}
List<string> rtncols = returncols();
return values;
if (rtncols.Count == 0)
{
values.Add(ro.value);
}
else
{
foreach (string rcol in rtncols)
{
rochild ro_indiv = Array.Find(ro.children, x => x.appid.EndsWith($".{rcol}"));
if (ro_indiv.value != null) values.Add(ro_indiv.value);
}
}
}
}
#endregion
//C2025-023 - Electronic Procedures - Modifications to PROMS
// class to handle return of RO Lists
#region EPFormatFiles
public class ROListItem
{
public string Text { get; private set; }
public string Value { get; private set; }
public ROListItem(string _text, string _value)
{
Text = _text; Value = _value;
}
}
#endregion
return values;
}
}
#endregion
//C2025-023 - Electronic Procedures - Modifications to PROMS
// class to handle return of RO Lists
#region EPFormatFiles
public class ROListItem
{
public string Text { get; private set; }
public string Value { get; private set; }
public ROListItem(string _text, string _value)
{
Text = _text; Value = _value;
}
}
#endregion
}

View File

@@ -618,6 +618,15 @@ namespace Volian.Controls.Library
}
private int _MyLastFormatID = -1;
private StepRTB _MyStepRTB;
private static int _OringFlg;
public static int OringFlg
{
get { return _OringFlg; }
set
{
_OringFlg = value;
}
}
public StepRTB MyStepRTB
{
get { return _MyStepRTB; }
@@ -4143,16 +4152,22 @@ namespace Volian.Controls.Library
private void btnPdfCreate_Click(object sender, EventArgs e)
{
// B2025-036 split screen print issue. if oringFlg == 1 the ctrl-p keys was pressed.
_OringFlg = 0;
DevComponents.DotNetBar.eEventSource oring = ((DevComponents.DotNetBar.Events.EventSourceArgs)e).Source;
if (oring == eEventSource.Keyboard)
_OringFlg = 1;
if (MyItemInfo == null) return; // if creating a pdf before rtb exists, return;
if (MyEditItem != null) MyEditItem.SaveCurrentAndContents();
OnPrintRequest(new StepTabRibbonEventArgs(MyItemInfo.MyProcedure), 0);
OnPrintRequest(new StepTabRibbonEventArgs(MyItemInfo.MyProcedure, _OringFlg), 0);
}
private void btnPdfQuickCreate_Click(object sender, EventArgs e)
{
if (MyItemInfo == null) return; // if creating a pdf before rtb exists, return;
if (MyEditItem != null) MyEditItem.SaveCurrentAndContents();
OnPrintRequest(new StepTabRibbonEventArgs(MyItemInfo.MyProcedure), 1);
OnPrintRequest(new StepTabRibbonEventArgs(MyItemInfo.MyProcedure, _OringFlg), 1);
}
private void btnCASCreate_Click(object sender, EventArgs e)
@@ -4814,9 +4829,10 @@ namespace Volian.Controls.Library
public class StepTabRibbonEventArgs : EventArgs
{
public StepTabRibbonEventArgs() { ; }
public StepTabRibbonEventArgs(ItemInfo proc)
public StepTabRibbonEventArgs(ItemInfo proc, int oringFlg = 0)
{
_Proc = proc;
OringFlg = oringFlg;
}
private ItemInfo _Proc;
@@ -4825,6 +4841,13 @@ namespace Volian.Controls.Library
get { return _Proc; }
set { _Proc = value; }
}
// B2025-036 split screen print issue. if oringFlg == 1 the ctrl-p keys was pressed.
private int _OringFlg;
public int OringFlg
{
get { return _OringFlg; }
set { _OringFlg = value; }
}
}
public delegate void StepTabRibbonEvent(object sender, StepTabRibbonEventArgs args);

View File

@@ -120,7 +120,7 @@ namespace Volian.Controls.Library
foreach (string t in tmps) cmb.Items.Add(t.Trim());
string val = MyConfig.GetValue("EP", EP.name);
if (val != null && val != "") cmb.SelectedItem = val;
cmb.DropDownWidth = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Length).First(), cmb.Font).Width + SystemInformation.VerticalScrollBarWidth;
cmb.DropDownWidth = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Length).FirstOrDefault(), cmb.Font).Width + SystemInformation.VerticalScrollBarWidth;
cmb.Width = cmb.DropDownWidth;
_DicComboBox.Add(EP.name, cmb);
panelEP.Controls.Add(cmb, 1, panelEP.RowCount - 1);
@@ -135,7 +135,7 @@ namespace Volian.Controls.Library
cmb.ValueMember = "Value";
cmb.DataSource = tmps;
cmb.DropDownStyle = ComboBoxStyle.DropDownList;
cmb.DropDownWidth = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Text.Length).First().Text, cmb.Font).Width + SystemInformation.VerticalScrollBarWidth;
cmb.DropDownWidth = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Text.Length).FirstOrDefault()?.Text, cmb.Font).Width + SystemInformation.VerticalScrollBarWidth;
cmb.Width = cmb.DropDownWidth;
_DicSingleRO.Add(EP.name, cmb);
@@ -148,7 +148,7 @@ namespace Volian.Controls.Library
List<ROListItem> tmps = EP.getROList(currAnn, false);
lb.DisplayMember = "Text";
lb.ValueMember = "Value";
lb.Width = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Text.Length).First().Text, lb.Font).Width + SystemInformation.VerticalScrollBarWidth;
lb.Width = TextRenderer.MeasureText(tmps.OrderByDescending(x => x.Text.Length).FirstOrDefault()?.Text, lb.Font).Width + SystemInformation.VerticalScrollBarWidth;
lb.DataSource = tmps;
_DicMultiRO.Add(EP.name, lb);

View File

@@ -152,6 +152,15 @@ namespace Volian.Controls.Library
get { return _Index; }
set { _Index = value; }
}
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//AnnotationType that would be doing an export for
private int _AnnotationTypeId = -1;
public int AnnotationTypeId
{
get { return _AnnotationTypeId; }
set { _AnnotationTypeId = value; }
}
//jcb multiunit
private string _Unit;
public string Unit
@@ -179,6 +188,13 @@ namespace Volian.Controls.Library
_Destination = destination;
_Index = index;
}
public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, int annTypeId)
{
_Node = node;
_Destination = destination;
_Index = index;
_AnnotationTypeId = annTypeId;
}
//jcb multiunit
public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, string unit, int unitIndex)
{
@@ -188,6 +204,15 @@ namespace Volian.Controls.Library
_Unit = unit;
_UnitIndex = unitIndex;
}
public vlnTreeEventArgs(TreeNode node, TreeNode destination, int index, string unit, int unitIndex, int annTypeId)
{
_Node = node;
_Destination = destination;
_Index = index;
_Unit = unit;
_UnitIndex = unitIndex;
_AnnotationTypeId = annTypeId;
}
//end jcb multiunit
#endregion
public override string ToString()
@@ -706,7 +731,10 @@ namespace Volian.Controls.Library
if (ui.IsAdministrator() || ui.IsSetAdministrator(fi))// && fi.MyParent == null) //VEPROMS level
{
if (fi.HasWorkingDraft)
{
cm.MenuItems.Add("Export Procedure Set", new EventHandler(mi_Click));
//AddEPExport(cm.MenuItems, 0, null);
}
else
cm.MenuItems.Add("Import Procedure Set", new EventHandler(mi_Click));
if (DoSpecificInfo)
@@ -842,6 +870,9 @@ namespace Volian.Controls.Library
if (ui.IsAdministrator() || ui.IsSetAdministrator(pri.MyDocVersion))
{
cm.MenuItems.Add("Export Procedure", mi_Click);
//C2025-024 Proms XML Output - if have any EP Format files, add dropdown menu for exporting EP formats
if (pri.ActiveFormat.PlantFormat.EPFormatFiles.Count > 0)
AddEPExport(cm.MenuItems, pri.MyDocVersion.MultiUnitCount, pri.MyDocVersion.UnitNames, pri.ActiveFormat.PlantFormat.EPFormatFiles);
}
if (ui.IsAdministrator() || ui.IsSetAdministrator(pri.MyDocVersion) || ui.IsWriter(pri.MyDocVersion))
{
@@ -1355,6 +1386,43 @@ namespace Volian.Controls.Library
}
}
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
// Add context menu for exporting Electronic Procedures
// if has an Electronic procedure
// then loop through and add an Export for each EP Viewer
private void AddEPExport(Menu.MenuItemCollection menuItems, int MultiUnitCount, string[] UnitNames, EPFormatFiles EPFiles)
{
//add outer menu
MenuItem mi = menuItems.Add("Electronic Procedure Viewer Export");
foreach (EPFormatFile epAnnType in EPFiles)
{
//Add item for each individual EP Viewer
MenuItem mv = mi.MenuItems.Add(epAnnType.AnnotationName());
//tag will be of format:
//{EP Annotation Type ID},{Unit}
//if not multi-unit, unit will be zero.
if (MultiUnitCount > 1)
{
//if multi-unit, add menu item for each unit
int k = 0;
foreach (string s in UnitNames)
{
k++;
MenuItem multiunit_mv = mv.MenuItems.Add(s);
multiunit_mv.Tag = $"{epAnnType.AnnotationTypeID},{k}";
multiunit_mv.Click += new EventHandler(miEP_Click);
}
}
else
{
mv.Tag = $"{epAnnType.AnnotationTypeID},0";
mv.Click += new EventHandler(miEP_Click);
}
}
}
private void AddApprovedRevisionsMultiUnit(Menu.MenuItemCollection menuItemCollection, ProcedureInfo pri)
{
_currentPri = pri;
@@ -2251,6 +2319,23 @@ namespace Volian.Controls.Library
break;
}
}
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
// Handles clicking of items in the context menu
// for exporting Electronic Procedures
// tag will be of format:
// {EP Annotation Type ID},{Unit}
// if not multi-unit, unit will be zero.
void miEP_Click(object sender, EventArgs e)
{
MenuItem mi = sender as MenuItem;
int annTypeid = int.Parse(((string)mi.Tag).Split(',')[0]);
int unit = int.Parse(((string)mi.Tag).Split(',')[1]);
if (unit == 0)
OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, annTypeid));
else
OnExportImportProcedureSets(this, new vlnTreeEventArgs(SelectedNode as VETreeNode, null, 0, "", unit, annTypeid));
}
private bool _doingCollapseNode = false; // B2016-058 when collapse is done, it always calls the drag node event which doesn't appear to be needed
private void CollapseProcedures()
{

View File

@@ -1688,7 +1688,7 @@ namespace Volian.Print.Library
System.Windows.Forms.MessageBox.Show(msg.ToString(), "Error during PDF creation for search:", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
}
private static string BuildStepTab(ItemInfo item)
public static string BuildStepTab(ItemInfo item)
{
if (item == null)
return string.Empty;