Introduction
Purpose : synchronize Material Name attribute and PLM material associated to the piping part : associate a PLM material equal to the Material Name Attribute of the piping part reference
With this rule you can have a unique generic part and component family that covers multiple materials, system will associate automatically the good PLM material according the value of the attribute "MaterialName"
Prereq :
- the Material Title must be unique in database
- a material table must be attached to the Piping specification Resource Set in Datasetup App
Code Example
/* Signature: Name : ipPartBody ; Type: BodyFeature */
// Declaration Variable
let pRepRef (VPMRepReference)
let pPrdRef (VPMReference)
let BodyName(String)
let returnCode(Boolean)
let Path(String)
let pOldMaterial(CATMatReference)
let AppliedMaterial(CATMatConnection)
let pMaterialTable(Ens_MaterialTable)
let pListCell(List)
let pCell(EnsTechnologicalTableCell)
let Nb (Integer)
let j(Integer)
let StrMaterialName(String)
let StrMaterialNameOld(String)
let StrMaterialNameTable(String)
let pPipingEntity(Piping_Entity)
let PipingMaterial(String)
let pNewMaterial(CATMatReference)
let bMaterialFound(Boolean)
// Initialization
set bMaterialFound = false
// Retrieve name of Body
set BodyName = ipPartBody.Name
if ("PartBody" == BodyName)
{
Trace (1, "================ 3D Fluidic Material Rule =================== ")
// Retrieve the VPMRepReference from Feature
set pRepRef = GetPLMOwner(ipPartBody)
// Retrieve VPMReference from VPMRepReference
if (NULL <> pRepRef)
{
set pPrdRef = pRepRef.AggregatingReference
}
// Retrieve the Piping Entity
if (NULL <> pPrdRef)
{
set pPipingEntity = pPrdRef
}
// if it is Piping entity, we can do the work.
if (NULL <> pPipingEntity)
{
Trace(1, pPipingEntity.Name)
// Read the Material Name on Piping entity
StrMaterialName = pPipingEntity.V_MaterialName
Trace(1, "Material Name Value : " + StrMaterialName)
// Read Material core apply on Piping entity
returnCode = GetMaterialCore(pPipingEntity, Path, pOldMaterial, AppliedMaterial)
if (NULL <> pOldMaterial)
{
StrMaterialNameOld = pOldMaterial.V_Name
Trace(1, "Material Name of CATMaterial : " + StrMaterialNameOld)
}
if (StrMaterialName == StrMaterialNameOld)
{
Trace(1, "Material Already Apply, nothing to do")
}
else
{
Trace(1, "We must apply the Material")
// Remove the existing material as it is not the good one.
if (NULL <> pOldMaterial)
{
returnCode = RemoveMaterial(AppliedMaterial)
}
// Retrieve the Material table from data setup.
pMaterialTable = AccessResource("PipingSpecificationResource|Material","Ens_MaterialTable")
if (NULL <> pMaterialTable)
{
pMaterialTable.GetColumn(1,pListCell)
Nb = pListCell.Size()
// Loop on table to retrieve the same matrial as define on Piping Entity
j = 1
for j while j <= Nb
{
pCell = pListCell.GetItem(j)
if (NULL <>pCell)
{
StrMaterialNameTable = pCell.GetAttributeString("ValueAsString")
if (StrMaterialName == StrMaterialNameTable)
{
// IF we retrieve the Material Name in ESE Table, we apply it on Piping Entity
Trace(1, StrMaterialNameTable + " - " + ToString(j))
pNewMaterial = pCell.GetAttributeObject("PLMEntityValueSource")
if (NULL <> pNewMaterial)
{
Trace(1, "Pointer on Material is OK")
returnCode = SetMaterialCore(pPrdRef, Path, pNewMaterial, AppliedMaterial)
bMaterialFound = true
}
}
}
}
if (false == bMaterialFound)
{
Notify("Material not found in Table")
}
}
}
}
}
3DXML :
Pipe exemple including the Rule
