Note
Go to the end to download the full example code
Card#
This example shows how to create a card and use a sprite sheet to update the image in the card.
First, some imports.
import os
from tempfile import TemporaryDirectory as InTemporaryDirectory
from fury import ui, window
from fury.data import fetch_viz_icons
from fury.io import load_image, load_sprite_sheet, save_image
First we need to fetch some icons that are included in FURY.
TARGET_FPS = 15
FRAME_TIME = (1.0 / TARGET_FPS) * 1000
fetch_viz_icons()
sprite_sheet = load_sprite_sheet('https://raw.githubusercontent.com/fury-gl/'
'fury-data/master/unittests/fury_sprite.png',
5, 5)
CURRENT_SPRITE_IDX = 0
vtk_sprites = []
Let’s create a card and add it to the show manager
img_url = "https://raw.githubusercontent.com/fury-gl"\
"/fury-communication-assets/main/fury-logo.png"
title = "FURY"
body = "FURY - Free Unified Rendering in pYthon."\
"A software library for scientific visualization in Python."
card = ui.elements.Card2D(image_path=img_url, title_text=title,
body_text=body,
image_scale=0.55, size=(300, 300),
bg_color=(1, 0.294, 0.180),
bg_opacity=0.8, border_width=5,
border_color=(0.1, 0.4, 0.8))
Now we define the callback to update the image on card after some delay.
def timer_callback(_obj, _evt):
global CURRENT_SPRITE_IDX, show_manager
CURRENT_SPRITE_IDX += 1
sprite = vtk_sprites[CURRENT_SPRITE_IDX % len(vtk_sprites)]
card.image.set_img(sprite)
i_ren = show_manager.scene.GetRenderWindow()\
.GetInteractor().GetInteractorStyle()
i_ren.force_render()
Lets create a function to convert the sprite to vtkImageData
def sprite_to_vtk():
with InTemporaryDirectory() as tdir:
for idx, sprite in enumerate(list(sprite_sheet.values())):
sprite_path = os.path.join(tdir, f'{idx}.png')
save_image(sprite, sprite_path, compression_quality=100)
vtk_sprite = load_image(sprite_path, as_vtktype=True)
vtk_sprites.append(vtk_sprite)
Now that the card has been initialised, we add it to the show manager.
current_size = (1000, 1000)
show_manager = window.ShowManager(size=current_size,
title="FURY Card Example")
show_manager.scene.add(card)
show_manager.initialize()
Converting numpy array sprites to vtk images
sprite_to_vtk()
Adding a timer to update the card image
show_manager.add_timer_callback(True, int(FRAME_TIME), timer_callback)
# To interact with the UI, set interactive = True
interactive = False
if interactive:
show_manager.start()
window.record(show_manager.scene, out_path="card_ui.png", size=(1000, 1000))