EKL Cheat Sheet

I share here some of my notes and useful EKL queries for DELMIA.

It is not a training nor a best practice, just sharing the commands that I use a lot or that I find useful to keep somewhere.

If you have questions about some queries/functions, please read the documentation.

Don’t hesitate to comment with your best queries or pieces of code and I will update the page.

Variables types

 ProductItemProcessResource
ReferenceVPMReference

DELFmiFunctionReferenc

CreateAssembly
Provide
...
 

DELLmiWorkPlanSystemReference
DELLmiOperationReference
DELLmiLoadingOperationReference
DELLmiHeaderOperationReference
...
PLMResource
VPMReference
PLMDELResTyping
InstanceVPMInstanceDELFmiFunctionInstanceDELLmiWorkPlanSystemInstance
DELLmiPPROperationInstance
...
VPMInstance
OccurrenceProductOccurrenceMfgProcessOccurrence
FProcessOccurrence
ProdSystemOccurenceResourceOccurrence

PPRContext

Get root References

let PPRRoot(PPRContext)
let rootList(List)
let rootElement(DatabaseObjectType)
let rootWorkPlan(DELLmiWorkPlanSystemReference)


PPRRoot = GetEditorRoots("PPRContext").GetItem(1)
rootList = PPRRoot.Children
For rootElement inside rootList
{

	...
}

EBOM

Search for a Product by title

//Input List: rootProdRef(VPMReference)
Let myTitle(String)
Let ProdRefList(List)
Let ProdRef(VPMReference)

myTitle = "Demo"
ProdRefList = rootProdRef->Query("VPMReference", "x.V_Name  == \\"" + myTitle + "\\"")

if ProdRefList.Size()>0 //if we find objects
{
	Notify("# Products found:", ProdRefList.Size())
	For ProdRef inside ProdRefList //Loop on each objects
	{
		Notify("#", ProdRef.V_Name)
		...
	}
}else
{
	Notify("Product Not Found")
}

Get Variant Effectivity of an Instance by Web Service

//input: ProdInst(VPMInstance), ParentPrdRef(VPMReference)
Let serverUrl(String)
Let securityContext(String)
let sEffectivity(String)
let oClient(HTTPClient)
let sResponse(String)
let dtResponse(DataTreeNode)
let drResponseNode(DataTreeNode)
let drResponseList(List)


serverUrl = GetSystemInfo("serverurl")
securityContext = GetSystemInfo("securitycontext")


sEffectivity =serverUrl + "/resources/v1/modeler/dseng/dseng:EngItem/"+ ParentPrdRef.GetPhysicalId() + "/dseng:EngInstance/" + ProdInst.GetPhysicalId() + "/dscfg:Filterable"


Set oClient=CreateHTTPClient()
oClient.AddRequestHeaders("SecurityContext:ctx::" + securityContext)
oClient.AddRequestHeaders("Content-Type:application/json")

sResponse=oClient.Get(sEffectivity,dtResponse)



if (oClient.ReturnCode==0)
{
	drResponseList=dtResponse->Query("DataTreeNode","x.Name  == \\"Effectivity_Variant\\"")
	if (drResponseList->Size()>0)
	{
		drResponseNode=drResponseList->GetItem(1)
		Notify("Node: #", drResponseNode.String)
	
	}
}

Get Scoped MBOM From Session

//Input: ProductOcc(ProductOccurrence)
Let ProductRef(VPMReference)
let PrcsScopeList(List)

set ProductRef = ProductOcc.Reference

PrcsScopeList = GetProcessOfEachScope(ProductRef)
PopupMessage("Number of Scoped Items in session: ", PrcsScopeList.Size())

Get Scoped MBOM from Database

Note: This method causes drop in performance as it takes time to search for objects in database

//Input: ProductOcc(ProductOccurrence)
Let ProductRef(VPMReference)
let PrcsScopeList(List)

set ProductRef = ProductOcc.Reference

PrcsScopeList = ProductRef.NavigateFromPartOrPrdToProcessThroughScopeLink()
PopupMessage("Number of Scoped Items from Database: ", PrcsScopeList.Size())

MBOM

Create and assign new Provided Part (Scope + Implement Link)

