Skip to main content

Visualization of SDyPy models and results

Project description

The Plotter3D is a wrapper around the pyvista.BackgroundPlotter with some added functionality around convenient simplifications for use in structural dynamics.

Basic usage

import sdypy as sd

nodes = ... # Finite element nodes
elements ... # Finite elements

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements)
plotter.show(show_grid=True, show_axes=True)

To animate a mode shape:

mode_shape = ... # Shape (n_nodes, 3)

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements, animate=mode_shape)

To animate according to a time history:

time_history = ... # Shape (n_nodes, 3, n_timesteps)

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements, animate=time_history)

To color the mesh according to a norm of the mode_shape:

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements, animate=mode_shape, field="norm")

Here, if field="norm" is passed, the mesh will be colored according to the norm of the mode_shape (or more generally, according to the norm of the animate argument). To color the mesh according to an arbitrary field, the field argument must be of shape (n_nodes, n_timesteps).

Animation

The Plotter3D class also enables the user to animate the mesh. There are two way to animate the FEM mesh or points:

  • By passing a 3D array of shape (n_nodes, 3, n_timesteps) to the animate argument. The points/nodes will be animated according to the time history.

  • By passing a 2D array of shape (n_nodes, 3) to the animate argument. The animate defines the maximum displacement of the nodes. The animation is interpolated with a sine function.

The animate argument can also have the following shapes:

  • (n_nodes*3): The Plotter3D will automatically convert this to (n_nodes, 3).

  • (n_nodes*3, n_timesteps): The Plotter3D will automatically convert this to (n_nodes, 3, n_timesteps).

  • (n_nodes*N): The Plotter3D will automatically convert this to (n_nodes, 3), where N is an arbitrary number. Only the first 3 columns are used. This is useful when animating e.g. a mode shape of a shell (each node has 6 DOF).

  • (n_nodes*N, n_timesteps): The Plotter3D will automatically convert this to (n_nodes, 3, n_timesteps). Similar to previous point, but with time history.

The n_frames is set to 100 by default, but can be changed to alter the number of frames per one iteration. When providing the time history, the n_frames should match the last dimension of the animate argument.

Here is an example of animating a mode shape:

import sdypy as sd

nodes = ... # Finite element nodes (n_nodes, 3)
elements ... # Finite elements (n_elements, n_nodes_per_element)
mode_shape = ... # Mode shape (n_nodes, 3)

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements, animate=mode_shape, field="norm")

plotter.configure_animation(interval=20) # To adjust the interval and camera position
plotter.start_animation() # Optional. To immediately start the animation. Otherwise, the controls are available in the plotter.
plotter.show()

Recording a GIF

To record a GIF, the configure_gif_recorder method must be called. Example:

import sdypy as sd

nodes = ... # Finite element nodes (n_nodes, 3)
elements ... # Finite elements (n_elements, n_nodes_per_element)
mode_shape = ... # Mode shape (n_nodes, 3)

plotter = sd.view.Plotter3D(nodes, elements)

plotter.gif_recorder("mode_shape.gif") # MUST BE CALLED BEFORE THE ANIMATION STARTS

plotter.add_fem_mesh(nodes, elements, animate=mode_shape, field="norm")

plotter.configure_gif_recorder('mode_shape.gif', fps=30) # Configure the GIF recorder

plotter.show()

The recording will start on pressing the “Record” button in the toolbar. Alternatively, the configure_gif_recorder can be called like this:

plotter.configure_gif_recorder('mode_shape.gif', fps=30, start_on_play=True)

This will start the recording when the animation starts. To start the animation, call the start_animation method or press the “Play” button in the toolbar.

The recording will last for 1 iteration of the animation.

Adding custom toolbar buttons

To add custom toolbar commands, use the configure_toolbar method. Example:

import sdypy as sd

nodes = ... # Finite element nodes (n_nodes, 3)
elements ... # Finite elements (n_elements, n_nodes_per_element)
mode_shape = ... # Mode shape (n_nodes, 3)

plotter = sd.view.Plotter3D(nodes, elements)
plotter.add_fem_mesh(nodes, elements, animate=mode_shape, field="norm")

def custom_command():
    print("Custom command")

toolbar_actions = {
    "Custom command": custom_command
}

plotter.configure_toolbar(toolbar_actions)

plotter.show()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sdypy_view-0.1.1.tar.gz (21.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sdypy_view-0.1.1-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file sdypy_view-0.1.1.tar.gz.

File metadata

  • Download URL: sdypy_view-0.1.1.tar.gz
  • Upload date:
  • Size: 21.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for sdypy_view-0.1.1.tar.gz
Algorithm Hash digest
SHA256 89fb8d6093ec96ceaed2b7d987add0223314a4b417d6ad768302d264d8915002
MD5 d203b1957b7186734a7e18d4e3c9203e
BLAKE2b-256 fcc86ebe3b7b583fbd13739503386a047a25282e159661bd0af35c3b3dee3de1

See more details on using hashes here.

File details

Details for the file sdypy_view-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: sdypy_view-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for sdypy_view-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 63548edb601bc064ccc16e97159f4f3862100fb887a884d56cdcdbbb82e896e6
MD5 ad65ffc847b09afdd7cfb0f94a8c07a5
BLAKE2b-256 72397b33c6d72f8df6cdf65a9186b11415c45c145c7033e42f08e7c7cafc8691

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page