diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index dac8bc44a5b..aa04ffce993 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -228,6 +228,7 @@ def load_labware( ) ) # FIXME(jbl, 2023-08-14) validating after loading the object issue + validation.ensure_labware_is_loadable(load_result.definition, load_location) validation.ensure_definition_is_labware(load_result.definition) # FIXME(mm, 2023-02-21): diff --git a/api/src/opentrons/protocol_api/validation.py b/api/src/opentrons/protocol_api/validation.py index 630211e9ac6..a9e595fd204 100644 --- a/api/src/opentrons/protocol_api/validation.py +++ b/api/src/opentrons/protocol_api/validation.py @@ -17,7 +17,7 @@ from opentrons_shared_data.labware.labware_definition import LabwareRole from opentrons_shared_data.pipette.types import PipetteNameType from opentrons_shared_data.robot.types import RobotType - +from opentrons.protocol_engine.types import LabwareLocation, NonStackedLocation from opentrons.protocols.api_support.types import APIVersion, ThermocyclerStep from opentrons.protocols.api_support.util import APIVersionError from opentrons.protocols.models import LabwareDefinition @@ -83,6 +83,10 @@ class LabwareDefinitionIsNotLabwareError(ValueError): """An error raised when a labware is not loaded using `load_labware`.""" +class LabwareDefinitionIsNotLoadableOnPosition(ValueError): + """An error raised when a labware is not able to be loaded at the location.""" + + class InvalidTrashBinLocationError(ValueError): """An error raised when attempting to load trash bins in invalid slots.""" @@ -253,6 +257,20 @@ def ensure_definition_is_labware(definition: LabwareDefinition) -> None: ) +def ensure_labware_is_loadable( + definition: LabwareDefinition, location: LabwareLocation +) -> None: + """Ensure that one of the definition's allowed roles is `stackableOnly` and that the location is a `NonStackedLocation`.""" + if ( + definition.allowedRoles + and LabwareRole.stackableOnly in definition.allowedRoles + and isinstance(location, NonStackedLocation) + ): + raise LabwareDefinitionIsNotLoadableOnPosition( + f"Labware {definition.parameters.loadName} cannot be loaded on {location}." + ) + + _MODULE_ALIASES: Dict[str, ModuleModel] = { "magdeck": MagneticModuleModel.MAGNETIC_V1, "magnetic module": MagneticModuleModel.MAGNETIC_V1, diff --git a/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json b/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json index 775596e7386..38a7dfbe1af 100644 --- a/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json +++ b/shared-data/labware/definitions/2/nest_96_wellplate_2ml_deep/2.json @@ -1130,6 +1130,11 @@ "x": 0, "y": 0, "z": 16.1 + }, + "evo_flex_96_tiprack_adapter": { + "x": 0, + "y": 0, + "z": 102 } }, "stackingOffsetWithModule": { diff --git a/shared-data/labware/definitions/2/opentrons_evo_96_wellplate_300ul/1.json b/shared-data/labware/definitions/2/opentrons_evo_96_wellplate_300ul/1.json new file mode 100644 index 00000000000..2530efe5fdb --- /dev/null +++ b/shared-data/labware/definitions/2/opentrons_evo_96_wellplate_300ul/1.json @@ -0,0 +1,1025 @@ +{ + "ordering": [ + ["A1", "B1", "C1", "D1", "E1", "F1", "G1", "H1"], + ["A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2"], + ["A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3"], + ["A4", "B4", "C4", "D4", "E4", "F4", "G4", "H4"], + ["A5", "B5", "C5", "D5", "E5", "F5", "G5", "H5"], + ["A6", "B6", "C6", "D6", "E6", "F6", "G6", "H6"], + ["A7", "B7", "C7", "D7", "E7", "F7", "G7", "H7"], + ["A8", "B8", "C8", "D8", "E8", "F8", "G8", "H8"], + ["A9", "B9", "C9", "D9", "E9", "F9", "G9", "H9"], + ["A10", "B10", "C10", "D10", "E10", "F10", "G10", "H10"], + ["A11", "B11", "C11", "D11", "E11", "F11", "G11", "H11"], + ["A12", "B12", "C12", "D12", "E12", "F12", "G12", "H12"] + ], + "brand": { + "brand": "opentrons_evo", + "brandId": [] + }, + "metadata": { + "displayName": "Opentrons_evo 96 Well Plate 300 µL", + "displayCategory": "wellPlate", + "displayVolumeUnits": "µL", + "tags": [] + }, + "dimensions": { + "xDimension": 127.75, + "yDimension": 86, + "zDimension": 34 + }, + "wells": { + "A1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 74.75, + "z": 2 + }, + "B1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 65.75, + "z": 2 + }, + "C1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 56.75, + "z": 2 + }, + "D1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 47.75, + "z": 2 + }, + "E1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 38.75, + "z": 2 + }, + "F1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 29.75, + "z": 2 + }, + "G1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 20.75, + "z": 2 + }, + "H1": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 14.38, + "y": 11.75, + "z": 2 + }, + "A2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 74.75, + "z": 2 + }, + "B2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 65.75, + "z": 2 + }, + "C2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 56.75, + "z": 2 + }, + "D2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 47.75, + "z": 2 + }, + "E2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 38.75, + "z": 2 + }, + "F2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 29.75, + "z": 2 + }, + "G2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 20.75, + "z": 2 + }, + "H2": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 23.38, + "y": 11.75, + "z": 2 + }, + "A3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 74.75, + "z": 2 + }, + "B3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 65.75, + "z": 2 + }, + "C3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 56.75, + "z": 2 + }, + "D3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 47.75, + "z": 2 + }, + "E3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 38.75, + "z": 2 + }, + "F3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 29.75, + "z": 2 + }, + "G3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 20.75, + "z": 2 + }, + "H3": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 32.38, + "y": 11.75, + "z": 2 + }, + "A4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 74.75, + "z": 2 + }, + "B4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 65.75, + "z": 2 + }, + "C4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 56.75, + "z": 2 + }, + "D4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 47.75, + "z": 2 + }, + "E4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 38.75, + "z": 2 + }, + "F4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 29.75, + "z": 2 + }, + "G4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 20.75, + "z": 2 + }, + "H4": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 41.38, + "y": 11.75, + "z": 2 + }, + "A5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 74.75, + "z": 2 + }, + "B5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 65.75, + "z": 2 + }, + "C5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 56.75, + "z": 2 + }, + "D5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 47.75, + "z": 2 + }, + "E5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 38.75, + "z": 2 + }, + "F5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 29.75, + "z": 2 + }, + "G5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 20.75, + "z": 2 + }, + "H5": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 50.38, + "y": 11.75, + "z": 2 + }, + "A6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 74.75, + "z": 2 + }, + "B6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 65.75, + "z": 2 + }, + "C6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 56.75, + "z": 2 + }, + "D6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 47.75, + "z": 2 + }, + "E6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 38.75, + "z": 2 + }, + "F6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 29.75, + "z": 2 + }, + "G6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 20.75, + "z": 2 + }, + "H6": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 59.38, + "y": 11.75, + "z": 2 + }, + "A7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 74.75, + "z": 2 + }, + "B7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 65.75, + "z": 2 + }, + "C7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 56.75, + "z": 2 + }, + "D7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 47.75, + "z": 2 + }, + "E7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 38.75, + "z": 2 + }, + "F7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 29.75, + "z": 2 + }, + "G7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 20.75, + "z": 2 + }, + "H7": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 68.38, + "y": 11.75, + "z": 2 + }, + "A8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 74.75, + "z": 2 + }, + "B8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 65.75, + "z": 2 + }, + "C8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 56.75, + "z": 2 + }, + "D8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 47.75, + "z": 2 + }, + "E8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 38.75, + "z": 2 + }, + "F8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 29.75, + "z": 2 + }, + "G8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 20.75, + "z": 2 + }, + "H8": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 77.38, + "y": 11.75, + "z": 2 + }, + "A9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 74.75, + "z": 2 + }, + "B9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 65.75, + "z": 2 + }, + "C9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 56.75, + "z": 2 + }, + "D9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 47.75, + "z": 2 + }, + "E9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 38.75, + "z": 2 + }, + "F9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 29.75, + "z": 2 + }, + "G9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 20.75, + "z": 2 + }, + "H9": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 86.38, + "y": 11.75, + "z": 2 + }, + "A10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 74.75, + "z": 2 + }, + "B10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 65.75, + "z": 2 + }, + "C10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 56.75, + "z": 2 + }, + "D10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 47.75, + "z": 2 + }, + "E10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 38.75, + "z": 2 + }, + "F10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 29.75, + "z": 2 + }, + "G10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 20.75, + "z": 2 + }, + "H10": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 95.38, + "y": 11.75, + "z": 2 + }, + "A11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 74.75, + "z": 2 + }, + "B11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 65.75, + "z": 2 + }, + "C11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 56.75, + "z": 2 + }, + "D11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 47.75, + "z": 2 + }, + "E11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 38.75, + "z": 2 + }, + "F11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 29.75, + "z": 2 + }, + "G11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 20.75, + "z": 2 + }, + "H11": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 104.38, + "y": 11.75, + "z": 2 + }, + "A12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 74.75, + "z": 2 + }, + "B12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 65.75, + "z": 2 + }, + "C12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 56.75, + "z": 2 + }, + "D12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 47.75, + "z": 2 + }, + "E12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 38.75, + "z": 2 + }, + "F12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 29.75, + "z": 2 + }, + "G12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 20.75, + "z": 2 + }, + "H12": { + "depth": 54, + "totalLiquidVolume": 300, + "shape": "circular", + "diameter": 7, + "x": 113.38, + "y": 11.75, + "z": 2 + } + }, + "groups": [ + { + "metadata": { + "wellBottomShape": "v" + }, + "wells": [ + "A1", + "B1", + "C1", + "D1", + "E1", + "F1", + "G1", + "H1", + "A2", + "B2", + "C2", + "D2", + "E2", + "F2", + "G2", + "H2", + "A3", + "B3", + "C3", + "D3", + "E3", + "F3", + "G3", + "H3", + "A4", + "B4", + "C4", + "D4", + "E4", + "F4", + "G4", + "H4", + "A5", + "B5", + "C5", + "D5", + "E5", + "F5", + "G5", + "H5", + "A6", + "B6", + "C6", + "D6", + "E6", + "F6", + "G6", + "H6", + "A7", + "B7", + "C7", + "D7", + "E7", + "F7", + "G7", + "H7", + "A8", + "B8", + "C8", + "D8", + "E8", + "F8", + "G8", + "H8", + "A9", + "B9", + "C9", + "D9", + "E9", + "F9", + "G9", + "H9", + "A10", + "B10", + "C10", + "D10", + "E10", + "F10", + "G10", + "H10", + "A11", + "B11", + "C11", + "D11", + "E11", + "F11", + "G11", + "H11", + "A12", + "B12", + "C12", + "D12", + "E12", + "F12", + "G12", + "H12" + ] + } + ], + "parameters": { + "format": "96Standard", + "quirks": [], + "isTiprack": false, + "isMagneticModuleCompatible": false, + "loadName": "opentrons_evo_96_wellplate_300ul" + }, + "namespace": "opentrons", + "allowedRoles": ["stackableOnly"], + "version": 1, + "schemaVersion": 2, + "cornerOffsetFromSlot": { + "x": 0, + "y": 0, + "z": 0 + }, + "stackingOffsetWithLabware": { + "nest_96_wellplate_2ml_deep": { + "x": 0, + "y": 0, + "z": 20 + } + } +} diff --git a/shared-data/python/opentrons_shared_data/labware/labware_definition.py b/shared-data/python/opentrons_shared_data/labware/labware_definition.py index 3363c874c55..92f76a930b9 100644 --- a/shared-data/python/opentrons_shared_data/labware/labware_definition.py +++ b/shared-data/python/opentrons_shared_data/labware/labware_definition.py @@ -125,6 +125,7 @@ class LabwareRole(str, Enum): fixture = "fixture" adapter = "adapter" maintenance = "maintenance" + stackableOnly = "stackableOnly" lid = "lid"