//Input List: parentProcOcc(MfgProcessOccurrence),ProdOcc(ProductOccurrence)
Let newItemRef(Provide)
Let newItemOcc(MfgProcessOccurrence)
Let newItemFPOcc(FProcessOccurrence)
Let parentProcRef(CreateAssembly)
Let ProdRef(VPMReference)
Let ProdTitle(string)

ProdRef = ProdOcc.Reference
ProdTitle = ProdRef.V_Name

set parentProcRef = parentProcOcc.Reference

Set newItemRef = new("Provide", ProdTitle, NULL)
newItemOcc = parentProcOcc.InsertPredecessor(newItemRef)
newItemOcc.AssignProduct(ProdOcc)
newItemOcc->CreateScope(ProdOcc)

Get all Provided Parts in the MBOM

//Input List: rootItemRef(CreateAssembly)
Let myTitle(String)
Let ItemRefList(List)
Let ItemRef(Provided)

myTitle = "Demo"
ItemRefList = rootItemRef->Query("Provide", "")

if ItemRefList.Size()>0 //if we find objects
{
	Notify("# Items found:", ItemRefList.Size())
	For ItemRef inside ItemRefList //Loop on each object
	{
		Notify("#", ItemRef.V_Name)
		...
	}
}else
{
	Notify("ItemNot Found")
}

Search for a specific Provided Part in the MBOM

//Input List: rootItemRef(CreateAssembly)
Let myTitle(String)
Let ItemRefList(List)
Let ItemRef(Provided)

myTitle = "Demo"
ItemRefList = rootItemRef->Query("Provide", "x.V_Name  == \\"" + myTitle + "\\"")

if ItemRefList.Size()>0 //if we find objects
{
	Notify("# Items found:", ItemRefList.Size())
	For ItemRef inside ItemRefList //Loop on each object
	{
		Notify("#", ItemRef.V_Name)
		...
	}
}else
{
	Notify("ItemNot Found")
}

Start MIPLI (Manage Item-Product Link Inconsistency)

//Input: RootItemOcc(MfgProcessOccurrence)
Let Header(String)
Header = 'CATAfrLegacyCompassHeaderHdr' //to launch BI Essential automatically after
RootItemOcc.LaunchMIPLICommandApplyAutoSession(Header)

Search Scoped Product in Data Base

//input: ItemOcc(MfgProcessOccurrence)
let ItemRef(CreateAssembly)
let ScopeResult(PLMQueryResult)

let ScopeLoaded(VPMReference)

set ItemRef= ItemOcc.Reference



set ScopeResult = ItemRef.GetScopedProduct()
set ScopeLoaded = ScopeResult.LoadResult(false)

Notify("Scoped Product = ", ScopeLoaded.Name)

 

Process

Create and insert new Loading Operation under a Header Operation

//Input List: HeaderOpeOcc(DELLmiHeaderOperationReference)
Let newOpeRef(DELLmiLoadingOperationReference)
Let newOpeOcc(ProdSystemOccurrence)

newOpeRef = new("DELLmiLoadingOperationReference", "Loading Operation Title", NULL)
newOpeOcc = HeaderOpeOcc.InsertExistingOperation(newOpeRef)

Assign a provided part to a Loading Operation

//Input List: newOpeOcc(DELLmiLoadingOperationReference),itemOcc(MfgProcessOccurrence)
Let itemFPOcc (FProcessOccurrence)

set itemFPOcc = itemOcc
newOpeOcc.AssignProcess(itemFPOcc)

Rename all Loading Operations which have only 1 implement Link

//Input: RootWkOcc(ProdSystemOccurrence)

Let OperationList (List)
Let RootWkRef(DELLmiWorkPlanSystemReference)
Let OperationRef(DELLmiLoadingOperationReference)
Let OperationOcc(ProdSystemOccurrence)
Let OperationOccList(List)
Let ItemOccList(List)
Let ItemOcc(MfgProcessOccurrence)
Let ItemRef(DELFmiDiscreteFunctionReference)
Let title(String)

set RootWkRef =RootWkOcc.Reference
OperationList = RootWkRef->Query("DELLmiLoadingOperationReference","")

for OperationRef inside OperationList
{
	OperationOccList = OperationRef.ListOccurrences(RootWkRef)
	If OperationOccList.Size() > 0
	{
		OperationOcc = OperationOccList->GetItem(1)
		ItemOccList = OperationOcc.AssignedProcesses
		if ItemOccList.Size() == 1
		{
			ItemOcc = ItemOccList->GetItem(1)
			set ItemRef = ItemOcc.Reference
			OperationRef.V_Name = "Load " + ItemRef.V_Name
		}
	}
}

