I’m trying to dynamically load templates via button press; I would like the button to show only if a template exists before loading it into a template holder
I’ve figured out that I can “load” a non-existent template into a hidden template holder, then run .getLoadedTemplate(), which will return None if it doesn’t exist… but that seems like an awfully hacky way around this problem
Any ideas?
Thanks!
This should get you started:
p = event.source.getAppContext().getProject() #Get project reference from a vision component.
_res = p.getResourcesOfType("fpmi","component-template") #Get a list of all templates
for res in _res: #Loop through resource list
print p.getFolderPath(res.resourceId) #Print the path of all templates. You could match here or something. Maybe make a list when the window first opens, and compare "return "templatename" in listoftemplates
3 Likes
Yes! That is exactly what I need
I kind of forgot about getResourcesOfType and that. I made a post where a few of the Ignition gurus helped me iterate through templates, that was back in October last year, and when I was still brand new to Ignition. Could have gotten it from there but I didn’t even think about that.
Thank you!
Note that you’ll have to change that code completely once you upgrade to 8.0+ - the entire project interface changed to accommodate resources on the filesystem.
1 Like
Thanks for the heads-up. Fortunately we have a staging environment and even if this functionality can’t be duplicated, it would be easy enough to create a fallback
But definitely something that needs to be considered
In my case I was using global templates, updated first line to
p = event.source.getAppContext().getGlobalProject().getProject()
big up
Here’s the updated version for 8.0:
from com.inductiveautomation.ignition.common.project.resource import ResourceType
from com.inductiveautomation.vision.api.client import VisionClientInterface
project = event.source.getAppContext().getProject() #Get project reference from a vision component.
resource_type = ResourceType(VisionClientInterface.VISION_MODULE_ID, 'templates')
resources = project.getResourcesOfType(resource_type) #Get a list of all templates
paths = [str(resource.getResourcePath()) for resource in resources]
if 'com.inductiveautomation.vision/templates/foo' in paths:
print 'template exists'
2 Likes
com.inductiveautomation.factorypmi.application.model.TemplateManager#RESOURCE_TYPE is the constant for the template resource type, if you want to use that instead of building your own.
1 Like
Yeah that cleans it up a bit, thanks
def template_exists(template_name):
"""
Syntax: template_exists(template_name)
Parameter:
template_name: A string of the template's name. If in a directory prefix with the directory name: path/to/template
Return Type: This method returns a Boolean value of class bool. This method returns True if the template exists otherwise returns False.
"""
from com.inductiveautomation.factorypmi.application.model import TemplateManager
context = event.source.getAppContext()
project = context.getProject()
resources = project.getResourcesOfType(TemplateManager(context).RESOURCE_TYPE)
paths = [str(resource.getResourcePath()) for resource in resources]
if 'com.inductiveautomation.vision/templates/' + template_name in paths:
return True
return False
print template_exists('foo')
As long as we’re golfing, this should also work and be marginally more efficient (short circuits, plus doesn’t build a list in memory):
def template_exists(template_path):
"""
Syntax: template_exists(template_path)
Parameter:
template_path: A string of the template's name. If in a directory prefix with the directory name: path/to/template
Return Type: This method returns a Boolean value of class bool. This method returns True if the template exists otherwise returns False.
"""
from com.inductiveautomation.factorypmi.application.model import TemplateManager
context = event.source.getAppContext()
project = context.getProject()
resources = project.getResourcesOfType(TemplateManager.RESOURCE_TYPE)
return any(template_path in resource.folderPath for resource in resources)
print template_exists('foo')
1 Like
You win; I’m handing over the solution point. Kudos on the use of any, every time I see that guy I remind myself I should be using it more
Nice improvements in readability and performance
1 Like