EKL - Check Pipe clamp distance along pipe

Context:

Type : 2 Checks

Purpose : Check if the number of clamp along the pipe is enough & check if the maximum distance is respected

Code example

Check if there is enough clamp along the pipe

/* Argument : PipeOcc , Piping_Pipe_Occurence */

Let PipeRef (Piping_Pipe)  //pipe reference
let PipeLength (length)   // pipe length
Let PartOcc (Piping_Part_Occurrence)  // Piping Part occurence attached to the pipe
let PartRef (Piping_PartV1)  // Piping Part Reference
let PartSubType(String)   // Piping Part PartSubType 

let PartList (List)  // list of Part attached to the pipe
let NbPartList(Integer)   // Nb of part in the PartList 
let ClampList (List)  // subset of PartList with only Clamp type
let NbClampList (Integer)   // Nb of Clamp in the Clamp List

let MaxClampDistance (LENGTH)  // Inputs - Max distance between Clamp to be respected
let MinNbOfClampNeeded (Real)
let FinalMessage(String)  //final message for the Check

Let i (integer)  //counter used for loop 
let j (Integer)  //counter for List rank

Let CheckStatus (string)

// initialize values
Set MaxClampDistance =300mm
FinalMessage=""
CheckStatus="OK"
i=1
j=1

// Retreive Pipe reference informations - length
PipeRef=PipeOcc.Reference
set PipeLength = PipeRef.V_Length

//Retreive Parts list connected to Pipe
set PartList=PipeOcc.GetRelatedObjects()
NbPartList = PartList.Size()
Notify ( "NbPartList:", NbPartList)

//create a new list that contains only PipingPart with subtype =Clamp
for i while i <= NbPartList
{
    set PartOcc = PartList.GetItem(i)
    PartRef=PartOcc.Reference
    set PartSubType = PartRef.GetAttributeString("V_SubPartType")
    if PartSubType=="Clamp"
    {
        ClampList->AddItem(PartOcc,j)
        j=j+1
    }
}
NbClampList = ClampList.Size()

set MinNbOfClampNeeded=PipeLength/MaxClampDistance

Notify ("PipeLength: ", PipeLength)
Notify ( "NbClampList:", NbClampList)
Notify("MaxClampDistance: ",MaxClampDistance)
Notify ("MinNbOfClampNeeded: ", MinNbOfClampNeeded)

If (NbClampList AddTupleSucceededWithComment(FinalMessage,PipeOcc)
    Notify ("Final Message OK : " + FinalMessage)
    }
    else
    {
    ThisCheck->AddTupleFailedWithComment(FinalMessage,PipeOcc)
    Notify ("Final Message KO : " + FinalMessage)
    }
    

 

Check distance between clamp along the pipe < max length 

/* Argument : PipeOcc , Piping_Pipe_Occurence */

Let PipeRef (Piping_Pipe)  //pipe reference
let PipeLength (length)   // pipe length
Let PartOcc (Piping_Part_Occurrence)  // Piping Part occurence attached to the pipe
let PartRef (Piping_PartV1)  // Piping Part Reference
let PartSubType(String)   // Piping Part PartSubType 
Let Clamp1Occ (Piping_Part_Occurrence)  // Clamp1 occurence attached to the pipe
Let Clamp2Occ (Piping_Part_Occurrence)  // next Clamp2 occurence attached to the pipe
let Clamp1Inst (Piping_Part_Inst)  // Clamp1 instance attached to the pipe
let Clamp2Inst (Piping_Part_Inst)  // Next Clamp2 instance attached to the pipe

let PartList (List)  // list of Part attached to the pipe
let NbPartList(Integer)   // Nb of part in the PartList 
let ClampList (List)  // subset of PartList with only Clamp type
let NbClampList (Integer)   // Nb of Clamp in the Clamp List

let M1 (Matrix)  // position matrix of Clamp1 - LocalPosition
let M2 (Matrix)   // position matrix of next Clamp2 - LocalPosition
let T1 (Vector)  // translation Vector of Clamp1 - LocalPosition
let T2 (Vector)  // translation Vector of Clamp2- LocalPosition    
let T (Vector)  // vector between Clamp1 and Clamp2
let TNorm (Real)    // Norme de T : distance between Clamp1 and clamp2

let ClampDist (Length)  // Distance between 2 consecutive Clamps
let ClampDistList (List)  // List of Clamp distance
let NbClampDistList(Integer)  //Nb clamp interval

let MaxClampDistance (LENGTH)  // Inputs - Max distance between Clamp to be respected

let ClampDistListKO (List)  // output - list of distance tant doesn't respect the Max value
let TextKO (String)  // text for the distance that doesn't respect the Max value
let MessageKO (String)  // final  text for ALL distance that doesn't respect the max value
let FinalMessage(String)  //final message for the Check

Let i (integer)  //counter used for loop 
let j (Integer)  //counter for List rank
let ClampInterval (Integer)  //count of Clamp interval
let ClampIntervalKO (Integer)  //count for Clamp interval that doesn't respect Max distance

Let CheckStatus (string)

// initialize values
Set MaxClampDistance =300mm
TextKO=""
MessageKO=""
FinalMessage=""
CheckStatus="OK"
i=1
j=1
ClampInterval=0
ClampIntervalKO=0

