EKL - Compute list of additional specification to be used

Introduction

Usage : during part placement, Part list from the Spec is filtered according additionnal criteria to get the filtered list of available part

Datasetup Resource Set : 

  • Piping/Tubing Specification Resources
  • HVAC Specification Resources
  • Raceway Specification Resources

Datasetup Resource : Compute list of additional specification to be used depending of the context

 

Rule Example1: 

Rule Code :

this exemple is doing :

during part placement, Part list from the Spec is trigger the list of available Parts according additionnal criteria from the LineID :

  • Based on LineID FluidName we filter a specific MaterialName 
     
  • Based on LineID Pressure we filter a specific Rating Value
/* CATRule signature (do not edit) : (ThisObject : #In KweTrigger_BL_AddedSpecsAndResourceFilteringParams, Parameters : #In RuleContext) : #Void */
/*Spec is trigger the list of availableParts according additionnal criteria from the LineID : */
/* Based on LineID FluidName we filter a specific MaterialName */
/* Based on LineID Pressure we filter a specific Rating Value*/

/* Inputs */ 
let FeatureCurrentApplicativeInformation (Feature)

/* Declarations for current applicative entities */
let ListCurrentApplicativeEntitiesKeys (List)
let sCurrentApplicativeEntityKey (String)
let ListCurrentApplicativeEntities (List)
let NbCurrentApplicativeEntities (Integer)
let pCurrentApplicativeEntity (PLMEntity)
let sCurrentApplicativeEntityName (String)
let StrApplicativeOperationName(String)
let StrSearchedType(String)

/* Declarations for current ens specifications & content */
let ListCurrentEnsSpecifications (List)
let NbCurrentEnsSpecifications (Integer)

/* Declarations for additional customer ens specifications */
let ListAuthorizedAdditionalEnsSpecifications (List)
let NbAuthorizedAdditionalEnsSpecifications (Integer)
let ListIndexesOfRequestedAdditionalEnsSpecifications(List)
let NbIndexesOfRequestedAdditionalEnsSpecifications(Integer)
let pAuthorizedAdditionalEnsSpecification (PLMEntity)
let sAuthorizedAdditionalEnsSpecificationName1 (String)
let sAuthorizedAdditionalEnsSpecificationName2 (String)

let pAdditionalSpec (PLMEntity)

let ObjectOccurence(ProductOccurrence)
let pipingLine(Piping_Line)
let pip_line_inst(Piping_Line_Inst)
let attr_pipingLineName(String)
let attr_pipingLineFluid(String)
let attr_pipingLinePressure(PRESSURE)
let attr_Material(String)
let attr_Rating(String)
let FeatureAddedPLMAttributesFilteringSearchedPLMParts (Feature)

/* Declarations for BL Outputs : additional PLM attributes to filter searched resource AND/OR indexes of customer additional ens specifications to filter searched resource */ 
let FeatureAddedPLMAttributesFilteringSearchedResource (Feature)
let ListIndexesOfAddedEnsSpecifications (List)                  

let i (Integer)
let posX(Real)
let posY(Real)
let posZ(Real)
let pos(Real)
let NbSize(Integer)
let Index(Integer)

set posX =0.0
set posY =0.0
set posZ =0.0

Trace(1, "============== Location Spec activated W38 ========================")

StrApplicativeOperationName = Parameters->GetAttributeString("ApplicativeOperationName")
Trace(1,"Application Operation Name = ", StrApplicativeOperationName)

StrSearchedType = Parameters->GetAttributeString("SearchedType")
Trace(1,"Searched Type = ", StrSearchedType)

set FeatureCurrentApplicativeInformation = Parameters->GetAttributeObject("FeatureCurrentApplicativeInformation")

if ((NULL<> FeatureCurrentApplicativeInformation) and (true == FeatureCurrentApplicativeInformation.HasAttribute("Location_PosX")))
{
  posX = FeatureCurrentApplicativeInformation->GetAttributeReal("Location_PosX")
  Trace(1, "Location X = ", posX)
  
  posY = FeatureCurrentApplicativeInformation->GetAttributeReal("Location_PosY")
  Trace(1, "Location Y = ", posX)
  
  posZ = FeatureCurrentApplicativeInformation->GetAttributeReal("Location_PosZ")
  Trace(1, "Location Z = ", posZ)
}

// Get input parameters : ListCurrentApplicativeEntities and retrieve piping line among them ****************/

ListCurrentApplicativeEntitiesKeys = Parameters->GetAttributeObject("ListCurrentApplicativeEntitiesKeys")

ListCurrentApplicativeEntities = Parameters->GetAttributeObject("ListCurrentApplicativeEntities")
NbCurrentApplicativeEntities = ListCurrentApplicativeEntities.Size()
Trace(1,"NbCurrentApplicativeEntities = ", NbCurrentApplicativeEntities)
i = 1
if (0 < NbCurrentApplicativeEntities)
{
  for i while i <= NbCurrentApplicativeEntities
  {
    set sCurrentApplicativeEntityKey = ListCurrentApplicativeEntitiesKeys.GetItem(i)
    set pCurrentApplicativeEntity = ListCurrentApplicativeEntities.GetItem(i)
    if (NULL <> pCurrentApplicativeEntity)
    {
      sCurrentApplicativeEntityName = pCurrentApplicativeEntity.V_Name  /* Title */            
    }
    if(sCurrentApplicativeEntityKey == "Logical_Line")
    {
      Trace(1, "Line ID OK")
      set pip_line_inst = ListCurrentApplicativeEntities.GetItem(i)
    }
    if(sCurrentApplicativeEntityKey == "Object_Occurrence")
    {
      Trace(1, "Object_Occurence OK")
      set ObjectOccurence = ListCurrentApplicativeEntities.GetItem(i)
    }
  }        
} 

