C2021-018 logic to support showing Alarm Point RO info in the step Editor

This commit is contained in:
John Jenko 2022-03-21 19:42:37 +00:00
parent 0d464dfa10
commit fdc72f891d
3 changed files with 305 additions and 0 deletions

View File

@ -1092,6 +1092,11 @@ namespace VEPROMS.CSLA.Library
if (_Text == string.Empty) if (_Text == string.Empty)
_Text = "?"; _Text = "?";
} }
// C2021-018 used to update the content record when displaying Alarm Pont Table information in the step Editor (BNPP alarms)
public void UpdateAlarmTableInfoView(string updateText)
{
_Text = updateText;
}
public void LoadNonCachedGrid() public void LoadNonCachedGrid()
{ {
_MyGrid = GridInfo.GetNonCached(ContentID); _MyGrid = GridInfo.GetNonCached(ContentID);

View File

@ -3545,6 +3545,304 @@ namespace Volian.Controls.Library
return MyPreviousEditItem.MyParent; return MyPreviousEditItem.MyParent;
} }
} }
// C2021-018 used to display Alarm Point Table RO values in the editor
// Get the RO value for the given RO AccPageID and multiple Return Value option
private string ROLookupForEditorView(SectionInfo MySection, string accpageid, string multiid, string deflt)
{
ROFSTLookup myLookup = MySection.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(MySection.MyDocVersion, "");
string accpgid = accpageid;
string val = myLookup.GetROValueByAccPagID(string.Format("<{0}.{1}>",accpgid,multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix);
if (val == null)
{
accpgid = accpgid.Replace(@"\u8209?", "-");
val = myLookup.GetROValueByAccPagID(string.Format("<{0}.{1}>", accpgid, multiid), MySection.MyDocVersion.DocVersionConfig.RODefaults_setpointprefix, MySection.MyDocVersion.DocVersionConfig.RODefaults_graphicsprefix);
}
if (!deflt.StartsWith("[") && val != null && val.Trim().Length > 0) // don't return val if it's an empty or blank string - jsj 01-28-2019
{
val = val.Replace("[xB3]", "\xB3");
val = val.Replace("[xB2]", "\xB2");
return val;
}
return deflt;
}
// C2021-018 used to display Alarm Point Table RO values in the editor
private string ResolveUnitApp(DocVersionInfo dvi, string str)
{
if (dvi == null) return str;
string tmp = str.ToUpper();
int sindx = tmp.IndexOf("<U");
int eindx = tmp.IndexOf(">", sindx + 1);
string reptmp;
while (sindx > -1 && eindx > -1) // B2022-007 added while loop to process more than one <U- RO value
{
reptmp = str.Substring(sindx, eindx - sindx + 1);
tmp = reptmp.ToUpper();
if (tmp == "<U>") str = str.Replace(reptmp, dvi.DocVersionConfig.Unit_Number);
else if (tmp == "<U-TEXT>") str = str.Replace(reptmp, dvi.DocVersionConfig.Unit_Text);
else if (tmp == "<U-NUMBER>") str = str.Replace(reptmp, dvi.DocVersionConfig.Unit_Number);
else if (tmp == "<U-NAME>") str = str.Replace(reptmp, dvi.DocVersionConfig.Unit_Name);
else if (tmp == "<U-ID>") str = str.Replace(reptmp, dvi.DocVersionConfig.Unit_ID);
// B2021-145: For applicability, the tree view & pdf file name are not getting resolved when using any of the OTHER tokens
else if (tmp == "<U-OTHERTEXT>") str = str.Replace(reptmp, dvi.DocVersionConfig.Other_Unit_Text);
else if (tmp == "<U-OTHERNUMBER>") str = str.Replace(reptmp, dvi.DocVersionConfig.Other_Unit_Number);
else if (tmp == "<U-OTHERNAME>") str = str.Replace(reptmp, dvi.DocVersionConfig.Other_Unit_Name);
else if (tmp == "<U-OTHERID>") str = str.Replace(reptmp, dvi.DocVersionConfig.Other_Unit_ID);
else str = str.Replace(reptmp, tmp.Replace("<", "*?").Replace(">", "?*"));
tmp = str.ToUpper();
sindx = tmp.IndexOf("<U");
eindx = tmp.IndexOf(">", sindx + 1);
}
return str;
}
// C2021-018 used to display Alarm Point Table RO values in the editor
// translate pagelist tokens that are used in the parameters for the RO Lookup calls
private bool ProcessROLookupCfgParams(VEPROMS.CSLA.Library.SectionInfo section, ref string plstr, string token)
{
bool retval = true;
// Paglist token inside a PS= conditional are surrounded by square brackets instead of curley
// ex. [BOX3] instead of {BOX3}, thus the redunant looking cases
switch (token)
{
case "{EOPNUM}":
case "[EOPNUM]":
case "{PREDELIMEOPNUM}":
case "[PREDELIMEOPNUM]":
case "{EOPNUMROLU}":
case "[EOPNUMROLU]":
string eopnum = section.MyProcedure.MyContent.Number;
if (eopnum.ToUpper().Contains(@"<U"))
{
// C2021-064 If we are processing the EOP number or an ROLookUp in the pagelist, then strip out the Parent/Child unit tokens
// so that we are left with just the EOP number. This is used along with Parent/Child RO Values (in RO Editor)
if ((token.Equals("{EOPNUMROLU}") || token.Equals("[EOPNUMROLU]")))
{
// copied Rgex from DisplayText and modifed to remove the Parent/Child Unit information
// i.e. <U>, <U-ID>, <U-NAME>, <U-TEXT>, <U-NUMBER>, <U-OTHERID>, <U-OTHERNAME>, <U-OTHERTEXT>, <U-OTHERNUMBER>
eopnum = Regex.Replace(eopnum, @"\<U\>", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)ID)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)NAME)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)TEXT)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)NUMBER)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
// B2021-148 remove space character after "OTHER"
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)OTHERID)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)OTHERNAME)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)OTHERTEXT)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
eopnum = Regex.Replace(eopnum, @"\<(U(-|\\u8209\?)OTHERNUMBER)\>(-|\\u8209\?)", "", RegexOptions.IgnoreCase);
}
else
eopnum = section.MyProcedure.DisplayNumber;// B2021-066: found and fixed during proc pc/pc work
}
if (token.Equals("{ PREDELIMEOPNUM}"))
{
// only use up to the first non-alphanumeric character of the procedur number
// Prairie Island (NSP) Alarms use this token
int idx = 0;
while (idx < eopnum.Length && char.IsLetterOrDigit(eopnum[idx])) idx++;
if (idx < eopnum.Length)
eopnum = eopnum.Substring(0, idx);
}
plstr = plstr.Replace(token, eopnum);
break;
default:
if (token.Contains(@"SI-")) // procedure set specific information. (at folder or working draft levels)
{
DocVersionConfig dvConfig = new DocVersionConfig(section.MyProcedure.MyDocVersion.Config);
FolderConfig folderConfig = new FolderConfig(section.MyProcedure.MyDocVersion.MyFolder.Config);
if (dvConfig != null || folderConfig != null)
{
int indx = token.IndexOf("-");
int qindx = token.IndexOf("?", indx);
string val = null;
if (qindx == -1)
{
val = DocVersionInfo.GetInheritedSIValue(section.MyProcedure, token.Substring(4, token.Length - 5));
// C2021-051: Applicability tokens in Procedure Set and Folder Specific Information
if (val.ToUpper().Contains("<U>") || val.ToUpper().Contains("<U-")) // Replace token with the applicable unit information
{
string unbr3 = ResolveUnitApp(section.MyDocVersion, val);
plstr = unbr3 ?? "";
}
plstr = plstr.Replace(token, val);
break; // B2019-134 break out of switch statement after processing the <SI- token so that it can loop and handle any other tokens on the same line
}
else
{
string pstok = token.Substring(indx + 1, qindx - indx - 1);
plstr = DocVersionInfo.GetInheritedSIValue(section.MyProcedure, pstok);
// C2021-051: Applicability tokens in Procedure Set and Folder Specific Information
if (plstr.ToUpper().Contains("<U>") || val.ToUpper().Contains("<U-")) // Replace token with the applicable unit information
{
string unbr3 = ResolveUnitApp(section.MyDocVersion, val);
plstr = unbr3 ?? "";
}
}
}
}
if (token.Contains(@"PS-"))
{
ProcedureConfig procConfig = new ProcedureConfig(section.MyProcedure.MyContent.Config);
if (procConfig != null)
{
int indx = token.IndexOf("-");
int qindx = token.IndexOf("?", indx);
string val = null;
if (qindx == -1)
{
val = procConfig.GetValue("PSI", token.Substring(4, token.Length - 5));
// F2021-034: Resolve applicability unit tokens (not just '<u>')
if (val.ToUpper().Contains("<U>") || val.ToUpper().Contains("<U-")) // Replace token with the applicable unit information
{
string unbr3 = ResolveUnitApp(section.MyDocVersion, val);
val = unbr3 ?? "";
}
plstr = plstr.Replace(token, val);
}
else
{
string pstok = token.Substring(indx + 1, qindx - indx - 1);
plstr = procConfig.GetValue("PSI", pstok);
}
}
}
if (plstr == "") retval = false;
break;
}
return retval;
}
private static Regex regexFindToken = new Regex("{[^{}]*}");
// C2021-018 used to display Alarm Point Table RO values in the editor
// Spin through the pagelist for this seciton and grap the Alarm Point Information
protected string GetAlarmPointTableInfo(ItemInfo itmInfo)
{
SectionInfo section = itmInfo.GetSectionInfo();
StringBuilder strAlrmPtTableInfo = new StringBuilder();
// get alarm point data from pagelist
bool usePSIvalue = false; // C2021-065 used with ROLkUpMatch pagelist flag (Barakah Alarms)
int lastRow = -1;
string otherChildUnit = ""; // C2021-065 used when OTHER applicability information is used for the ROLookUp
foreach (VEPROMS.CSLA.Library.PageItem pageItem in itmInfo.MyDocStyle.pagestyle.PageItems)
{
if (pageItem.Token == null) continue; // can be null if token is dependent on PSI lookup!
//DidHLSText = false; // reset to false for this group of tokens.
//if (pageItem.Token.Contains("HLSTEXT"))
// Console.WriteLine("{0} - PageList Token", pageItem.Token);
// C2019-006 - Moved and modified the RO_Lookup() logic here, before we process the tokens in the page list
// this allows us to use RO_Lookup() in a "PS=" conditional token (is usually a PSI check box)
// A while loop was also added to the we can have more than one call to RO_Lookup() on a pagelist line
// this logic was put in for Barakah Alarms
// Note that each Alarm is defined as its own RO in the Referenced Object database, with multiple return values
// to define the Window ID, Alarm, Source, Setpoint, etc. for example.
string pltok = pageItem.Token;
while (pltok.Contains("RO_Lookup("))
{
int idxstart = pltok.IndexOf("RO_Lookup(");
int idxend = pltok.Substring(idxstart).IndexOf(")");
string ROLookupstr = pltok.Substring(idxstart, idxend + 1);
string parms = ROLookupstr.Substring(10, ROLookupstr.Length - 11);
MatchCollection sm = regexFindToken.Matches(parms);
foreach (Match m in sm) // resolve pagelist tokens that are parameters for ROLookup()
{
string tnk = m.Value;
ProcessROLookupCfgParams(section, ref parms, tnk); // translate the tokens in the parameters
}
string[] parts = parms.Split(",".ToCharArray());// split on comma
// B2019-031 Support commas embedded in Alarm ID (Procedure Number)
// B2019-075: Added the check for commas in the procedure number - this code was causing a bug in other alarms.
if (parts.Length > 3 && section.MyProcedure.DisplayNumber.IndexOf(",") > 0)// If extra commas combine first part to account for it
{
int n = parts.Length - 3;
string part0 = parts[0];
for (int i = 0; i < n; i++) // append parts based upon the number of parts (commas)
part0 += "," + parts[i + 1];
parts[0] = part0;
parts[1] = parts[n + 1];// Get the last 2 parts
parts[2] = parts[n + 2];
}
string ROLookupVal = "";
// parts[0] - the RO to look up - for Alarms, is usually the EOP number thus uses the "{EOPNUM}" token
// parts[1] - Which of the multiple return value from the RO to return
// parts[2] - the value to use if not found in ROs - usually defined in a PSI field for that Alarm procedure
// C2021-065 Barakah Alarms - check if child RO alarm ID matches the resolved procedure number
// if not, then use the values stored in the PSI instead of the value returned for ROLookup()
// for all of the Alarm Point window items (ROLookup() items) in the pagelist for this section (BNPP Alarms format)
// Note only one pagelist item has this flag and this special pagelist item needs to be listed before any other ROLoopUP items
if (pageItem.ROLkUpMatch) // check for paglist flag
{
string rawPrcNum = section.MyProcedure.MyContent.Number;
// C2021-065 see if we need to get the Other child info from ROLookUp
if (rawPrcNum.ToUpper().StartsWith("<U\\U8209?OTHER")) // proc number has <u-otherxxx> in its definiation (procedure property page)
{
string procnum = section.MyProcedure.DisplayNumber; // get the cooked (resolved) procedure number
int idx = procnum.IndexOf('-');
otherChildUnit = procnum.Substring(0, idx); // we need to get RO info for the Other child applicability - this gets child's number
}
ROLookupVal = ROLookupForEditorView(section, parts[0], parts[1], ""); // will return empty string if alarm point is not found in RO database
usePSIvalue = (ROLookupVal == null || ROLookupVal.Length == 0);//!= section.MyProcedure.DisplayNumber); // use PSI value if child alarm ID not found or does not match resolved procedure number (alarm point)
}
// C2021-065 if usePSIvalue is true, then we know alarm point info is not in the RO database, so just use the default (PSI) value
if (usePSIvalue)
ROLookupVal = parts[2]; // C2021-065 use the value defined in the PSI
else
ROLookupVal = ROLookupForEditorView(section, parts[0], parts[1], parts[2]);
// F2021-053: Do replace words for Page List items. This uses a DisplayText constructor that flags this case
// and gets the resulting replaced words
if (pageItem.RepWords)
{
DisplayText dt1 = new DisplayText(itmInfo, ROLookupVal, false, true);
ROLookupVal = dt1.StartText;
}
// replace the pagelist token with ROLookupVal
pltok = pltok.Substring(0, idxstart) + ROLookupVal + ((idxstart + idxend < pltok.Length) ? pltok.Substring(idxstart + idxend + 1) : "");
}
// C2021-065 (BNPP Alarms format) we are processing a paglist flag (ROLkUpMatch) to determine how to get Alarm Point information
// Nothing else is on this page list item, so use "continue" to jump to the next pagelist item as nothing gets printed for this item
if (!pageItem.ROLkUpMatch && pageItem.ROLkUpInEditor)
{
if (lastRow < pageItem.Row)
{
if (lastRow != -1)
strAlrmPtTableInfo.Append("\r\n");
strAlrmPtTableInfo.Append(string.Format("\\ul {0}\\ulnone : ",pltok));
lastRow = (int)pageItem.Row;
}
else
strAlrmPtTableInfo.Append(pltok);
}
}
return strAlrmPtTableInfo.ToString();
}
// C2021-018 used to display Alarm Point Table RO values in the editor
// we use a read-only note type, off of step section, to display the Alarm Point table RO information
// create the note if it does not exist, update if it does
// The docstyle for the step section must have the ShowAlarmPointWindowInfo flag
protected void SetupAlarmTableView(ItemInfo iteminfo)
{
if (iteminfo.IsStepSection && iteminfo.MyDocStyle.ShowAlarmPointWindowInfo)
{
string alrPtTblInfo = GetAlarmPointTableInfo(iteminfo);
if (!iteminfo.HasCautionOrNote) // BNPP Alarm format does not allow notes/cautions off of sections
{
ItemInfo tmpinfo = iteminfo.InsertChild(E_FromType.Note, 20028, alrPtTblInfo);
(tmpinfo.MyConfig as StepConfig).MasterSlave_Applicability = Volian.Base.Library.BigNum.MakeBigNum("0"); // set applicability to none
(tmpinfo.MyConfig as StepConfig).Step_CBOverride = "Off"; // turn of the change bar
MyItemInfo = tmpinfo; // SaveConfig() uses MyItemInfo which is null at this point, so set it to our new step item
SaveConfig();
}
else
{
if (iteminfo.Notes != null && iteminfo.Notes[0] != null)
{
ContentInfo cntinfo = iteminfo.Notes[0].MyContent;
if (!cntinfo.Text.Equals(alrPtTblInfo))
cntinfo.UpdateAlarmTableInfoView(alrPtTblInfo); // update with the new alarm point table information
}
}
}
}
protected void SetupEditItem(ItemInfo itemInfo, StepPanel myStepPanel, EditItem myParentEditItem, ChildRelation myChildRelation, bool expand, EditItem nextEditItem, bool addFirstChld) protected void SetupEditItem(ItemInfo itemInfo, StepPanel myStepPanel, EditItem myParentEditItem, ChildRelation myChildRelation, bool expand, EditItem nextEditItem, bool addFirstChld)
{ {
if (myStepPanel.TopMostEditItem == null) myStepPanel.TopMostEditItem = this; if (myStepPanel.TopMostEditItem == null) myStepPanel.TopMostEditItem = this;
@ -3558,6 +3856,7 @@ namespace Volian.Controls.Library
// TODO: Remove Label and just output ident on the paint event // TODO: Remove Label and just output ident on the paint event
TabLeft = 20; TabLeft = 20;
SetupHeader(itemInfo); SetupHeader(itemInfo);
SetupAlarmTableView(itemInfo); // C2021-018 display alarm point table information in the step editor (if the format flag is set)
this.Paint += new PaintEventHandler(EditItem_Paint); this.Paint += new PaintEventHandler(EditItem_Paint);
this.BackColorChanged += new EventHandler(EditItem_BackColorChanged); this.BackColorChanged += new EventHandler(EditItem_BackColorChanged);
this.Move += new EventHandler(EditItem_Move); this.Move += new EventHandler(EditItem_Move);

View File

@ -869,6 +869,7 @@ namespace Volian.Controls.Library
} }
else else
{ {
if (MyStepPanel == null) return; // C2021-018 check for null reference (display alarm point table info in editor)
if (MyStepRTB.Focused) // If active Set BackColor to the active color if (MyStepRTB.Focused) // If active Set BackColor to the active color
MyStepRTB.BackColor = MyStepPanel.ActiveColor; MyStepRTB.BackColor = MyStepPanel.ActiveColor;
else // Otherwise Set the BackColor to either the InactiveColor or the AnnotationColor else // Otherwise Set the BackColor to either the InactiveColor or the AnnotationColor