mirror of
https://github.com/deepmodeling/Uni-Lab-OS
synced 2026-03-30 16:03:17 +00:00
Compare commits
4 Commits
a54e7c0f23
...
5c047beb83
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c047beb83 | ||
|
|
b40c087143 | ||
|
|
7f1cc3b2a5 | ||
|
|
3f160c2049 |
@@ -1,6 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import asyncio
|
import asyncio
|
||||||
import os
|
import os
|
||||||
|
import platform
|
||||||
import shutil
|
import shutil
|
||||||
import signal
|
import signal
|
||||||
import sys
|
import sys
|
||||||
@@ -358,7 +359,7 @@ def main():
|
|||||||
if BasicConfig.test_mode:
|
if BasicConfig.test_mode:
|
||||||
print_status("启用测试模式:所有动作将模拟执行,不调用真实硬件", "warning")
|
print_status("启用测试模式:所有动作将模拟执行,不调用真实硬件", "warning")
|
||||||
BasicConfig.communication_protocol = "websocket"
|
BasicConfig.communication_protocol = "websocket"
|
||||||
machine_name = os.popen("hostname").read().strip()
|
machine_name = platform.node()
|
||||||
machine_name = "".join([c if c.isalnum() or c == "_" else "_" for c in machine_name])
|
machine_name = "".join([c if c.isalnum() or c == "_" else "_" for c in machine_name])
|
||||||
BasicConfig.machine_name = machine_name
|
BasicConfig.machine_name = machine_name
|
||||||
BasicConfig.vis_2d_enable = args_dict["2d_vis"]
|
BasicConfig.vis_2d_enable = args_dict["2d_vis"]
|
||||||
|
|||||||
@@ -93,13 +93,13 @@ class PRCXI9300Deck(Deck):
|
|||||||
|
|
||||||
# T1-T16 默认位置 (4列×4行)
|
# T1-T16 默认位置 (4列×4行)
|
||||||
_DEFAULT_SITE_POSITIONS = [
|
_DEFAULT_SITE_POSITIONS = [
|
||||||
(0, 288, 0), (138, 288, 0), (276, 288, 0), (414, 288, 0), # T1-T4
|
(0, 0, 0), (138, 0, 0), (276, 0, 0), (414, 0, 0), # T1-T4
|
||||||
(0, 192, 0), (138, 192, 0), (276, 192, 0), (414, 192, 0), # T5-T8
|
(0, 96, 0), (138, 96, 0), (276, 96, 0), (414, 96, 0), # T5-T8
|
||||||
(0, 96, 0), (138, 96, 0), (276, 96, 0), (414, 96, 0), # T9-T12
|
(0, 192, 0), (138, 192, 0), (276, 192, 0), (414, 192, 0), # T9-T12
|
||||||
(0, 0, 0), (138, 0, 0), (276, 0, 0), (414, 0, 0), # T13-T16
|
(0, 288, 0), (138, 288, 0), (276, 288, 0), (414, 288, 0), # T13-T16
|
||||||
]
|
]
|
||||||
_DEFAULT_SITE_SIZE = {"width": 128.0, "height": 86, "depth": 0}
|
_DEFAULT_SITE_SIZE = {"width": 128.0, "height": 86, "depth": 0}
|
||||||
_DEFAULT_CONTENT_TYPE = ["plate", "tip_rack", "plates", "tip_racks", "tube_rack"]
|
_DEFAULT_CONTENT_TYPE = ["plate", "tip_rack", "plates", "tip_racks", "tube_rack", "adaptor"]
|
||||||
|
|
||||||
def __init__(self, name: str, size_x: float, size_y: float, size_z: float,
|
def __init__(self, name: str, size_x: float, size_y: float, size_z: float,
|
||||||
sites: Optional[List[Dict[str, Any]]] = None, **kwargs):
|
sites: Optional[List[Dict[str, Any]]] = None, **kwargs):
|
||||||
|
|||||||
@@ -175,7 +175,8 @@ class Registry:
|
|||||||
"res_id": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择
|
"res_id": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择
|
||||||
"device_id": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择
|
"device_id": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择
|
||||||
"parent": "unilabos_nodes", # 将当前实验室的设备/物料作为下拉框可选择
|
"parent": "unilabos_nodes", # 将当前实验室的设备/物料作为下拉框可选择
|
||||||
"class_name": "unilabos_class",
|
"class_name": "unilabos_class", # 当前实验室物料的class name
|
||||||
|
"slot_on_deck": "unilabos_resource_slot:parent", # 勾选的parent的config中的sites的name,展示name,参数对应slot(index)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"test_latency": {
|
"test_latency": {
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
import json
|
|
||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
|
|
||||||
from pylabrobot.resources import Container
|
from pylabrobot.resources import Container
|
||||||
from unilabos_msgs.msg import Resource
|
|
||||||
|
|
||||||
from unilabos.ros.msgs.message_converter import convert_from_ros_msg
|
|
||||||
|
|
||||||
|
|
||||||
class RegularContainer(Container):
|
class RegularContainer(Container):
|
||||||
@@ -16,12 +12,12 @@ class RegularContainer(Container):
|
|||||||
kwargs["size_y"] = 0
|
kwargs["size_y"] = 0
|
||||||
if "size_z" not in kwargs:
|
if "size_z" not in kwargs:
|
||||||
kwargs["size_z"] = 0
|
kwargs["size_z"] = 0
|
||||||
|
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
self.state = {}
|
|
||||||
super().__init__(*args, category="container", **kwargs)
|
super().__init__(*args, category="container", **kwargs)
|
||||||
|
|
||||||
def load_state(self, state: Dict[str, Any]):
|
def load_state(self, state: Dict[str, Any]):
|
||||||
self.state = state
|
super().load_state(state)
|
||||||
|
|
||||||
|
|
||||||
def get_regular_container(name="container"):
|
def get_regular_container(name="container"):
|
||||||
@@ -29,7 +25,6 @@ def get_regular_container(name="container"):
|
|||||||
r.category = "container"
|
r.category = "container"
|
||||||
return r
|
return r
|
||||||
|
|
||||||
#
|
|
||||||
# class RegularContainer(object):
|
# class RegularContainer(object):
|
||||||
# # 第一个参数必须是id传入
|
# # 第一个参数必须是id传入
|
||||||
# # noinspection PyShadowingBuiltins
|
# # noinspection PyShadowingBuiltins
|
||||||
@@ -89,4 +84,4 @@ def get_regular_container(name="container"):
|
|||||||
# return to_dict
|
# return to_dict
|
||||||
#
|
#
|
||||||
# def __str__(self):
|
# def __str__(self):
|
||||||
# return f"{self.id}"
|
# return f"{self.id}"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
|
|
||||||
EXTRA_CLASS = "unilabos_resource_class"
|
EXTRA_CLASS = "unilabos_resource_class"
|
||||||
|
FRONTEND_POSE_EXTRA = "unilabos_frontend_pose_extra"
|
||||||
EXTRA_SAMPLE_UUID = "sample_uuid"
|
EXTRA_SAMPLE_UUID = "sample_uuid"
|
||||||
EXTRA_UNILABOS_SAMPLE_UUID = "unilabos_sample_uuid"
|
EXTRA_UNILABOS_SAMPLE_UUID = "unilabos_sample_uuid"
|
||||||
|
|
||||||
@@ -74,6 +75,14 @@ class ResourceDictPositionObject(BaseModel):
|
|||||||
z: float = Field(description="Z coordinate", default=0.0)
|
z: float = Field(description="Z coordinate", default=0.0)
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceDictPoseExtraObjectType(BaseModel):
|
||||||
|
z_index: int
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceDictPoseExtraObject(BaseModel):
|
||||||
|
z_index: Optional[int] = Field(alias="zIndex", default=None)
|
||||||
|
|
||||||
|
|
||||||
class ResourceDictPositionType(TypedDict):
|
class ResourceDictPositionType(TypedDict):
|
||||||
size: ResourceDictPositionSizeType
|
size: ResourceDictPositionSizeType
|
||||||
scale: ResourceDictPositionScaleType
|
scale: ResourceDictPositionScaleType
|
||||||
@@ -100,6 +109,7 @@ class ResourceDictPosition(BaseModel):
|
|||||||
cross_section_type: Literal["rectangle", "circle", "rounded_rectangle"] = Field(
|
cross_section_type: Literal["rectangle", "circle", "rounded_rectangle"] = Field(
|
||||||
description="Cross section type", default="rectangle"
|
description="Cross section type", default="rectangle"
|
||||||
)
|
)
|
||||||
|
extra: Optional[ResourceDictPoseExtraObject] = Field(description="Extra data", default=None)
|
||||||
|
|
||||||
|
|
||||||
class ResourceDictType(TypedDict):
|
class ResourceDictType(TypedDict):
|
||||||
@@ -463,6 +473,7 @@ class ResourceTreeSet(object):
|
|||||||
"position3d": raw_pos,
|
"position3d": raw_pos,
|
||||||
"rotation": d["rotation"],
|
"rotation": d["rotation"],
|
||||||
"cross_section_type": d.get("cross_section_type", "rectangle"),
|
"cross_section_type": d.get("cross_section_type", "rectangle"),
|
||||||
|
"extra": extra.get(FRONTEND_POSE_EXTRA)
|
||||||
}
|
}
|
||||||
|
|
||||||
# 先构建当前节点的字典(不包含children)
|
# 先构建当前节点的字典(不包含children)
|
||||||
@@ -548,6 +559,7 @@ class ResourceTreeSet(object):
|
|||||||
name_to_uuid[node.res_content.name] = node.res_content.uuid
|
name_to_uuid[node.res_content.name] = node.res_content.uuid
|
||||||
all_states[node.res_content.name] = node.res_content.data
|
all_states[node.res_content.name] = node.res_content.data
|
||||||
name_to_extra[node.res_content.name] = node.res_content.extra
|
name_to_extra[node.res_content.name] = node.res_content.extra
|
||||||
|
name_to_extra[node.res_content.name][FRONTEND_POSE_EXTRA] = node.res_content.pose.extra
|
||||||
name_to_extra[node.res_content.name][EXTRA_CLASS] = node.res_content.klass
|
name_to_extra[node.res_content.name][EXTRA_CLASS] = node.res_content.klass
|
||||||
for child in node.children:
|
for child in node.children:
|
||||||
collect_node_data(child, name_to_uuid, all_states, name_to_extra)
|
collect_node_data(child, name_to_uuid, all_states, name_to_extra)
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 288,
|
"y": 0,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -83,11 +83,13 @@
|
|||||||
"depth": 0
|
"depth": 0
|
||||||
},
|
},
|
||||||
"content_type": [
|
"content_type": [
|
||||||
|
"container",
|
||||||
"plate",
|
"plate",
|
||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -96,7 +98,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 138,
|
"x": 138,
|
||||||
"y": 288,
|
"y": 0,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -109,7 +111,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -118,7 +121,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 276,
|
"x": 276,
|
||||||
"y": 288,
|
"y": 0,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -131,7 +134,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -140,6 +144,213 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 414,
|
"x": 414,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T5",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 96,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T6",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 138,
|
||||||
|
"y": 96,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T7",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 276,
|
||||||
|
"y": 96,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T8",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 414,
|
||||||
|
"y": 96,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T9",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 192,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T10",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 138,
|
||||||
|
"y": 192,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T11",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 276,
|
||||||
|
"y": 192,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T12",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 414,
|
||||||
|
"y": 192,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"width": 128.0,
|
||||||
|
"height": 86,
|
||||||
|
"depth": 0
|
||||||
|
},
|
||||||
|
"content_type": [
|
||||||
|
"plate",
|
||||||
|
"tip_rack",
|
||||||
|
"plates",
|
||||||
|
"tip_racks",
|
||||||
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "T13",
|
||||||
|
"visible": true,
|
||||||
|
"occupied_by": null,
|
||||||
|
"position": {
|
||||||
|
"x": 0,
|
||||||
"y": 288,
|
"y": 288,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
@@ -153,205 +364,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
]
|
"adaptor"
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T5",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 192,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T6",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 138,
|
|
||||||
"y": 192,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T7",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 276,
|
|
||||||
"y": 192,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T8",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 414,
|
|
||||||
"y": 192,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T9",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 96,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T10",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 138,
|
|
||||||
"y": 96,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T11",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 276,
|
|
||||||
"y": 96,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T12",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 414,
|
|
||||||
"y": 96,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "T13",
|
|
||||||
"visible": true,
|
|
||||||
"occupied_by": null,
|
|
||||||
"position": {
|
|
||||||
"x": 0,
|
|
||||||
"y": 0,
|
|
||||||
"z": 0
|
|
||||||
},
|
|
||||||
"size": {
|
|
||||||
"width": 128.0,
|
|
||||||
"height": 86,
|
|
||||||
"depth": 0
|
|
||||||
},
|
|
||||||
"content_type": [
|
|
||||||
"plate",
|
|
||||||
"tip_rack",
|
|
||||||
"plates",
|
|
||||||
"tip_racks",
|
|
||||||
"tube_rack"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -360,7 +374,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 138,
|
"x": 138,
|
||||||
"y": 0,
|
"y": 288,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -373,7 +387,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -382,7 +397,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 276,
|
"x": 276,
|
||||||
"y": 0,
|
"y": 288,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -395,7 +410,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -404,7 +420,7 @@
|
|||||||
"occupied_by": null,
|
"occupied_by": null,
|
||||||
"position": {
|
"position": {
|
||||||
"x": 414,
|
"x": 414,
|
||||||
"y": 0,
|
"y": 288,
|
||||||
"z": 0
|
"z": 0
|
||||||
},
|
},
|
||||||
"size": {
|
"size": {
|
||||||
@@ -417,7 +433,8 @@
|
|||||||
"tip_rack",
|
"tip_rack",
|
||||||
"plates",
|
"plates",
|
||||||
"tip_racks",
|
"tip_racks",
|
||||||
"tube_rack"
|
"tube_rack",
|
||||||
|
"adaptor"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user