if (NULL <>pip_line_inst)
{
  set pipingLine = pip_line_inst.Reference
  if(  NULL <> pipingLine )
  {
    set attr_pipingLineName =  pipingLine.V_Name
    Trace(1, "Line ID Name = ", attr_pipingLineName)
    
    set attr_pipingLineFluid =  pipingLine.V_Fluid
    Trace(1, "Line ID Fluid = ", attr_pipingLineFluid)
    
    set attr_pipingLinePressure =  pipingLine.V_OperatingPressure
    Trace(1, "Line ID Pressure = ", attr_pipingLinePressure)  
    
    if ( "acetic acid"== attr_pipingLineFluid)
    {
      attr_Material = "Steel_172"
    }
    else if ( "Fuel oil" == attr_pipingLineFluid)
    {
      attr_Material = "Iron_13"
    }
    
    if (30bara > attr_pipingLinePressure)   
    {
      attr_Rating = "SCHEDULE 40"
    }
    else if ((30bara < attr_pipingLinePressure) and (50bara > attr_pipingLinePressure))
    {
      attr_Rating = "SCHEDULE 80"
    }
    else if (50bara < attr_pipingLinePressure)
    {
      attr_Rating = "SCHEDULE 160"
    }

    if ((NULL <> attr_Material) and ("Piping Line ID_001" == attr_pipingLineName))
    {
      Trace(1, "Line ID and Fluid is retrieve so Add additional criteria")
      // Retrieve the feature carrying N attributes to filter PLM parts
      set FeatureAddedPLMAttributesFilteringSearchedPLMParts = Parameters->GetAttributeObject("FeatureAddedPLMAttributesFilteringSearchedPLMParts")
      
      // Valuate extra conditions on the feature based on PLM attributes of the searched PLM part type
      FeatureAddedPLMAttributesFilteringSearchedPLMParts->SetAttributeString("V_MaterialName",attr_Material)
    }
    if ((NULL <> attr_Rating) and ("Piping Line ID_001" == attr_pipingLineName))
    {
      Trace(1, "Line ID and Rating is retrieve so Add additional criteria")
      // Retrieve the feature carrying N attributes to filter PLM parts
      set FeatureAddedPLMAttributesFilteringSearchedPLMParts = Parameters->GetAttributeObject("FeatureAddedPLMAttributesFilteringSearchedPLMParts")
      
      // Valuate extra conditions on the feature based on PLM attributes of the searched PLM part type
      FeatureAddedPLMAttributesFilteringSearchedPLMParts->SetAttributeString("V_Rating",attr_Rating)
    }
  }
}

// List of CurrentApplicativeEntitiesKeys
ListCurrentApplicativeEntitiesKeys = Parameters->GetAttributeObject("ListCurrentApplicativeEntitiesKeys")

NbCurrentApplicativeEntities = ListCurrentApplicativeEntitiesKeys.Size()
Trace(1, "NbCurrentApplicativeEntities = ", NbCurrentApplicativeEntities)

// List of ListCurrentApplicativeEntities
ListCurrentApplicativeEntities = Parameters->GetAttributeObject("ListCurrentApplicativeEntities")
NbCurrentApplicativeEntities = ListCurrentApplicativeEntities.Size()

// list of Authorized Additional EnsSpecifications
ListAuthorizedAdditionalEnsSpecifications = Parameters->GetAttributeObject("ListAuthorizedAdditionalEnsSpecifications")
NbAuthorizedAdditionalEnsSpecifications = ListAuthorizedAdditionalEnsSpecifications.Size()
Trace(1, "ListAuthorizedAdditionalEnsSpecifications = ", ListAuthorizedAdditionalEnsSpecifications)

// list of index of requested Authorized Additional EnsSpecifications
ListIndexesOfRequestedAdditionalEnsSpecifications = Parameters->GetAttributeObject("ListIndexesOfRequestedAdditionalEnsSpecifications")
NbIndexesOfRequestedAdditionalEnsSpecifications = ListIndexesOfRequestedAdditionalEnsSpecifications.Size()
Trace(1, "NbIndexesOfRequestedAdditionalEnsSpecifications = ", NbIndexesOfRequestedAdditionalEnsSpecifications)

if (0 < NbIndexesOfRequestedAdditionalEnsSpecifications)
{
  Index = ListIndexesOfRequestedAdditionalEnsSpecifications.GetItem(1)
  Trace(1, "Index Value = ", Index)
  
  // Fill OUTPUT
  set ListIndexesOfAddedEnsSpecifications = Parameters->GetAttributeObject("ListIndexesOfAddedEnsSpecifications")
  ListIndexesOfAddedEnsSpecifications = Copy(ListIndexesOfRequestedAdditionalEnsSpecifications)
  Parameters->SetAttributeObject("ListIndexesOfAddedEnsSpecifications", ListIndexesOfRequestedAdditionalEnsSpecifications)
  
}
else
{
  Trace(1, "No Additional Spec selected by user")
}

Trace(1, "============== Location Spec END  ========================")