EKL - Compute list of piping specification following the context

Introduction

Usage : During design,  the list of allowed specification available in Data information panel can be filtered according to context like lineID attribute value

Datasetup Resource Set : 

  • Piping/Tubing Specification Resources
  • HVAC Specification Resources

Datasetup Resource : Compute list of piping specification following the context

 

Rule Example 1

Description

Filter Piping specification list according LineID Operating Temperature*/

Piping spec is available If the LineID operating temperature < Max temp of the PipSpecification and Standards are same

Prereq 

Define value for standard and Temperature attributes on LineID and on Specification objects

Rule

/* Sample Rule - Start*/ 
/*Trigger Piping spec according LineID PRessure and Temperature*/
/* Rule:- For "Out Of Spec" operation if the LineID operating temperature lies in between the Min && Max temp of the PipSpecification. Append it to the list to be sent as OUTPUT */
  
let EnsSpecs_Input (List)
let EnsSpecs_Output (List)
let EnsSpec_CurrentObj (EnsSpecification)
let PipSpec_CurrentObj (PipSpecification)
let NbEnsSpecs (Integer)
let LineIDOcc_Value (LogicalOccurrence)
let OperationName_Value(String) 
let name(String)
let LogRef(RFLVPMLogicalReference)
let LineID_Obj(Piping_Line)
let LineID_Attr_Standard(string)
let LineID_Attr_Temp(TEMPRTRE)
let Spec_Attr_MinTemp(TEMPRTRE)
let Spec_Attr_MaxTemp(TEMPRTRE)
let LineID_Attr_Pressure(PRESSURE)
let Spec_Attr_MinPressure(PRESSURE)
let Spec_Attr_MaxPressure(PRESSURE)
let Spec_Attr_Standard(String)
let j (Integer)

// Attribute names set on the Context to retrieve the value
let EnsSpecList_Input_attr = "EnsSpecList_Input"   /*List of EnsSpecifications */
let EnsSpecList_Output_attr = "EnsSpecList_Output"   /*List of EnsSpecifications */
let EnsSpecList_OperationName_attr = "ApplicativeOperationName" 
let EnsSpecList_LineIDOcc_attr = "LineID_Occurrence"

// Get OperationName attribute Value
set OperationName_Value = Parameters.GetAttributeString(EnsSpecList_OperationName_attr)

// Get LineID Occurrence object and retrieve the required information e.g. LineID Operating   
// Temperature
    set LineIDOcc_Value =  Parameters ->GetAttributeObject( EnsSpecList_LineIDOcc_attr )

    if ( NULL <> LineIDOcc_Value )
    {
        Trace(1,"LineID Occurrence retrieved Successfully !!!")
        set LogRef = LineIDOcc_Value.Reference
        if ( NULL <> LogRef ) 
        {
            set LineID_Obj = LogRef
            if ( NULL <>  LineID_Obj) 
            {
                set LineID_Attr_Standard = LineID_Obj.V_Standard
                // set LineID_Attr_Temp = LineID_Obj.V_OperatingTemperature
    set LineID_Attr_Pressure = LineID_Obj.V_OperatingPressure
                Trace(1,"LineID Attributes read successfully !!!")
            }
        }
    }
    // Get Input Spec List to process
    set EnsSpecs_Input = Parameters ->GetAttributeObject (EnsSpecList_Input_attr) 
    set NbEnsSpecs = EnsSpecs_Input.Size()
    let EnsSpecName_Value (String)
    set j = 1
    for j while j <= NbEnsSpecs
    {
      set EnsSpec_CurrentObj = EnsSpecs_Input.GetItem(j)
        if (NULL <> EnsSpec_CurrentObj)
        {
            set EnsSpecName_Value = EnsSpec_CurrentObj.V_Name
            set PipSpec_CurrentObj = EnsSpec_CurrentObj

            if ( NULL <> PipSpec_CurrentObj )
            {
               set Spec_Attr_MinTemp = PipSpec_CurrentObj.V_MinTemperature
               set Spec_Attr_MaxTemp = PipSpec_CurrentObj.V_MaxTemperature
                set Spec_Attr_MinPressure = PipSpec_CurrentObj.V_MinPressure
                set Spec_Attr_MaxPressure = PipSpec_CurrentObj.V_MaxPressure
                set Spec_Attr_Standard = PipSpec_CurrentObj.V_Standard
    
if ( OperationName_Value == "Operation_OutOfSpec" ) // For *OUT OF SPEC* operation                     //use the follwing logic to filter the EnsSpecifications
    {
// If the LineID operating temperature less than Max temp of the PipSpecification and 
// Standards are same. Append it to the list to be sent as OUTPUT

// if ( ( LineID_Attr_Temp <= Spec_Attr_MaxTemp ) and 
if ( ( LineID_Attr_Pressure <= Spec_Attr_MaxPressure ) and 
( Spec_Attr_Standard == LineID_Attr_Standard  ))
       {
          EnsSpecs_Output.Append( EnsSpec_CurrentObj )
       }
    }
    else if ( ( OperationName_Value == "Operation_SetLineID_AdditionalSpec") OR (OperationName_Value == "Operation_SetLineIDSpec"))
    {
        if ( OperationName_Value == "Operation_SetLineIDSpec" )
        {
                // if ( ( LineID_Attr_Temp >= Spec_Attr_MinTemp ) and 
        if ( ( LineID_Attr_Pressure >= Spec_Attr_MinPressure ) AND ( LineID_Attr_Pressure <= Spec_Attr_MaxPressure ) AND ( Spec_Attr_Standard == LineID_Attr_Standard  ) )
           {
              EnsSpecs_Output.Append( EnsSpec_CurrentObj )
           }                
        }    
    }
            }
        }
    }

    // Set the output
    Parameters ->SetAttributeObject (EnsSpecList_Output_attr, EnsSpecs_Output)
    if ( EnsSpecs_Output.Size() > 0 )
   {
        Trace(1,"Business Rule - Successful Execution !!!")
   }
   else
   {
    Trace(1,"Business Rule - No matching EnsSpecification found as per the criteria !!!")    
   } 

