C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)

RO image resolution for Annotations
This commit is contained in:
Matthew Schill 2025-07-11 15:26:22 -04:00
parent 92522b1229
commit ec8e4c36a4
4 changed files with 325 additions and 200 deletions

Binary file not shown.

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -12,11 +13,13 @@ namespace VEPROMS
//C2025-024 Electronic Procedures - Phase 2 (PROMS XML output) //C2025-024 Electronic Procedures - Phase 2 (PROMS XML output)
//class inherits from normal import/export form //class inherits from normal import/export form
//then adds additional functionality //then adds additional functionality
#pragma warning disable S101 // Types should be named in PascalCase
public partial class dlgExportImportEP : dlgExportImport public partial class dlgExportImportEP : dlgExportImport
#pragma warning restore S101 // Types should be named in PascalCase
{ {
private readonly AnnotationTypeInfo _AnnotationType; private readonly AnnotationTypeInfo _AnnotationType;
private string multiseparator = ","; private readonly string multiseparator = ",";
private static Regex _ROAccPageTokenPattern = new Regex("[<][^<>-]+-[^<>]+[>]"); private static Regex _ROAccPageTokenPattern = new Regex("[<][^<>-]+-[^<>]+[>]");
@ -66,11 +69,16 @@ namespace VEPROMS
string steptab = Volian.Print.Library.PDFReport.BuildStepTab(ii); string steptab = Volian.Print.Library.PDFReport.BuildStepTab(ii);
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "StepTab", steptab)); 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 //get first transition in item and add it as an xml element
if (ii.MyContent.ContentTransitionCount > 0) if (ii.MyContent.ContentTransitionCount > 0)
{ {
TransitionInfo ct = ii.MyContent.ContentTransitions[0]; TransitionInfo ct = ii.MyContent.ContentTransitions[0];
xe.Attributes.SetNamedItem(AddAttribute(xe.OwnerDocument, "TransitionToItemID", ct.ToID.ToString())); 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 //export EP annotation details under an EPInfo node
@ -79,110 +87,143 @@ namespace VEPROMS
XmlElement xepinfo = xe.OwnerDocument.CreateElement("EPInfo"); XmlElement xepinfo = xe.OwnerDocument.CreateElement("EPInfo");
EPFields myEPFields = ii.GetValidEPFields(_AnnotationType.TypeID); EPFields myEPFields = ii.GetValidEPFields(_AnnotationType.TypeID);
ROFSTLookup lookup = ii.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(ii.MyDocVersion); ROFSTLookup lookup = ii.MyDocVersion.DocVersionAssociations[0].MyROFst.GetROFSTLookup(ii.MyDocVersion);
bool epexportblank = ii.EPexportblank(_AnnotationType.TypeID); //should blank xml elements export?
//For each annotation in the item that is of the current EP Annotation type //grab the current RO db so will know location of RO files and default graphics ext.
foreach (var EPAnnotation in ii.ItemAnnotations.Where(x => x.TypeID == _AnnotationType.TypeID)) using (RODbInfo myRODB = (RODbInfoList.Get()).FirstOrDefault(x => x.RODbID == ii.MyDocVersion.DocVersionAssociations[0].MyROFst.RODbID))
{ {
var EPAnnotationConfig = new AnnotationConfig(EPAnnotation.Config); //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))
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); var EPAnnotationConfig = new AnnotationConfig(EPAnnotation.Config);
XmlElement xindivid = xe.OwnerDocument.CreateElement(EP.name); XmlElement xepdetails = xe.OwnerDocument.CreateElement("Details");
//include the annotation ID for reference
xepdetails.Attributes.SetNamedItem(AddAttribute(xepdetails.OwnerDocument, "AnnotationID", EPAnnotation.AnnotationID.ToString()));
//need to resolve ROs ROSingle, ROMulti, in text //loop through each EP Field - name the xml elements the EP.name
//get values foreach (EPField EP in myEPFields)
//should we export blank?
//
switch (EP.type.ToLower())
{ {
case "text": string val = EPAnnotationConfig.GetValue("EP", EP.name);
//for text, check if any embedded ROs if (epexportblank || !string.IsNullOrEmpty(val))
//if none, set the xml element to the text {
//otherwise resolve the Ros XmlElement xindivid = xe.OwnerDocument.CreateElement(EP.name);
MatchCollection matches = _ROAccPageTokenPattern.Matches(val);
if (matches.Count == 0) //need to resolve ROs ROSingle, ROMulti, in text
//get values
switch (EP.type.ToLower())
{ {
xindivid.InnerText = val; case "text":
}
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[1].Value);
//for text, check if any embedded ROs
if (roc.type == 8) // Exclude replacing Images since are binary - for those, add a sub item //if none, set the xml element to the text
//otherwise resolve the ROs
MatchCollection matches = _ROAccPageTokenPattern.Matches(val);
if (matches.Count == 0)
{ {
XmlElement xroid = xindivid.OwnerDocument.CreateElement(m.Groups[1].Value); xindivid.InnerText = val;
xroid.InnerText = roc.value;
xindivid.AppendChild(xroid);
} }
else if (!string.IsNullOrEmpty(roc.value)) else
{ {
bool convertCaretToDeltaSymbol = (ii.ActiveSection != null) && ii.ActiveSection.ActiveFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta; //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[1].Value);
string rocvalue = roc.value.Replace("`", "\xB0"); // Exclude replacing Images since are binary - for those, add a sub item
rocvalue = rocvalue.Replace("\xF8", "\xB0"); if (Enumerable.Range(8, 15).Contains(roc.type))
rocvalue = rocvalue.Replace("\x7F", "\x394"); //delta {
if (convertCaretToDeltaSymbol) rocvalue = rocvalue.Replace("^", "\x394"); // delta xindivid.InnerText = val;
val = val.Replace($"<{m.Groups[1].Value}>", rocvalue);
XmlElement xroid = AddGraphic(xindivid, m.Groups[1].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[1].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));
xindivid.InnerText = val; //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;
} }
break; xepdetails.AppendChild(xindivid);
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));
List<string> ro_single_tmp = EP.getROValuesList(EPAnnotation, val);
xindivid_rosingle.InnerText = String.Join(multiseparator, ro_single_tmp.ToArray());
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));
List<string> ro_multi_tmp = EP.getROValuesList(EPAnnotation, ival);
xindivid_romulti.InnerText = String.Join(multiseparator, ro_multi_tmp.ToArray());
xindivid.AppendChild(xindivid_romulti);
}
break;
case "tableinput":
xindivid.InnerText = val;
break;
default:
xindivid.InnerText = val;
break;
} }
xepdetails.AppendChild(xindivid); xepinfo.AppendChild(xepdetails);
} }
xepinfo.AppendChild(xepdetails);
} }
xe.AppendChild(xepinfo); xe.AppendChild(xepinfo);
@ -190,6 +231,68 @@ namespace VEPROMS
} }
//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)
{
return $"{((FolderInfo)ii.MyDocVersion.ActiveParent).Name}:{ii.DBSequence}";
}
//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)
{
XmlElement xroid = xindivid.OwnerDocument.CreateElement(Name);
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 xroid;
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);
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;
}
//clear objects to release memory //clear objects to release memory
private void OnClose(object sender, EventArgs e) private void OnClose(object sender, EventArgs e)
{ {

View File

@ -346,21 +346,21 @@ namespace VEPROMS.CSLA.Library
{ {
var ii = _CacheByPrimaryKey.FirstOrDefault(); var ii = _CacheByPrimaryKey.FirstOrDefault();
while (ii.Value.Count > 0) while (ii.Value.Count > 0)
{ {
if (ii.Value[0]?.MyContent?.ContentParts != null) if (ii.Value[0]?.MyContent?.ContentParts != null)
{ foreach (PartInfo pi in ii.Value[0]?.MyContent?.ContentParts) pi.Dispose(); } { foreach (PartInfo pi in ii.Value[0]?.MyContent?.ContentParts) pi.Dispose(); }
ii.Value[0].Dispose(); ii.Value[0].Dispose();
} }
_CacheByPrimaryKey.Remove(ii.Key); _CacheByPrimaryKey.Remove(ii.Key);
} }
while (_CacheList.Count > 0) while (_CacheList.Count > 0)
{ {
if (_CacheList[0]?.MyContent?.ContentParts != null) if (_CacheList[0]?.MyContent?.ContentParts != null)
{foreach (PartInfo pi in _CacheList[0]?.MyContent?.ContentParts) pi.Dispose(); } {foreach (PartInfo pi in _CacheList[0]?.MyContent?.ContentParts) pi.Dispose(); }
_CacheList[0].Dispose(); _CacheList[0].Dispose();
} }
} }
private bool _PrintAllAtOnce = false; private bool _PrintAllAtOnce = false;
@ -450,86 +450,86 @@ namespace VEPROMS.CSLA.Library
StringBuilder sret = new StringBuilder(); StringBuilder sret = new StringBuilder();
ItemInfo pitem = this; ItemInfo pitem = this;
while (!pitem.IsSection && !pitem.IsHigh) while (!pitem.IsSection && !pitem.IsHigh)
{ {
using (StepInfo stpinfo = StepInfo.Get(pitem.ItemID)) 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)) if (!string.IsNullOrEmpty(thisTab))
{ {
thisTab = thisTab.Trim(); thisTab = thisTab.Trim();
} }
// if the tab is null or // if the tab is null or
// if the the tab is not a letter or number 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" // 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 // then reset the tab an empty string so that the type name along with the count of that type
// (ex. "AND 2", "OR 3") // (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"))))) 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; thisTab = string.Empty;
} }
if (pitem.IsRNOPart) if (pitem.IsRNOPart)
{ {
if (string.IsNullOrEmpty(thisTab)) if (string.IsNullOrEmpty(thisTab))
{ {
sret.Insert(0, "RNO."); sret.Insert(0, "RNO.");
} }
else else
{ {
thisTab = thisTab.Trim(); thisTab = thisTab.Trim();
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")")) if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{ {
thisTab += "."; thisTab += ".";
} }
sret.Insert(0, "RNO." + thisTab); sret.Insert(0, "RNO." + thisTab);
} }
} }
else if (pitem.IsCaution || pitem.IsNote) else if (pitem.IsCaution || pitem.IsNote)
{ {
// add the Caution or Note count to the tab (ex "Caution 1", "Note 2") // add the Caution or Note count to the tab (ex "Caution 1", "Note 2")
if (string.IsNullOrEmpty(thisTab)) if (string.IsNullOrEmpty(thisTab))
{ {
sret.Append("{" + typeName + " " + pitem.Ordinal.ToString() + "}"); sret.Append("{" + typeName + " " + pitem.Ordinal.ToString() + "}");
} }
else else
{ {
thisTab = thisTab.Trim(" ".ToCharArray()); thisTab = thisTab.Trim(" ".ToCharArray());
sret.Append(thisTab + " " + pitem.Ordinal.ToString() + sret); sret.Append(thisTab + " " + pitem.Ordinal.ToString() + sret);
} }
} }
else else
{ {
if (!string.IsNullOrEmpty(thisTab)) if (!string.IsNullOrEmpty(thisTab))
{ {
thisTab = thisTab.Trim(" ".ToCharArray()); thisTab = thisTab.Trim(" ".ToCharArray());
if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")")) if (!thisTab.EndsWith(".") && !thisTab.EndsWith(")"))
{ {
thisTab += "."; thisTab += ".";
} }
} }
else else
{ {
thisTab = "{" + typeName + " " + pitem.Ordinal.ToString() + "}."; 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) if (pitem == null)
break; break;
} }
return sret.ToString().Trim(" .)".ToCharArray()); return sret.ToString().Trim(" .)".ToCharArray());
} }
public void SetHeader(VE_Font myFont, string myText) 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 _MyPrevious = null; // Reset list so that the next line gets a new list
if (MyPrevious != null) MyPrevious.RefreshNextItems(); // Update List for new value 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 if (MyContent != null) MyContent.RefreshContentItems(); // Update List for old value
_ContentID = tmp.ContentID; // Update the value _ContentID = tmp.ContentID; // Update the value
//} //}
_MyContent = null; // Reset list so that the next line gets a new list _MyContent = null; // Reset list so that the next line gets a new list
if (MyContent != null) MyContent.RefreshContentItems(); // Update List for new value if (MyContent != null) MyContent.RefreshContentItems(); // Update List for new value
_DTS = tmp.DTS; _DTS = tmp.DTS;
@ -802,7 +802,7 @@ namespace VEPROMS.CSLA.Library
content.FixTransitionText(traninfo, true); content.FixTransitionText(traninfo, true);
content.Save(); content.Save();
} }
} }
} }
// B2025-020 Null Reference fix. Added check for valid index into the TransitionTypeList // B2025-020 Null Reference fix. Added check for valid index into the TransitionTypeList
if (!forceConvertToText) if (!forceConvertToText)
@ -835,14 +835,14 @@ namespace VEPROMS.CSLA.Library
content.FixTransitionText(traninfo, true); content.FixTransitionText(traninfo, true);
content.Save(); content.Save();
} }
} }
} }
} }
} }
if (!forceConvertToText) 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 if (!itemInfo.ActiveFormat.PlantFormat.FormatData.TransData.TransTypeList[traninfo.TranType].TransMenu.Contains("Proc")) //internal format
{ {
@ -931,7 +931,7 @@ namespace VEPROMS.CSLA.Library
else // B2018-043 Eliminate infinite loop for invalid transition structure else // B2018-043 Eliminate infinite loop for invalid transition structure
{ {
// Add annotation for Invalid Transition // Add annotation for Invalid Transition
AddInvalidTransitionAnnotation(itemInfo,"Invalid Transition Format"); AddInvalidTransitionAnnotation(itemInfo, "Invalid Transition Format");
break; break;
} }
} }
@ -984,16 +984,16 @@ namespace VEPROMS.CSLA.Library
ContentInfo myContent = itemInfo.MyContent; ContentInfo myContent = itemInfo.MyContent;
string txt = myContent.Text; string txt = myContent.Text;
string regDelete = @"(\\v |)\<START\]\#Link\:Transition(|Range)\:[0-9]+ [0-9]+ [0-9]+(| [0-9]+)\[END\>(\\v0 |)"; 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; txt = txt2;
txt2 = Regex.Replace(txt, regDelete, ""); 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.Text = txt2;
tmp.Save(); tmp.Save();
@ -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 - // 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) // 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 // // 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 (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 // 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) // 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() + "."; if (ms && mn) pTab = pTab.TrimEnd() + ".";
// remove ending '.' (if this is a hls, don't remove the '.') // 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.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(); return pTab + thisTab.Trim();
} }
@ -1341,8 +1341,8 @@ namespace VEPROMS.CSLA.Library
// B2023-037: loading print text, resolve the RO symbols // B2023-037: loading print text, resolve the RO symbols
bool GTLT = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertGTELTEPMinROValue; bool GTLT = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.ConvertGTELTEPMinROValue;
bool GLTArrows = !itemInfo.IsTable && sectionInfo.ActiveFormat.PlantFormat.FormatData.SectData.UseDashGreaterLessThenForArrowsInROValue; 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); 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); ROFSTLookup.rochild roch = lookup.GetRoChild(rousage.ROID);
itemInfo.MyContent.FixContentText(rousage, roval, roch.type, rofstinfo, itemInfo); itemInfo.MyContent.FixContentText(rousage, roval, roch.type, rofstinfo, itemInfo);
} }
@ -1445,7 +1445,7 @@ namespace VEPROMS.CSLA.Library
if (MyContent.MyEntry != null && MyContent.MyEntry.MyDocument != null) if (MyContent.MyEntry != null && MyContent.MyEntry.MyDocument != null)
{ {
PdfInfo pi = PdfInfo.Get(this, false); 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;
} }
@ -1767,7 +1767,7 @@ namespace VEPROMS.CSLA.Library
RemoveEnhancedFromConfig(false); RemoveEnhancedFromConfig(false);
} }
public void RemoveEnhancedFromConfig(bool doOneStepOnly) public void RemoveEnhancedFromConfig(bool doOneStepOnly)
{ {
XmlDocument xd = new XmlDocument(); XmlDocument xd = new XmlDocument();
if (this.MyContent.Config == null || this.MyContent.Config == "") return; // B2017-164 & B2017-172 check for null or empty config 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.Config = config;
ctmp.Save(); ctmp.Save();
ContentInfo.Refresh(ctmp); ContentInfo.Refresh(ctmp);
_MyConfig = null; // refresh the memory value _MyConfig = null; // refresh the memory value
} }
} }
if (doOneStepOnly) return; if (doOneStepOnly) return;
@ -2071,7 +2071,7 @@ namespace VEPROMS.CSLA.Library
{ {
bool rval = false; bool rval = false;
ItemInfo itm = this; ItemInfo itm = this;
while (itm != null &&!itm.IsHigh && !rval) while (itm != null && !itm.IsHigh && !rval)
{ {
rval = itm.IsCautionOrNotePart; rval = itm.IsCautionOrNotePart;
if (!rval) itm = itm.MyParent; if (!rval) itm = itm.MyParent;
@ -2111,6 +2111,16 @@ namespace VEPROMS.CSLA.Library
return (sd.Type == type); 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 // C2025-023 - Electronic Procedures - Modifications to PROMS
//return EPFields that match this step type or a parent step type //return EPFields that match this step type or a parent step type
public EPFields GetValidEPFields(int AnnTypeID) public EPFields GetValidEPFields(int AnnTypeID)

View File

@ -61,6 +61,18 @@ namespace VEPROMS.CSLA.Library
return LazyLoad(ref _AnnotationTypeID, "@AnnotationTypeID"); return LazyLoad(ref _AnnotationTypeID, "@AnnotationTypeID");
} }
} }
//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 // returns a list of fields that are defined in the EP format's structure
private EPFields _FieldList; private EPFields _FieldList;
public EPFields FieldList public EPFields FieldList