Inspecting Open Windows

As I was exploring the Ignition API and Python I created a simple window that inspects currently opened windows:

def safeInspect(object):
	from com.inductiveautomation.factorypmi.application.script import PyComponentWrapper
	from java.awt import IllegalComponentStateException
	import inspect
	
	meta = {}
	
	#print type(object)
	for key in dir(object):
		m = { "name" : key, "value" : None, "type" : None, "memberType" : "unknown", "exception" : None }
		try:
			getattr(object, key)
			
			attributeValue = getattr(object,key,None)
			m["value"] = attributeValue
			m["type"] = type(attributeValue).__name__
			
			if(callable(attributeValue)):
				m["memberType"] = "function"
				#print "%s [METHOD]" % key
			else:
				m["memberType"] = "property"
				#print "%s<%s> = %s [PROPERTY]" % (key,type(attributeValue).__name__,attributeValue)
		except (TypeError, AttributeError, IllegalComponentStateException), e:
			m["exception"] = e
			#print "%s [NOT READABLE %s]" % (key, e.__class__)
		except e:
			m["exception"] = e
			#print "%s [FAIL %s]" % (key, e.__class__)
			
		meta[key] = m
		
	return meta
def addMembersToRows(path,component):
		meta = shared.developer.safeInspect(component)
		for key in meta:
			name = meta[key]["name"]
			if(meta[key]["memberType"]=="property"):
				name = "<html><code>%s</code> = <strong>%s</strong>" % (meta[key]["name"],meta[key]["value"])
				tooltip = """<html>
						<div>
							<strong>Name=%s</strong><br><hr>
							Value=%s<br>
							Type=%s<br>
						</div>""" % (meta[key]["name"],meta[key]["value"],meta[key]["type"])
			elif(meta[key]["memberType"]=="function"):
				tooltip = """<html>
						<div>
							<strong>Name=%s</strong><br>
						</div>""" % (meta[key]["name"])
			else:
				tooltip = """<html>
					<div>
						<strong>Name=%s</strong><br><hr>
						Error=%s<br>
					</div>""" % (meta[key]["name"],meta[key]["exception"])
			dataRow = [
				meta[key],
				path+separator+'members'+separator+meta[key]["memberType"],
				name,
				tooltip]
			dataRow.extend(defaultRow)
			rows.append(dataRow)

	thisWindow = system.gui.getWindow("developer/Inspect")
	thisRoot = thisWindow.rootContainer
	thisTree = thisRoot.getComponent("tree")
	separator = thisTree.separationCharacter
	rows = []
	headers = ["metadata","path","text","tooltip","icon","background","foreground","border","selectedText","selectedIcon","selectedBackground","selectedForeground","selectedTooltip","selectedBorder"]
	defaultRow = ["default","color(255,255,255,255)","color(0,0,0,255)","","","default","color(250,214,138,255)","color(0,0,0,255)","",""]
		
	openWindows = system.gui.getOpenedWindows()
	
	for window in openWindows:
		if(window.path=="developer/Inspect"):
			continue
		
		addMembersToRows(window.name,window)
		addMembersToRows(window.name+separator+window.rootContainer.name,window.rootContainer)
			
		for component in window.rootContainer.getComponents():
			addMembersToRows(
				window.name+separator+window.rootContainer.name+separator+component.name+" <"+type(component).__name__+">",
				component)

	data = system.dataset.toDataSet(headers, rows)
	thisTree.data = data

Well done! :prayer:
I may have to retire the introspection script I’ve been using for years.

Cool, I would like to check it out. Can you export the window and attach it to this thread?

Thanks,

It’s just a window with a tree :slight_smile:
And runs the second script on Activate.

I attached it.

[quote=“nmudge”]Cool, I would like to check it out. Can you export the window and attach it to this thread?

Thanks,[/quote]