/* Sample Rule - End*/ 

 

Rule Exemple2:

Description

There is a Business Rule that allows you to Compute the List of Piping Specification Following the Context (PipSpecListPipingSpecifications)

On this example, the list of specification is selected based on the system attributes :

Video

Code:

/* Compute the List of Piping Specification Following the Context (PipSpecListPipingSpecifications) */
/* Rule:- For "Out Of Spec" operation if the LineID operating temperature lies in between the Min && Max temp of the PipSpecification. Append it to the list to be sent as OUTPUT */
 
let EnsSpecs_Input (List)
let EnsSpecs_Output (List)
let EnsSpec_CurrentObj (EnsSpecification)
let PipSpec_CurrentObj (PipSpecification)
let NbEnsSpecs (Integer)
let LineIDOcc_Value (LogicalOccurrence)
let OperationName_Value(String) 
let name(String)
let LogRef, systemRef(RFLVPMLogicalReference)
let systemOcc(LogicalOccurrence)
let LineID_Obj(Piping_Line)
let LineID_Attr_Standard(string)
let LineID_Attr_Temp(TEMPRTRE)
let Spec_Attr_Standard(String)
let j (Integer)
let debug(Boolean)
debug = false
// Attribute names set on the Context to retrieve the value
let EnsSpecList_Input_attr = "EnsSpecList_Input"   /*List of EnsSpecifications */
let EnsSpecList_Output_attr = "EnsSpecList_Output"   /*List of EnsSpecifications */
let EnsSpecList_OperationName_attr = "ApplicativeOperationName" 
let EnsSpecList_LineIDOcc_attr = "LineID_Occurrence"

// Get OperationName attribute Value
set OperationName_Value = Parameters.GetAttributeString(EnsSpecList_OperationName_attr)
if debug
    Notify("OperationName_Value : #",OperationName_Value)
    
// Get Input Spec List to process
set EnsSpecs_Input = Parameters ->GetAttributeObject (EnsSpecList_Input_attr) 
set NbEnsSpecs = EnsSpecs_Input.Size()
if debug
    Notify("EnsSpecs_Input.Size : #", NbEnsSpecs)
// Get LineID Occurrence object and retrieve the required information e.g. LineID Operating   
set LineIDOcc_Value =  Parameters->GetAttributeObject(EnsSpecList_LineIDOcc_attr)
if (NULL <> LineIDOcc_Value)
{
    set systemOcc = LineIDOcc_Value.Owner
    set systemRef = systemOcc.Reference
    
    if debug
    {
        Notify("systemOcc : #", systemOcc.Name)
        Notify("systemRef : #", systemRef.Name)
    }
    
    if (systemRef.HasAttribute("Asset Type"))
    {
        EnsSpecs_Output.Append(EnsSpecs_Input.GetItem(1))    
        Notify("List of specification Filtered")
    }
    else
    {
        set EnsSpecs_Output = EnsSpecs_Input
        Notify("Full List of specification")
    }
}
// Set the output
Parameters ->SetAttributeObject (EnsSpecList_Output_attr, EnsSpecs_Output)

 

txt file