# Ideal way to display objects on a screen

**URL:** <https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575>\
**Category:** Ignition\
**Tags:** perspective\
**Created:** [December 16, 2020, 5:17pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575 "2020-12-16T17:17:37Z")\
**Posts on this page:** 19\
**Page:** 1

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 5:17pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/1 "2020-12-16T17:17:37Z")

</div>

Let’s say I have a large object on a components.custom property and want to display it, how would some of you do this? When I bind the object to a Label it’s quite hard to read.

I’d like to see the object in runtime in this format:  
 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/f/cf0bb26406a7eb94fcaded2df28dae92ea950906.png)

Any ideas or suggestions?

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 16, 2020, 5:33pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/3 "2020-12-16T17:33:38Z")

</div>

Markdown component paired with the [`jsonFormat`](https://docs.inductiveautomation.com/display/DOC81/jsonFormat) expression would be ideal, although I confess I’m not positive the expression will directly work with perspective objects at present. If that fails, you could do the same thing, but with Python’s builtin `pprint` module instead; the script transform would just be:

```python
import pprint
return pprint.pformat(value)

```

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 6:04pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/4 "2020-12-16T18:04:22Z")

</div>

> [@paul-griffith](#):
>
> import pprint return  
> pprint.pprint(value)

This is returning null for me in 8.1.1.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 16, 2020, 6:21pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/5 "2020-12-16T18:21:00Z")

</div>

Oh, right. `pprint` automatically dumps to `stdout`. You want `pprint.pformat`:  
[https://docs.python.org/2.7/library/pprint.html#pprint.pformat](https://docs.python.org/2.7/library/pprint.html#pprint.pformat)

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 6:29pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/6 "2020-12-16T18:29:32Z")

</div>

Doens’t return null 🙂 but returns a single line string ☹  
Using jsonFormat() expression seems to give me the format I want in the markdown.source viewer but onscreen it looks like a single line string.

I tried using json.dumps but that seems to create another set of issues in the Transform but works fine in the Script Console. 🤔

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 16, 2020, 7:16pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/7 "2020-12-16T19:16:23Z")

</div>

`"```\n" + jsonFormat({value}) + "\n```"` in an expression transform works pretty well, although it’s reading the nested props as QVs…  
 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/f/5/f51b0218b6ad21d53dec0e733f5238981c94a7ad.png)

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 7:29pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/8 "2020-12-16T19:29:10Z")

</div>

> [@paul-griffith](#):
>
> although it’s reading the nested props as QVs…

That's odd but it beats anything else thus far. Thanks @paul-griffith

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 16, 2020, 7:30pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/9 "2020-12-16T19:30:23Z")

</div>

For something you can use in a script transform (though you should probably put this into a project scoped script). Also, make sure you only attempt to use it from Perspective contexts:

````python
	from com.inductiveautomation.ignition.common import TypeUtilities
	from com.inductiveautomation.perspective.common import PerspectiveModule
	
	gson = PerspectiveModule.createPerspectiveCompatibleGson()
	json = TypeUtilities.pyToGson(value, gson)
	
	return "```\n{}\n```".format(gson.toJson(json))

````

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/7/a/7addb5ba9e8ed61bd5b35bab5622ae0d589ac4f6.png)

The triple backtick surrounds are to tell the Markdown component that it’s preformatted text, and thus to preserve line breaks and render with a monospaced font - just like code blocks on the forum.

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 7:36pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/10 "2020-12-16T19:36:17Z")

</div>

I put it in the project library scripts and it works from the script console but when I call it from the markdown.source transform, I get `ImportError: No module named perspective`

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [December 16, 2020, 7:41pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/11 "2020-12-16T19:41:42Z")

</div>

A project library called `format`, defined as:

````auto
from com.inductiveautomation.ignition.common import TypeUtilities
from com.inductiveautomation.perspective.common import PerspectiveModule

gson = PerspectiveModule.createPerspectiveCompatibleGson()