Create a Workplan scoped to Manufacturing Assembly

//Input: iMfgParent (MfgProcessOccurrence), iHWorkplanOcc(ProdSystemOccurrence)
Let mfgOccList(List)
Let mfgOcc(MfgProcessOccurrence)
Let mfgRef(DELFmiFunctionReference)
Let mfgFPOcc(FProcessOccurrence)
Let newWorkplanOcc(ProdSystemOccurrence)
Let newWorkplanInst(DELLmiWorkPlanSystemInstance)
Let newWorkplanRef(DELLmiWorkPlanSystemReference)
Let iHWorkplan (DELLmiHeaderWorkPlanReference)

set iHWorkplan = iHWorkplanOcc.Reference
mfgOccList = iMfgParent.Children
for mfgOcc inside mfgOccList
{
	mfgRef = mfgOcc.Reference
	If mfgRef.ModelerType.Name == "CreateAssembly"
	{
		set mfgFPOcc = mfgOcc
		newWorkplanRef = new("DELLmiWorkPlanSystemReference", "Workplan " + mfgRef.V_Name, NULL)
		Set newWorkplanOcc =  iHWorkplanOcc.InsertExistingSystem(newWorkplanRef)
		newWorkplanOcc->CreateScope(mfgFPOcc)
		
	}
}

Create a Task with PPR Root nodes and selected Operation as attachment

//input: opRef(DELLmiOperationReference), PPRRootList(List) check the PPRContext/Get root References chapter for that
//Prerequisite: have the other Action to get CSRF token
Let serverUrl(String)
let httpCli(HTTPClient)
Let response(String)
Let responseDtn(DataTreeNode)
Let securityContext(String)
Let getCSRFTokenAction(AdvisorAction)
Let csrfToken(String)
Let opPhysicalId(String)
Let taskServiceUrl(String)
Let modelerName(String)
Let relativePath(String)

opPhysicalId = opRef.GetPhysicalId()
modelerName = opRef.ModelerType.Name
relativePath = "/resources/v1/modeler/dsprcs/dsprcs:MfgOperation/" +opPhysicalId

serverUrl = GetSystemInfo("serverurl")
securityContext = GetSystemInfo("securitycontext")

getCSRFTokenAction = `Knowledge Engineering Specification Physical00000022 A\\Relations\\Get CSRF Token`
getCSRFTokenAction.Run(serverUrl, securityContext, csrfToken)

let jCSRFNode(JSONNode)
jCSRFNode = new("JSONNode","csrf",NULL)
jCSRFNode.SetAttributeString("name","ENO_CSRF_TOKEN")
jCSRFNode.SetAttributeString("value",csrfToken)

taskServiceUrl = serverUrl + "/resources/v1/modeler/tasks"

let jDataElementNode(JSONNode)
jDataElementNode = new("JSONNode","dataelement",NULL)
jDataElementNode.SetAttributeString("state","Create")
jDataElementNode.SetAttributeString("title","Create WorkInstruction for  " + opRef.V_Name) //put your title here

let refList(List)
let jReferenceNode(JSONNode)
jReferenceNode = new("JSONNode", "reference",NULL)
jReferenceNode.SetAttributeString("id", opPhysicalId)
jReferenceNode.SetAttributeString("source", serverUrl)
jReferenceNode.SetAttributeString("type", modelerName)
jReferenceNode.SetAttributeString("service", "3DSpace")
jReferenceNode.SetAttributeString("identifier", opPhysicalId)
jReferenceNode.SetAttributeString("relativePath", relativePath)
refList.Append(jReferenceNode)

let VPMObject(DatabaseObjectType)
let assyRef(CreateAssembly)
let WkPlRef(DELLmiWorkPlanSystemReference)
let PrdInst(VPMInstance)
let PrdRef(VPMReference)
let vpmRefPhysicalId(string)

