Model Videos

Videos from a model can be extracted after the simulation has been completed. This functionality internally uses the orcaflex AVI video extraction functionality and can be used to extract multiple videos with different model views and video parameters for the same model

Defining video parameters

Video specification parameters can be defined using a sequence of qalx_orcaflexdata_models.VideoSpecification instances. Only start_time and `end_time are required parameters and default values are used for any unspecified specification parameters.

Note

The model_views parameter accepts an optional list of ModelView instances, and a video will be extracted for each one of these views. In the case that the model_views parameter is not specified, only a single video with the default model view will be extracted for that specific instance of VideoSpecification

from qalx_orcaflex import data_models as dm

view_1 = dm.ModelView(ViewName="Front view", ViewAzimuth=270.0)
view_2 = dm.ModelView(ViewName="Side view", ViewAzimuth=315.0)

video_parameters = dm.VideoSpecification(
    start_time=-8.0,
    end_time=16.0,
    width=600,
    height=600,
    codec="MRLE",
    model_views=[view_1, view_2]
)

Usage

The example below shows how to extract two videos per model in a batch, using a different azimuth

import OrcFxAPI as ofx

import qalx_orcaflex.data_models as dm
from qalx_orcaflex.core import ModelSource, OrcaFlexBatch, QalxOrcaFlex

qfx = QalxOrcaFlex()
batch_options = dm.BatchOptions(
    batch_queue="example-batch-queue",
    sim_queue="example-sim-queue",
)

with OrcaFlexBatch(name=f"My Hang-off Batch", session=qfx,
                   batch_options=batch_options) as batch:
    m = ofx.Model()
    line = m.CreateObject(ofx.otLine, "My Line")
    for end_b_x in range(40, 80, 10):
        line.EndBX = end_b_x
        hang_off = 250 - end_b_x
        hang_off_info = dm.RawInfo(
            key="Hang-off point",
            value=hang_off
        )
        view_1 = dm.ModelView(
            ViewName=f"Front of hang-off @ {hang_off}m",
            ViewSize=50.0,
            ViewCentre=[end_b_x, 0.0, -21.5],
            ViewAzimuth=270.0,
            ViewGamma=0.0,
            ViewElevation=0.0,
            Width=1500,
            Height=800,
            GraphicsMode="WireFrame",
        )
        view_2 = dm.ModelView(
            ViewName=f"Side of hang-off @ {hang_off}m",
            ViewSize=50.0,
            ViewCentre=[end_b_x, 0.0, -21.5],
            ViewAzimuth=315.0,
            ViewGamma=0.0,
            ViewElevation=0.0,
            Width=1500,
            Height=800,
            GraphicsMode="WireFrame",
        )
        current_speed = dm.ModelInfo(
            object_name="Environment",
            data_name="RefCurrentSpeed",
            alias="Current Speed"
        )
        load_case_info = dm.LoadCaseInfo(
            model_info=[current_speed],
            raw_info=[hang_off_info])
        video_specification = [
            dm.VideoSpecification(
                start_time=-8.0,
                end_time=16.0,
                model_views=[view_1, view_2]
            )
        ]
        batch.add(
            ModelSource(m, f"HangOff={hang_off}"),
            load_case_info=load_case_info,
            model_videos=[video_specification]
        )

Note

The model_videos parameter passed to the add method needs to be a sequence, e.g. a list even in the case that only one instance of ViewSpecification is passed

In the case that no model_views are specified one video will be extracted with the default model view. In the following example, one such instance of ViewSpecification is created, along with a second instance:

import OrcFxAPI as ofx

import qalx_orcaflex.data_models as dm
from qalx_orcaflex.core import ModelSource, OrcaFlexBatch, QalxOrcaFlex

qfx = QalxOrcaFlex()
batch_options = dm.BatchOptions(
    batch_queue="example-batch-queue",
    sim_queue="example-sim-queue",
)

with OrcaFlexBatch(name=f"My Hang-off Batch", session=qfx,
                   batch_options=batch_options) as batch:
    m = ofx.Model()
    line = m.CreateObject(ofx.otLine, "My Line")
    for end_b_x in range(40, 80, 10):
        line.EndBX = end_b_x
        hang_off = 250 - end_b_x
        hang_off_info = dm.RawInfo(
            key="Hang-off point",
            value=hang_off
        )
        current_speed = dm.ModelInfo(
            object_name="Environment",
            data_name="RefCurrentSpeed",
            alias="Current Speed"
        )
        load_case_info = dm.LoadCaseInfo(
            model_info=[current_speed],
            raw_info=[hang_off_info])
        video_spec_1 = dm.VideoSpecification(
            start_time=4.0,
            end_time=10.0,
        )
        view_1 = dm.ModelView(
            ViewName=f"Front of hang-off @ {hang_off}m",
            ViewSize=50.0,
            ViewCentre=[end_b_x, 0.0, -21.5],
        )
        video_spec_2 = dm.VideoSpecification(
            start_time=-8.0,
            end_time=16.0,
            model_views=[view_1]
        )
        batch.add(
            ModelSource(m, f"HangOff={hang_off}"),
            load_case_info=load_case_info,
            model_videos=[video_spec_1, video_spec_2]
        )

In this example, for each model in the for loop, two videos will be extracted. One video from 4.0 sec to 10.0 sec and the default model view and one video from -8.0 sec to 16.0 sec with the custom view_1 view

Download videos from a batch

Videos specified on a batch can be then downloaded as shown below

from qalx_orcaflex.core import QalxOrcaFlex

qfx = QalxOrcaFlex()

qfx.save_batch_videos(
    batch_name="My Hang-off Batch",
    save_dir=r"C:/Users/AnneAlysis/OFX/Hang-offBatch/Videos"
)

Extract videos from a sim file

In the case that you are interested in extracting a video from an existing simulation file(.sim), you can do this using the functionality of the Video Bot. A job can be send to the bot as shown below

from qalx_orcaflex.core import QalxOrcaFlex
from qalx_orcaflex.data_models import OrcaFlexJob, ModelView, VideoSpecification

qfx = QalxOrcaFlex()
# Add the required videos specification
model_view_1 = ModelView("View 1")
model_view_2 = ModelView("View 2", ViewAzimuth=100.0, ViewElevation=1.0)
model_view_3 = ModelView("View 3", ViewAzimuth=200.0, ViewElevation=-1.0)
model_videos = [
    VideoSpecification(
        start_time=-8.0,
        end_time=15.9,
        width=200,
        height=200,
        model_views=[model_view_1, model_view_2],
    ),
    VideoSpecification(
        start_time=-8.0,
        end_time=15.9,
        width=200,
        height=200,
        codec="XVID",
        model_views=[model_view_3],
    ),
]
# Add the sim file item
qalx_sim_item = qfx.item.add(source="/path/to/sim_file/simple_model.sim")
videos_job = OrcaFlexJob(model_videos=model_videos, sim_file=qalx_sim_item)
qfx.save_batch_videos(
    batch_name="My Hang-off Batch",
    save_dir=r"C:/Users/AnneAlysis/OFX/Hang-offBatch/Videos"
)
# Send the job to the queue named "video-queue-example"
video_set_guid = qfx.send_to_video_sim_queue(
    queue_name="video-queue-example", ofx_job=videos_job
)
# Once the video extraction process is complete, we can download the videos
qfx.save_job_videos(video_set_guid, "/path/to/save/location")