Finding all available methods from a component

Hello,

I was wondering if there is a way to fetch all methods available from a component. In this topic, I can see a setVerticalScrollBarPolicy() function but I have absolutely no idea about where it ccomes from.

Subject: Check for vertical scroll bar

I’ve looked a little further and with the following code, i managed to get some of a component methods, but obviously not all as I can not find the setVerticalScrollBarPolicy() function in the returned array.

powerTable = event.source.parent.getComponent('Power Table')
powerTableClass = powerTable.getClass()
print powerTableClass.getDeclaredMethods()

How can I find all methods ?

Regards.

I’ve attached the introspect() function that I wrote years ago (in the FPMI days). Still handy today. I suggest you load it as a shared module, then call it like:

powerTable = event.source.parent.getComponent('Power Table') shared.inspect.introspect(powerTable)
inspect.py (3.09 KB)

Edit: Link expired. Use the version shown below.

2 Likes

[quote=“pturmel”]I’ve attached the introspect() function that I wrote years ago (in the FPMI days). Still handy today. I suggest you load it as a shared module, then call it like:

powerTable = event.source.parent.getComponent('Power Table') shared.inspect.introspect(powerTable)[/quote]

Nice! Thanks for sharing. :thumb_left:

Awesome !

Thank you very much.

Looks like the link is broken now with the new forum? Or is that just me?

Hi Zack,

The download doesn’t work for me either.

There is also an Ignition template available that can show all the methods of a component. It is called the Graphical Object Inspector. You can see it and get it at the blog post at this link: http://nickmudge.info/post/graphical-object-inspector-in-ignition

1 Like

I was looking for a way to change the scroll speed of the template repeater and I came across your post from a while back.

Double Thanks!

The introspection script has evolved over time, particularly to return a string result instead of just printing. I found that useful for introspection in gateway scope using runScript() in an expression tag. Or to set the .text property of a scrollable text edit field for convenience. This is what it looks like today:

# Introspection for Jython/Java
#
# Copyright 2008-2016 Automation Professionals, LLC <sales@automation-pros.com>
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
#   1. Redistributions of source code must retain the above copyright notice,
#      this list of conditions and the following disclaimer.
#   2. Redistributions in binary form must reproduce the above copyright notice,
#      this list of conditions and the following disclaimer in the documentation
#      and/or other materials provided with the distribution.
#   3. The name of the author may not be used to endorse or promote products
#      derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.

#------------
def introspect(obj):
	"""Describe the methods and properties available in the given object,
	from both the jython perspective, and the java perspective."""
	from java.lang import reflect
	result = "Python Type: %s\n" % type(obj)
	c = obj.getClass()
	basetype = str(c)
	result += "Java Type:   %s\n" % basetype
	skips = []
	for m in c.getMethods():
		try:
			newtype = str(m.getDeclaringClass())
			if newtype != basetype:
				basetype = newtype
				result +=  "\nFrom Type:   %s\n" % basetype
			mods = []
			if m.getModifiers() & reflect.Member.PUBLIC:
				mods.append('public')
			for a in m.getTypeParameters():
				mods.append(str(a))
			rt = str(m.getReturnType())
			if len(rt)<30:
				mods.append(rt)
			mods.append(m.getName())
			pt = []
			for p in m.getParameterTypes():
				pt.append(str(p))
			skips.append(m.getName())
			result += "  M: %s(%s)\n" % (" ".join(mods), ",".join(pt))
			if len(rt)>=30:
				result += "    returns %s\n" % rt
		except Exception:
			pass
	for f in c.getFields():
		try:
			newtype = str(f.getDeclaringClass())
			if newtype != basetype:
				basetype = newtype
				result += "\nFrom Type:   %s\n" % basetype
			anno = []
			for a in f.getAnnotations():
				anno.append(str(a))
			anno.append(str(f.getType()))
			anno.append(f.getName())
			skips.append(f.getName())
			result += "  F: %s\n" % (" ".join(anno))
		except Exception:
			pass
	result += "\nFrom python dir():\n"
	for x in dir(obj):
		if x not in skips:
			try:
				if callable(getattr(obj,x)):
					result += "  Method     %s %s\n" % (x, type(getattr(obj,x)))
				else:
					y = getattr(obj, x)
					result += "  Property   %s %s %s\n" % (x, type(y), y)
			except:
				result += "  Unreadable %s\n" % x
	return result
10 Likes

There is also the Ignition SDK Programmers Guide where they have a lot of information on the behind the scenes of the objects in Ignition.
They have a JavaDocs for Ignition v7.8 and for v7.9 there, which I oftentimes found very useful.

Hey @pturmel, I’m using 8.1.5, vision, and couldn’t get this to work (returned nothing) unless I removed the first try/except.

I’m calling using a button actionPerformed to text area:

obj = event.source.parent.getComponent('Button')
result = shared.inspect.introspect(obj)
event.source.parent.getComponent('Text Area').text = result

I guess it really doesn’t matter if I removed the try/except, but curious if you knew why.

No idea. Haven’t had to use it in a while. Might play later.

FWIW you can use dot-completion in the interactive interpreter (right-pane) of script console to popup list of methods for an object after executing script in left-pane.

Phil’s (@pturmel) tool is cool!

2 Likes

How would you use that for a button component, for example?