For VPMObject inside PPRRootList{
	If(VPMObject.ModelerType.Name == "CreateAssembly"){
		
		Set assyRef = VPMObject
		
		vpmRefPhysicalId = assyRef.GetPhysicalId()
		modelerName = assyRef.ModelerType.Name
		relativePath = "/resources/v1/modeler/dsmfg/dsmfg:MfgItem/" + vpmRefPhysicalId
		
		jReferenceNode = new("JSONNode", "contexts", NULL)
		jReferenceNode.SetAttributeString("source", serverUrl)
		jReferenceNode.SetAttributeString("id", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("type", modelerName)
		jReferenceNode.SetAttributeString("identifier", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("relativePath", relativePath)
	}else if (VPMObject.ModelerType.Name == "DELLmiWorkPlanSystemReference"){
		Set WkPlRef = VPMObject
		
		vpmRefPhysicalId = WkPlRef.GetPhysicalId()
		modelerName = WkPlRef.ModelerType.Name
		relativePath = "/resources/v1/modeler/dsprcs/dsprcs:MfgProcess/" + vpmRefPhysicalId
		
		jReferenceNode = new("JSONNode", "contexts", NULL)
		jReferenceNode.SetAttributeString("source", serverUrl)
		jReferenceNode.SetAttributeString("id", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("type", modelerName)
		jReferenceNode.SetAttributeString("identifier", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("relativePath", relativePath)
	}
	else if (VPMObject.ModelerType.Name == "VPMInstance"){
		Set PrdInst = VPMObject
		PrdRef = PrdInst.Reference
		vpmRefPhysicalId = PrdRef.GetPhysicalId()
		modelerName = PrdRef.ModelerType.Name
		relativePath = "/resources/v1/modeler/dseng/dseng:EngItem/" + vpmRefPhysicalId
		
		jReferenceNode = new("JSONNode", "contexts", NULL)
		jReferenceNode.SetAttributeString("source", serverUrl)
		jReferenceNode.SetAttributeString("id", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("type", modelerName)
		jReferenceNode.SetAttributeString("identifier", vpmRefPhysicalId)
		jReferenceNode.SetAttributeString("relativePath", relativePath)
	}else{
		Notify("to ignore")
	}
refList.Append(jReferenceNode)
}


let jPersonNode(JSONNode)
jPersonNode = new("JSONNode","dataelements",NULL)
jPersonNode.SetAttributeString("name","TRIGRAM")//put the trigram of the person you want to assign to

let jAssigneeNode(JSONNode)
jAssigneeNode = new("JSONNode", "assignee", NULL)
jAssigneeNode.SetAttributeString("type", "Person")
jAssigneeNode.SetAttributeObject("dataelements",jPersonNode)

let assigneeList(List)
assigneeList.Append(jAssigneeNode)

let jRelatedData(JSONNode)
jRelatedData = new("JSONNode", "relateddata",NULL)
jRelatedData.SetAttributeObject("references",refList)
jRelatedData.SetAttributeObject("assignees", assigneeList)

let jData(JSONNode)
jData = new("JSONNode","data",NULL)
jData.SetAttributeObject("dataelements",jDataElementNode)
jData.SetAttributeObject("relateddata",jRelatedData)

let dataList(List)
dataList.Append(jData)

let jRootNode(JSONNode)
jRootNode = new("JSONNode","Root",NULL)
jRootNode.SetAttributeObject("csrf",jCSRFNode)
jRootNode.SetAttributeObject("data",dataList)


httpCli = CreateHTTPClient()
httpCli.AddRequestHeaders("SecurityContext:ctx::" + securityContext)
httpCli.AddRequestHeaders("Content-Type:application/json")
response = httpCli.Post(taskServiceUrl, "HTTPDEFINED",  jRootNode.Stringify(), responseDtn)

Get Capable Resource Structure Linked to a Process/System

//Input: SystemReference: PLMSystem or PLMCoreReference

Let oPLMResource(PLMResource)
Let ResourceAlias(String)
Let LoadingStatus(String)

GetOrgResourceFromProcess(SystemReference,oPLMResource,true,LoadingStatus,ResourceAlias)

PopupMessage("Capable Resource Structure Title: ", oPLMResource.V_Name)
PopupMessage("Status: ", LoadingStatus)
PopupMessage("ResourceAlias: ", ResourceAlias)

 

Get Assets Structure Linked to a Process/System

//Input Argument: SysOcc (ProdSystemOccurrence)
Let oPLMResource(PLMResource)
Let Status(Integer)
Let Alias(String)
Let returncode(boolean)
Let iPLMSystem(PLMSystem)
Set iPLMSystem = SysOcc.Reference //[SysOcc From Argument List,Provided by user selection]
returncode = iPLMSystem->GetPreAssignedContextResource(oPLMResource,Status,Alias)

PopupMessage("Assets Strcture Title: ", oPLMResource.V_Name)

Get Implemented "With" Resources

Let OpeResourceList(List)
Let OpeOcc(ProdSystemOccurrence)
set OpeResourceList = GetWithResource(OpeOcc)

Implement Resource to Operation/System

let RscOcc(ResourceOccurrence)
Let OpeOcc(ProdSystemOccurrence)
Let SysOcc(ProdSystemOccurrence)

RscOcc.AssignSystem(SysOcc) //case assign to a System

SysOcc.AssignOperation(OpeOcc)//case assign to an Operation

Other

Getting parent Occurrence and Reference of a given Occurrence

Let oParentPrdOcc(ProductOccurrence)
Let oParentPrdRef(VPMReference)
Let oPrdOcc (VPMInstance)

Set oParentPrdOcc = oPrdOcc.Owner
Set oParentPrdRef = oParentPrdOcc.Reference
Message("Parent Reference name is: #”,oParentPrdRef.Name)

Query for children (or child) based on search condition

Let childrenList(List)
Let rootProduct(VPMReference)
Let strSearchStr(String)
Let strName(String)
Set rootProduct = GetEditorRoots("VPMReference“)->GetItem(1)
childrenList=rootproduct->Query("VPMInstance","x.Reference.V_Name like \\"*Crankshaft*\\"")
Message("No of Children = ", childrenList.Size())

Getting a Occurrence Object for a given Reference Object

Let childrenList(List)
Let rootProduct(VPMReference)
Let productRef(VPMReference)
Let productOcc(ProductOccurrence)
Let occList(List)
Let strSearchStr(String)
Let strName(String)

rootProduct = oRootOccurrence.Reference
strName = "Part00007050"
strSearchStr= "x.V_Name  ==" + " \\"" + strName + "\\""
childrenList = rootProduct->Query(“VPMReference", strSearchStr)
If childrenList.Size() > 0
{
	Set productRef= childrenList->GetItem(1)
	occList = productRef->ListOccurrences(rootProduct)
	If occList.Size() > 0
	{
		productOcc= occList->GetItem(1)
		Message("Occurrence Name = ", productOccOcc.Name)
	}
}

Write to a text file

Let file (TextFile)
Let buffer (String)

Set file = OpenTextFile("e:\\tmp\\TextFile1.txt","w")
buffer = "Hello" 
file->Write(buffer) 
file->Close()

Read from a text file

Let file (TextFile)
Let buffer (String)

Set file = OpenTextFile("e:\\tmp\\TextFile1.txt","r")
Set buffer = file->Read() 
file->Close()

Get CSRF tokens for Web Service usage (credit to Pavan PQA)

/* Action created by PQA 3/17/2024 */

//input: serverUrl(String), securityContext(String),sCSRFTokenValue(String)
let sEnoTokenWS(String)
let oClient(HTTPClient)
let oDataTreeNode(DataTreeNode)
let sResponse(String)
let dtResponse(DataTreeNode)
let drResponseNode(DataTreeNode)
let drResponseList(List)
let bTraceAll(Boolean)
Let sBaseEnoURL(String)

sEnoTokenWS = serverUrl + "/resources/v1/application/CSRF"

Set oClient=CreateHTTPClient()
sResponse=oClient.Get(sEnoTokenWS,dtResponse)

Trace(1, "Return Value = ", sResponse)
if (oClient.ReturnCode==0)
{
	//Navigate Response to tag "value"
	drResponseList=dtResponse->Query("DataTreeNode","x.Name  == \\"value\\"")
	if (drResponseList->Size()>0)
	{
		drResponseNode=drResponseList->GetItem(1)
		sCSRFTokenValue=drResponseNode.String
		if (bTraceAll)
		{
			Trace(1,"ENO CSRF Token :#",sCSRFTokenValue)
		}
	}
	else
	{
		sCSRFTokenValue = ""
	}
}
else
{
	sCSRFTokenValue = ""
}

Trace(1, sCSRFTokenValue)

Get Object Physical ID

//Input Argument: iPLMCoreReference: PLMCoreReference
Let PhysicalID(String)
set PhysicalID = iPLMCoreReference.GetPhysicalId()
PopupMessage("Physical ID: ", PhysicalID)