---
title: "Add Operation Information Panel To Trace Graph"
id: "add-operation-information-panel-to-trace-graph"
project: "Knowledge Base"
url: "https://docs.sepasoft.com/articles/knowledge-base/add-operation-information-panel-to-trace-graph"
updated: 2026-07-23T18:08:23Z
---

# Add Operation Information Panel To Trace Graph

## Track and Track Graph

The Trace Graph provides a high-level view of all materials produced and consumed over the lifecycle of a given material lot.

Material Lots are displayed as inputs and outputs of each operation. There may be a desired to show additional information about a given operation.

This topic demonstrates how to display additional information about a given operation using the Perspective Trace Graph.

### Components:

* [Trace Graph | Vision](/smart/project-imported-manual/mes-trace-graph)
* [Trace Graph | Perspective](/smart/project-imported-manual/mes-trace-graph-perspective)
* Ignition Markdown Component
* Ignition Embedded View

### Resource:

* [TraceGraphOpInfoPane.zip](/resources/Storage/knowledge-base/TraceGraphOpInfoPane.zip)

Import the zip file in the designer for the completed example screen.

### Example:
![](/resources/Storage/knowledge-base/add-operation-information-panel-to-trace-graph/image2023-1-3_10-6-59.png)
In this example, we use the **Node Clicked** right-click event to trigger an embedded view on the left to display information about a given operation:
![](/resources/Storage/knowledge-base/add-operation-information-panel-to-trace-graph/image2023-1-3_10-10-13.png)
Script for nodeClicked event:

```python
def runAction(self, event):
	if event.getType() == 'ResponseSegment':
		self.getSibling("emb_opInfo").props.params.responseSegUUID = event.getUUID()
	else:
		self.getSibling("emb_opInfo").props.params.responseSegUUID = ''

# Example if a material lot is selected, retrieve the lot object, determine if an artifact is present, and show a popup if so.		
#	if event.getType() == 'MaterialLot':
#		lotUUID = event.getUUID()
#		lotObj = system.mes.loadMESObject(lotUUID)
#		if 'some artifact' in lotObj.getAllArtifactNames():
#			system.perspective.openPopup('inspectionresults', 'Your/view', {'lotUUID':lotUUID})
```

Here we are pushing the response segment UUID to the embedded view. The view contains script to populate itself based on the segment data.

In the embedded view, we have a Markdown component which will display the data in a friendly manner.

On the View parameter **responseSegUUID** value change, we retrieve the uuid, load the object, and load desired data about the operation.
![](/resources/Storage/knowledge-base/add-operation-information-panel-to-trace-graph/image2023-1-3_10-15-59.png)


```python
def valueChanged(self, previousValue, currentValue, origin, missedEvents): 
	respSegUUID = currentValue.value
	markup = ''
	if len(respSegUUID) > 0:
		seg = system.mes.loadMESObject(respSegUUID)
		
		markup = '# **' + seg.getName() + '**
'
		markup += '**Started:** ' +str(seg.getPropertyValue('BeginDateTime')) +' 

'
		markup += '**Ended:** ' +str(seg.getPropertyValue('EndDateTime')) +' 

'
				
		operationUUID = seg.getPropertyValue('OperationsResponseRefUUID')
		opResponse = system.mes.loadMESObject(operationUUID)
		
		#Get the MES object link of where the operation is running
		eqLink = opResponse.getEquipmentLink()
		
		markup += '## Processing Equipment
'
		markup += '**Type**: '+ str(eqLink.getMESObjectType()) + '
 
'
		markup += '**Name**: '+ eqLink.getName() +'
 
'
		
		complexProps = seg.getComplexPropertyCount('ResponseMaterial')
		
		props = {}
		uiList = []
		for i in range(complexProps):
			prop = seg.getComplexProperty('ResponseMaterial',i)
			#material prop name
			propName = prop.getName()
			if prop.hasSegmentRefUUID():
				#lot number
				lotName = prop.getMaterialLot().getName()
				#material def name
				matName = prop.getMaterialRef().getName()
				#location
				location = prop.getEquipmentRef().getName()
				#quantity
				quantity = prop.getQuantity()
				#begintime
				begin = prop.getBeginDateTime()
				#end time
				end = prop.getEndDateTime()
				#use
				use = prop.getUse()
				
				lotSequence = prop.getLotRefSequence()
				eqPath = eqLink.getMESObject().getEquipmentPath()
				
				customProps = []
				lot = system.mes.loadMaterialLot(lotName, lotSequence, eqPath, False)
				
				for cp in lot.getAllCustomProperties():
					customProps.append(cp.getName() + ':' + str(cp.getValue()))
				
				#Sublots
				sublots = []
				for lot in lot.getChildCollection():
					sublots.append(system.mes.getMESObjectLink(lot).getName())
				
				finalProp = {use:
					{
						'propName' : propName,
						'lotName' : lotName,	
						'matName' : matName,
						'location' : location,
						'quantity' : quantity,
						'begin' : begin,
						'end': end,
						'customProps': customProps,
						'sublots':sublots
					}
				}
		
			else:
				finalProp = {'unused':{'propName':propName}}
				
			#update relevant material
			if props.has_key(finalProp.keys()[0]):
				props[finalProp.keys()[0]].append(finalProp[finalProp.keys()[0]])
			#create new list of material
			else:
				props.update({finalProp.keys()[0]:[finalProp[finalProp.keys()[0]]]})
		
		useOrder = ['In','Out','Consumable','By-Product']
		for use in useOrder:
			first = True
			for key, values in props.items():
				if key == use:
					for matProp in values:
						if first == True:
							markup += '## **Material - ' + key + '**
'
						else:
							markup += ' 
 '
						markup += '|' + matProp['propName'] + ':||
'
						markup += '|--|--|
'
						markup += '|Lot No:|' + matProp['lotName'] + '|
'
						markup += '|Material|' + matProp['matName'] + '|
'
						markup += '|Location|' + matProp['location'] + '|
'
						markup += '|Quantity|' + str(matProp['quantity']) + '|
'
						markup += '|Begin Date Time|' + str(matProp['begin']) + '|
'
						markup += '|End Date Time|' + str(matProp['end']) + '|
'
						#custom properties
						if matProp['customProps']:
							for cp in matProp['customProps']:
								markup += '|' + cp.split(':')[0] + '|' + cp.split(':')[1] + '|
'
						first = False
						#sublots
						if matProp['sublots']:
							for sublot in matProp['sublots']:
								markup += '| |'+ sublot + '|
'
		

	self.getChild("root").getChild("Markdown").props.source = markup				
```


### Related

* [Response Segment](/articles/user-manual/Response-Segment)
* [Material Lot](/articles/user-manual/Material-Lot)
* [Material Sublot](/articles/user-manual/Material-Sublot)
* [AbstractMESObject Functions](/articles/user-manual/AbstractMESObject-Functions)