Skip to main content

My Virtual Rig (MVR) library for Python

Project description

python-mvr

Python library for MVR (My Virtual Rig). MVR is part of GDTF (General Device Type Format)

MVR specification as per https://gdtf.eu/mvr/prologue/introduction/

See source code for documentation. Naming conventions, in general, are identical to that on the GDTF, CamelCase is replaced with underscore_delimiters.

This library is used for example by BlenderDMX (BlenderDMX on GitHub).

GitHub Page, PyPi Page

Pytest Check links in markdown GitHub Tag

Status

  • Reading and Writing of most aspects of MVR 1.6 (DIN SPEC 15801:2023-12) should be covered.
  • MVR-xchange is not implemented in this library but full Python implementation exists in BlenderDMX and potentially could be moved here.

Installation

  • With uv:
uv add pymvr
  • With pip
pip install pymvr

Usage

Reading MVR

import pymvr
mvr_file = pymvr.GeneralSceneDescription("mvr_file.mvr")

for layer_index, layer in enumerate(mvr_file.scene.layers):
    ... #process data

Writing MVR

Load and Export an MVR

import pymvr
from pathlib import Path

# 1. Read MVR file
mvr_read = pymvr.GeneralSceneDescription("mvr_file.mvr")

# 2. Create a writer instance
mvr_writer = pymvr.GeneralSceneDescriptionWriter()

# 3. Serialize the scene object into the writer's XML root
mvr_read.scene.to_xml(parent=mvr_writer.xml_root)

# 4. Serialize the user_data object into the writer's XML root
mvr_read.user_data.to_xml(parent=mvr_writer.xml_root)

# 5. Add necesarry files like GDTF fixtures, trusses, 3D objects and so on
# Skipped in this example

# 6. Write the MVR file
output_path = Path("exported_mvr_file.mvr")
mvr_writer.write_mvr(output_path)

Creating a new MVR

import pymvr
from pathlib import Path

# 1. Create a writer instance
mvr_writer = pymvr.GeneralSceneDescriptionWriter()

# 2. Build the MVR object tree
# Create a scene object
scene_obj = pymvr.Scene()

# Create layers and add them to the scene
layers = pymvr.Layers()
scene_obj.layers = layers

# Create a layer and add it to the layers
layer = pymvr.Layer(name="Test layer")
layers.append(layer)

# Create a child list for the layer
child_list = pymvr.ChildList()
layer.child_list = child_list

# Create a fixture and add it to the child list
# Note: A valid fixture would require more attributes
fixture = pymvr.Fixture(name="Test Fixture")
child_list.fixtures.append(fixture)

# 3. Serialize the scene object into the writer's XML root
scene_obj.to_xml(parent=mvr_writer.xml_root)

# 4. Add any necessary files (like GDTF fixtures, trusses...) to the MVR archive
#    The list should contain tuples of (file_path, GDTF_file_name)
files_to_pack = []
if fixture.gdtf_spec:
    files_to_pack.append((fixture.gdtf_spec, fixture.gdtf_spec))
mvr_writer.files_list = list(set(files_to_pack))

# 5. Write the MVR file
output_path = Path("exported_mvr_file.mvr")
mvr_writer.write_mvr(output_path)

See BlenderDMX and tests for reference implementation and usage examples.

Changelog

See CHANGELOG for details.

Development

PRs appreciated. You can use uv to get the project setup by running:

uv sync

Format

  • To format, use ruff
uv run ruff format pymvr/*

Pre-commit hooks

  • You can use the pre-commit hooks
uv run pre-commit install

Testing

  • To test, use pytest
uv run pytest
  • To test typing with mypy use:
uv run pytest --mypy -m mypy pymvr/*py

Citation

If you use this library in your research, publication, or software project, please cite it as follows:

@software{pymvr2025,
  title        = {pyMVR: Python Library for My Virtual Rig},
  author       = {{OpenStage}},
  year         = {2025},
  version      = {1.0.1},
  url          = {https://github.com/open-stage/python-mvr}
}

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

pymvr-1.0.4-py3-none-any.whl (15.0 kB view details)

Uploaded Python 3

File details

Details for the file pymvr-1.0.4-py3-none-any.whl.

File metadata

  • Download URL: pymvr-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 15.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.13

File hashes

Hashes for pymvr-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 4126945e15b05b2443495a0c2fa39803859713288291490871a9a45c31d2f105
MD5 e4681ccad3952146372835d3f0558b5a
BLAKE2b-256 c727aab12298c910492a5dd04db66e733f6341acdcc252b991b3532ed92f1b80

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