def json(value):
	json = TypeUtilities.pyToGson(value, gson)
	return "```\n{}\n```".format(gson.toJson(json))

````

Is working for me, in both the script console and a design session:

 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/0/c0d5c5eca234ae55b1217a4b91bddabf647441fa.png)

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 16, 2020, 8:04pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/12 "2020-12-16T20:04:00Z")

</div>

Mimicked your setup but same import error… I’ll have to circle back around to this tomorrow and try again.

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [December 22, 2020, 4:59pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/13 "2020-12-22T16:59:27Z")

</div>

Wondering if I'm experiencing an issue with 8.1.1-STABLE that is not present in the version you're running?

Can't seem to get around the import error from this line:

> [@paul-griffith](#):
>
> from com.inductiveautomation.perspective.common import PerspectiveModule

Error reported:  
`ImportError: No module named perspective`

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 4, 2021, 5:56pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/14 "2021-01-04T17:56:16Z")

</div>

Where are you running your code?

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [January 5, 2021, 1:22pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/15 "2021-01-05T13:22:07Z")

</div>

markdown.props.source

---

<div class="post-metadata">

**Author:** ![Jonathan](https://avatars.discourse-cdn.com/v4/letter/j/aeb1de/32.png) [@Jonathan](https://forum.inductiveautomation.com/u/Jonathan)\
**Post date:** [February 2, 2021, 7:17pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/16 "2021-02-02T19:17:18Z")

</div>

I am getting the same error about not being able to import perspective module in the property binding transform of the mark down component source.

---

<div class="post-metadata">

**Author:** ![Kevin.Herron](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/kevin.herron/32/7259_2.png) [@Kevin.Herron](https://forum.inductiveautomation.com/u/Kevin.Herron)\
**Post date:** [February 2, 2021, 7:21pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/17 "2021-02-02T19:21:26Z")

</div>

I assume this only worked for @paul-griffith because he was running Ignition in the IDE…

---

<div class="post-metadata">

**Author:** ![code\_skin](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@code\_skin](https://forum.inductiveautomation.com/u/code_skin)\
**Post date:** [February 2, 2021, 7:31pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/18 "2021-02-02T19:31:38Z")

</div>

Another solution, which involved more scripting, is to use the Tree component to display your JSON/Document data.

---

<div class="post-metadata">

**Author:** ![Jonathan](https://avatars.discourse-cdn.com/v4/letter/j/aeb1de/32.png) [@Jonathan](https://forum.inductiveautomation.com/u/Jonathan)\
**Post date:** [February 2, 2021, 7:36pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/19 "2021-02-02T19:36:02Z")

</div>

I went with the expression transform approach. Thanks.

---

<div class="post-metadata">

**Author:** ![ryanjmclaughlin](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/ryanjmclaughlin/32/4318_2.png) [@ryanjmclaughlin](https://forum.inductiveautomation.com/u/ryanjmclaughlin)\
**Post date:** [February 9, 2021, 1:21pm UTC](https://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575/20 "2021-02-09T13:21:34Z")

</div>

Here is a way to do it without using an expression. @paul-griffith can comment if there is anything bad here, but avoids the use of the other library that can’t be imported.

````auto
def toDict(perspective_object):
	"""Formats a perspective object as Dict
	
	Adapted from http://forum.inductiveautomation.com/t/ideal-way-to-display-objects-on-a-screen/41575

	Args:
		perspective_object: A perspective property object
	"""
	from com.inductiveautomation.ignition.common import TypeUtilities
	
	# Convert the Perspective property object to Gson and back to a Py Object
	return TypeUtilities.gsonToPy(TypeUtilities.pyToGson(perspective_object))
	
	
def toMarkdown(perspective_object, indent=3):
		"""Formats a perspective object as Markdown
	
		Args:
			perspective_object: A perspective property object
		"""
		from json import dumps
		json_string = dumps(toDict(perspective_object), indent=indent)
		return "```\n{}\n```".format(json_string)

````