// Retreive Pipe reference informations - length
PipeRef=PipeOcc.Reference
set PipeLength = PipeRef.V_Length

//Retreive Parts list connected to Pipe
set PartList=PipeOcc.GetRelatedObjects()
NbPartList = PartList.Size()
Notify ( "NbPartList:", NbPartList)

//create a new list that contains only PipingPart with subtype =Clamp
for i while i <= NbPartList
{
    set PartOcc = PartList.GetItem(i)
    PartRef=PartOcc.Reference
    set PartSubType = PartRef.GetAttributeString("V_SubPartType")
    if PartSubType=="Clamp"
    {
        ClampList->AddItem(PartOcc,j)
        j=j+1
    }
}
NbClampList = ClampList.Size()
Notify ( "NbClampList:", NbClampList)

// if there is 0 or only one Clamp check is OK
if NbClampList==0
{
    if PipeLength<=MaxClampDistance
    {
    CheckStatus="OK"
    FinalMessage="OK , no Clamp & pipe length<=" + MaxClampDistance
    }
        else 
        {
            CheckStatus="KO"
            FinalMessage="KO : Clamp missing : No Clamp & pipe length>" + MaxClampDistance
        }
}
else if NbClampList==1
{
    if PipeLength<=MaxClampDistance*2
    {
    CheckStatus="OK"
    FinalMessage="OK : only one Clamp & pipe length<= 2x" + MaxClampDistance
    }
        else 
        {
            CheckStatus="KO"
            FinalMessage="KO : One Clamp & pipe length> 2x" + MaxClampDistance
        }
}
else
{
        // Create list of Distances between 2 consecutive clamps rang i & j
        i=1
        ClampInterval=1
        for i while i <= (NbClampList-1)
        {
            set Clamp1Occ = ClampList.GetItem(i)
            j=i+1
            set Clamp2Occ = ClampList.GetItem(j)
            Clamp1Inst = Clamp1Occ.Instance
            Clamp2Inst = Clamp2Occ.Instance
        
                // Retrive Clamp instance Matrix for 2 consecutive Clamp
                M1 = Clamp1Inst.PositionMatrix
                M2 = Clamp2Inst.PositionMatrix    
                
                // Extract the 4th column to read the translation vector of the position matrix for the 2 clamps
                T1=M1.GetColumn( 4 )
                T2=M2.GetColumn( 4 )
                Notify( "T1=", T1.Dump() )
                Notify( "T2=", T2.Dump() )
                
                //compute Vector T between 2 clamps, compute distance = norm de T ,  set distance in mm
                set T=T2-T1
                Notify( "T=", T.Dump() )
                
                TNorm=T->Norm()
                Notify("TNorm =", TNorm)
                ClampDist=TNorm*1mm
                Notify("distances = ", ClampDist)
                
                //store distance in list
                ClampDistList->AddItem(ClampDist,ClampInterval)
                ClampInterval=ClampInterval+1
                
                // KO distance in a list        
                        
                if ClampDist>MaxClampDistance
                {
                    CheckStatus="KO"
                    ClampIntervalKO=ClampIntervalKO+1
                    ClampDistListKO->AddItem(ClampDist,ClampIntervalKO)
                    TextKO="KO - Dist Clamp" + i + "To" + j + "=" + ClampDist + ">" + MaxClampDistance + " ; " 
                }
                Notify("Nb of intervalKO=",ClampIntervalKO)
                Notify("TextKO: "+ TextKO)
                FinalMessage=FinalMessage + TextKO
                Notify("FinalMessage: " + FinalMessage)
        }
}        

If (CheckStatus=="OK")
    {
    ThisCheck->AddTupleSucceededWithComment(FinalMessage,PipeOcc)
    Notify ("Final Message: " + FinalMessage)
    }
    else
    {
    ThisCheck->AddTupleFailedWithComment(FinalMessage,PipeOcc)
    Notify ("Final Message: " + FinalMessage)
	}

 

If your clamp are not "Piping part" but "SharedSupport" type :

in the above rules the Clamp is supposed to be a Piping Part Occurence

IF you are using "Support" Object type for Clamp then you must define in the rule the Clamp object as a "SharedSupportPartOccurrence"

--> the above rule must be adjust :

Warning : Today 23x-24xGA this code doesn't work because the function to get Object form PipeOcc "GetRelatedObjects()" doesn't return the "SharedSupportPart" object type --> need to investigate on how to retreive  "SharedSupportPartOccurence" from Pipe Occurence

Current code for Piping Part Occ

//create a new list that contains only PipingPart with subtype =Clamp
for i while i <= NbPartList
{
    set PartOcc = PartList.GetItem(i)
    PartRef=PartOcc.Reference
    set PartSubType = PartRef.GetAttributeString("V_SubPartType")
    if PartSubType=="Clamp"
    {
        ClampList->AddItem(PartOcc,j)
        j=j+1
    }
}

To be replaced by following : 
First , declare the variable for "Support"
Let SupportOcc (SharedSupportPartOccurrence)  // Support occurence attached to the pipe
create the list of support per pipe
//create a new list that contains only Support object type
for i while i <= NbPartList
{
    set SupportOcc = PartList.GetItem(i)
    ClampList->AddItem(SupportOcc,j)
    j=j+1
}