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