Skip to content

visualdynamics.core.tables

tables

What an object reads as, as a table: headers and rows of text.

The app has table models — editable, coloured, unit-aware, and Qt to the core. This is the other kind: the read-only rendering that goes in a report, and that a script wants when it asks what is in a channel table without opening a window.

One implementation, because the report and a script asking the same question must not answer it differently.

Functions:

Name Description
table_of

(headers, rows) for an object that reads as a table, else None.

Functions:

table_of

table_of(
    obj: Any,
) -> tuple[list[str], list[list[str]]] | None

(headers, rows) for an object that reads as a table, else None.

A shape set is its identified modal parameters; a channel table is its instrumentation. Everything is text, formatted the way it is read rather than the way it is stored — a damping of 0.0213 is '2.130' percent, because that is the number an engineer quotes.

Source code in src/visualdynamics/core/tables.py
def table_of(obj: Any) -> tuple[list[str], list[list[str]]] | None:
    """(headers, rows) for an object that reads as a table, else None.

    A shape set is its identified modal parameters; a channel table is
    its instrumentation. Everything is text, formatted the way it is
    read rather than the way it is stored — a damping of 0.0213 is
    '2.130' percent, because that is the number an engineer quotes.
    """
    from .channel_table import ChannelTable
    from .shapes import ShapeSet

    if isinstance(obj, ShapeSet):
        return (['Mode', 'Frequency [Hz]', 'Damping [%]', 'Description'],
                [[str(m + 1), f'{float(obj.frequency[m]):.4f}',
                  f'{float(obj.damping[m]) * 100:.3f}', obj.description[m]]
                 for m in range(obj.num_shapes)])
    if isinstance(obj, ChannelTable):
        # every column, because the schema is already the curated set:
        # a Rattlesnake save's coupling and feedback wiring stop at the
        # importer now, so there is no acquisition plumbing left here to
        # cut and no second list to keep in step with the first
        from .channel_table import title_of

        names = obj.column_names
        return ([title_of(name) for name in names],
                [[str(obj[name][r]) for name in names]
                 for r in range(obj.num_channels)])
    return None