Workspaces and viewports#
Result Explorer allows you to create multiple workspaces, each with its own layout of viewports. A workspace is a collection of viewports that can display different views of the solution data. You can switch between workspaces to organize your analysis and visualization tasks.
Managing workspaces#
Using the Client object, you can list, create, rename, and delete workspaces.
# List all workspaces
workspaces = rx.list_workspaces()
# Create a new workspace
workspace = rx.create_workspace(name="Example Workspace")
# Create a workspace with a grid layout of 2 rows and 3 columns
workspace = rx.create_workspace(name="Grid Workspace", rows=2, cols=3)
# Delete a workspace
rx.delete_workspace(workspace)
The Workspace object allows you to:
Manage the viewports within that workspace, including creating new viewports and assigning views to them.
Enter full screen mode for a specific viewport to focus on a particular view.
Set synchronization options to link viewports together.
Managing viewports#
A workspace can contain multiple viewports, which you access through the Workspace.viewports attribute.
Each viewport can display a view of the solution data, and you can customize the display options for each viewport independently.
Accessing and assigning views#
You can list all viewports in a workspace and assign views to them:
# Get all viewports in a workspace
viewports = workspace.viewports
# Assign a view to a viewport
first_viewport = viewports[0]
first_viewport.set_view(displacement_view, wait=True)
# Or use the convenient shortcut to assign a view to the first viewport
viewport = workspace.assign_view(view=displacement_view, wait=True)
Describing the viewport layout#
The Workspace.layout attribute
describes where each viewport is positioned. Every layout is described as a grid of
rows and columns, and printing it shows a diagram of the current arrangement followed
by a legend of viewport IDs:
print(workspace.layout)
+---------------------+---------------------+
| [0] r0c0 | [1] r0c1 |
| | |
| | |
| +---------------------+
| | [2] r1c1 |
| | |
| | |
+---------------------+---------------------+
[0] ad661e90-4bf1-4df2-9f03-4f12e28b381e (row 0, column 0, 2x1 cells)
[1] fb469094-bdc8-4037-89fe-b193be36666e (row 0, column 1, 1x1 cells)
[2] 2be6dda3-1889-44d2-bbfb-4c59f28fa548 (row 1, column 1, 1x1 cells)
Viewports that are not part of a regular grid span several rows or columns. In the layout above, the first viewport spans both rows of the first column:
layout = workspace.layout
layout.grid_shape # (2, 2)
layout.is_grid # False
placement = layout.placement_of(viewport)
placement.row, placement.column # (0, 0)
placement.row_span, placement.column_span # (2, 1)
Each ViewportPlacement also
reports the fraction of the workspace that the viewport covers through its x,
y, width, and height attributes.
Accessing viewports by grid position#
Use Workspace.viewport_at
to access a viewport by its position. Rows are ordered from top to bottom and
columns are ordered from left to right, and both indexes start at zero.
A viewport that spans several cells is returned for each cell that it occupies.
workspace = rx.create_workspace(name="Grid Workspace", rows=2, cols=3)
# Assign a view to the lower-right viewport.
lower_right = workspace.viewport_at(row=1, column=2)
lower_right.set_view(displacement_view, wait=True)
# Get every viewport as rows of the grid.
grid = workspace.viewport_grid()
Creating and deleting viewports#
You can create new viewports by splitting existing ones in different directions:
from ansys.result_explorer.core.models import ViewportDirection
# Create a new viewport to the right of the first viewport
right_viewport = workspace.create_viewport(
viewport=viewports[0],
direction=ViewportDirection.VIEWPORT_DIRECTION_RIGHT,
)
# Create a new viewport below the first viewport
bottom_viewport = workspace.create_viewport(
viewport=viewports[0],
direction=ViewportDirection.VIEWPORT_DIRECTION_BOTTOM,
)
# Delete a viewport
workspace.delete_viewport(right_viewport)
Customizing viewport display options#
Each viewport has display options that you can customize independently:
# Access display options for a viewport
opts = viewport.display_options
# For plot viewports, customize visualization settings
opts.show_mesh_edges = True
opts.show_min_max_labels = True
# Set deformation scale and component
opts.result_options.deformation_scale = 2.0
opts.result_options.component_index = 0
# Batch multiple changes efficiently
with viewport.update_display_options() as opts:
opts.show_mesh_edges = True
opts.explode = True
opts.result_options.deformation_scale = 3.0
Display options are specific to the type of view being displayed in the viewport. For example, plot viewports have options for showing mesh edges and min/max labels, while chart viewports have options for hiding/showing the legend and data table.
Direct commit vs. batch update of display options#
When you assign a display option directly
(for example, opts.show_mesh_edges = True), it immediately commits the change
to the app. For multiple changes, use the viewport.update_display_options()
context manager to batch all updates into a single API call, which is more
efficient:
# Inefficient: 3 API calls
opts = viewport.display_options
opts.show_mesh_edges = True # API call 1
opts.explode = True # API call 2
opts.result_options.set_id = 3 # API call 3
# Efficient: 1 API call
with viewport.update_display_options() as opts:
opts.show_mesh_edges = True
opts.explode = True
opts.result_options.set_id = 3
Saving viewport snapshots#
You can save viewport visualizations as PNG images:
from ansys.result_explorer.core.models import SnapshotSettings
# Save a snapshot with default settings
viewport.save_snapshot("displacement_view.png")
# Save with custom snapshot settings
settings = SnapshotSettings(
height=600,
width=800,
show_time_stamp=False,
show_logo=True,
show_legend=True,
show_solution_name=False,
show_result_picker=True,
transparent_background=False,
background_color="#FFFFFF",
)
viewport.save_snapshot("displacement_view_custom.png", settings=settings)