Basic extension structureΒΆ

An extension starts as a subclass of labthings.extensions.BaseExtension. Each extension is described by a single BaseExtension instance, containing any number of methods, API views, and additional hardware components.

You will build your extension by subclassing labthings.extensions.BaseExtension, and adding the class to a top-level LABTHINGS_EXTENSIONS list.

In order to access the currently running microscope object, use the labthings.find_component() function, with the argument "org.openflexure.microscope". Likewise, any new components attached by other extensions can be found using their full name, as above.

A simple extension file, with no API views but application-available methods may look like:

from labthings import find_component
from labthings.extensions import BaseExtension

# Create the extension class
class MyExtension(BaseExtension):
    def __init__(self):
        # Superclass init function
        super().__init__("com.myname.myextension", version="0.0.0")

    def identify(self):
        Demonstrate access to, and Microscope.stage
        microscope = find_component("org.openflexure.microscope")

        response = (
            f"My name is {}. "
            f"My parent camera is {}, "
            f"and my parent stage is {microscope.stage}."

        return response

    def rename(self, new_name):
        Rename the microscope

        microscope = find_component("org.openflexure.microscope") = new_name


Once this extension is loaded, any other extensions will have access to your methods:

from labthings import find_extension

def test_extension_method():
    # Find your extension. Returns None if it hasn't been found.
    my_found_extension = find_extension("com.myname.myextension")

    # Call a function from your extension
    if my_found_extension: