diff --git a/unilabos/devices/workstation/bioyond_studio/config.py b/unilabos/devices/workstation/bioyond_studio/config.py index f184a282..f6602b2d 100644 --- a/unilabos/devices/workstation/bioyond_studio/config.py +++ b/unilabos/devices/workstation/bioyond_studio/config.py @@ -129,15 +129,27 @@ WAREHOUSE_MAPPING = { "J02": "3a19deae-2c7a-1d45-b4f8-6f866530e205", "J03": "3a19deae-2c7a-f237-89d9-8fe19025dee9" } - }, + } } # 物料类型配置 MATERIAL_TYPE_MAPPINGS = { - - "加样头(大)": ("YB_jia_yang_tou_da_1X1_carrier", "3a190ca0-b2f6-9aeb-8067-547e72c11469"), + "100ml液体": ("YB_1Bottle100mlCarrier", "d37166b3-ecaa-481e-bd84-3032b795ba07"), "液": ("YB_1BottleCarrier", "3a190ca1-2add-2b23-f8e1-bbd348b7f790"), - # YB信息 + "高粘液": ("YB_1GaoNianYeBottleCarrier", "abe8df30-563d-43d2-85e0-cabec59ddc16"), + "加样头(大)": ("YB_jia_yang_tou_da_1X1_carrier", "3a190ca0-b2f6-9aeb-8067-547e72c11469"), + "加样头(大)板": ("YB_jia_yang_tou_da_1X1_carrier", "a8e714ae-2a4e-4eb9-9614-e4c140ec3f16"), + "5ml分液瓶板": ("YB_6x5ml_DispensingVialCarrier", "3a192fa4-007d-ec7b-456e-2a8be7a13f23"), + "5ml分液瓶": ("YB_6x5ml_DispensingVialCarrier", "3a192c2a-ebb7-58a1-480d-8b3863bf74f4"), + "20ml分液瓶板": ("YB_6x20ml_DispensingVialCarrier", "3a192fa4-47db-3449-162a-eaf8aba57e27"), + "20ml分液瓶": ("YB_6x20ml_DispensingVialCarrier", "3a192c2b-19e8-f0a3-035e-041ca8ca1035"), + "配液瓶(小)板": ("YB_6x_SmallSolutionBottleCarrier", "3a190c8b-3284-af78-d29f-9a69463ad047"), + "配液瓶(小)": ("YB_6x_SmallSolutionBottleCarrier", "3a190c8c-fe8f-bf48-0dc3-97afc7f508eb"), + "配液瓶(大)板": ("YB_4x_LargeSolutionBottleCarrier", "53e50377-32dc-4781-b3c0-5ce45bc7dc27"), + "配液瓶(大)": ("YB_4x_LargeSolutionBottleCarrier", "19c52ad1-51c5-494f-8854-576f4ca9c6ca"), + "适配器块": ("YB_AdapterBlock", "efc3bb32-d504-4890-91c0-b64ed3ac80cf"), + "枪头盒": ("YB_TipBox", "3a192c2e-20f3-a44a-0334-c8301839d0b3"), + "枪头": ("YB_TipBox", "b6196971-1050-46da-9927-333e8dea062d"), } SOLID_LIQUID_MAPPINGS = { diff --git a/unilabos/registry/resources/bioyond/YB_bottle.yaml b/unilabos/registry/resources/bioyond/YB_bottle.yaml new file mode 100644 index 00000000..51ea6e48 --- /dev/null +++ b/unilabos/registry/resources/bioyond/YB_bottle.yaml @@ -0,0 +1,65 @@ +YB_fen_ye_5ml_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_fen_ye_5ml_Bottle + type: pylabrobot + description: YB_fen_ye_5ml_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_fen_ye_20ml_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_fen_ye_20ml_Bottle + type: pylabrobot + description: YB_fen_ye_20ml_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_pei_ye_xiao_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_pei_ye_xiao_Bottle + type: pylabrobot + description: YB_pei_ye_xiao_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_pei_ye_da_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_pei_ye_da_Bottle + type: pylabrobot + description: YB_pei_ye_da_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_Pipette_Tip: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_Pipette_Tip + type: pylabrobot + description: YB_Pipette_Tip + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + diff --git a/unilabos/registry/resources/bioyond/YB_bottle_carriers.yaml b/unilabos/registry/resources/bioyond/YB_bottle_carriers.yaml index 83320c5d..1c5b029e 100644 --- a/unilabos/registry/resources/bioyond/YB_bottle_carriers.yaml +++ b/unilabos/registry/resources/bioyond/YB_bottle_carriers.yaml @@ -1,10 +1,24 @@ -YB_jia_yang_tou_da_1X1_carrier: + +YB_6StockCarrier: category: - yb3 class: - module: unilabos.resources.bioyond.YB_bottle_carriers:YB_jia_yang_tou_da_1X1_carrier + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_6StockCarrier type: pylabrobot - description: YB_jia_yang_tou_da_1X1_carrier + description: YB_6StockCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_6VialCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_6VialCarrier + type: pylabrobot + description: YB_6VialCarrier handles: [] icon: '' init_param_schema: {} @@ -23,3 +37,172 @@ YB_1BottleCarrier: init_param_schema: {} registry_type: resource version: 1.0.0 + +YB_1GaoNianYeBottleCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_1GaoNianYeBottleCarrier + type: pylabrobot + description: YB_1GaoNianYeBottleCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_1Bottle100mlCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_1Bottle100mlCarrier + type: pylabrobot + description: YB_1Bottle100mlCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_6x5ml_DispensingVialCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_6x5ml_DispensingVialCarrier + type: pylabrobot + description: YB_6x5ml_DispensingVialCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_6x20ml_DispensingVialCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_6x20ml_DispensingVialCarrier + type: pylabrobot + description: YB_6x20ml_DispensingVialCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_6x_SmallSolutionBottleCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_6x_SmallSolutionBottleCarrier + type: pylabrobot + description: YB_6x_SmallSolutionBottleCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_4x_LargeSolutionBottleCarrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_4x_LargeSolutionBottleCarrier + type: pylabrobot + description: YB_4x_LargeSolutionBottleCarrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_jia_yang_tou_da_1X1_carrier: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_jia_yang_tou_da_1X1_carrier + type: pylabrobot + description: YB_jia_yang_tou_da_1X1_carrier + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_AdapterBlock: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_AdapterBlock + type: pylabrobot + description: YB_AdapterBlock + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_TipBox: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottle_carriers:YB_TipBox + type: pylabrobot + description: YB_TipBox + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_ye_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_ye_Bottle + type: pylabrobot + description: YB_ye_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_ye_100ml_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_ye_100ml_Bottle + type: pylabrobot + description: YB_ye_100ml_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_gao_nian_ye_Bottle: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_gao_nian_ye_Bottle + type: pylabrobot + description: YB_gao_nian_ye_Bottle + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 + +YB_jia_yang_tou_da: + category: + - yb3 + class: + module: unilabos.resources.bioyond.YB_bottles:YB_jia_yang_tou_da + type: pylabrobot + description: YB_jia_yang_tou_da + handles: [] + icon: '' + init_param_schema: {} + registry_type: resource + version: 1.0.0 diff --git a/unilabos/resources/bioyond/YB_bottle_carriers.py b/unilabos/resources/bioyond/YB_bottle_carriers.py index a4a36013..01d64c52 100644 --- a/unilabos/resources/bioyond/YB_bottle_carriers.py +++ b/unilabos/resources/bioyond/YB_bottle_carriers.py @@ -3,7 +3,14 @@ from pylabrobot.resources import create_homogeneous_resources, Coordinate, Resou from unilabos.resources.itemized_carrier import Bottle, BottleCarrier from unilabos.resources.bioyond.YB_bottles import ( YB_jia_yang_tou_da, - YB_ye_Bottle + YB_ye_Bottle, + YB_ye_100ml_Bottle, + YB_gao_nian_ye_Bottle, + YB_fen_ye_5ml_Bottle, + YB_fen_ye_20ml_Bottle, + YB_pei_ye_xiao_Bottle, + YB_pei_ye_da_Bottle, + YB_Pipette_Tip, ) # 命名约定:试剂瓶-Bottle,烧杯-Beaker,烧瓶-Flask,小瓶-Vial @@ -53,8 +60,8 @@ def BIOYOND_Electrolyte_6VialCarrier(name: str) -> BottleCarrier: carrier.num_items_x = 3 carrier.num_items_y = 2 carrier.num_items_z = 1 - for i in range(6): - carrier[i] = YB_Solid_Vial(f"{name}_vial_{i+1}") + # for i in range(6): + # carrier[i] = YB_Solid_Vial(f"{name}_vial_{i+1}") return carrier @@ -91,7 +98,7 @@ def BIOYOND_Electrolyte_1BottleCarrier(name: str) -> BottleCarrier: carrier.num_items_x = 1 carrier.num_items_y = 1 carrier.num_items_z = 1 - carrier[0] = YB_Solution_Beaker(f"{name}_beaker_1") + # carrier[0] = YB_Solution_Beaker(f"{name}_beaker_1") return carrier @@ -141,8 +148,8 @@ def YB_6StockCarrier(name: str) -> BottleCarrier: carrier.num_items_y = 2 carrier.num_items_z = 1 ordering = ["A1", "A2", "A3", "B1", "B2", "B3"] # 自定义顺序 - for i in range(6): - carrier[i] = YB_Solid_Stock(f"{name}_vial_{ordering[i]}") + # for i in range(6): + # carrier[i] = YB_Solid_Stock(f"{name}_vial_{ordering[i]}") return carrier @@ -192,13 +199,13 @@ def YB_6VialCarrier(name: str) -> BottleCarrier: carrier.num_items_y = 2 carrier.num_items_z = 1 ordering = ["A1", "A2", "A3", "B1", "B2", "B3"] # 自定义顺序 - for i in range(3): - carrier[i] = YB_Solid_Vial(f"{name}_solidvial_{ordering[i]}") - for i in range(3, 6): - carrier[i] = YB_Liquid_Vial(f"{name}_liquidvial_{ordering[i]}") + # for i in range(3): + # carrier[i] = YB_Solid_Vial(f"{name}_solidvial_{ordering[i]}") + # for i in range(3, 6): + # carrier[i] = YB_Liquid_Vial(f"{name}_liquidvial_{ordering[i]}") return carrier -"""1瓶载架 - 单个中央位置""" +# 1瓶载架 - 单个中央位置 def YB_1BottleCarrier(name: str) -> BottleCarrier: # 载架尺寸 (mm) @@ -235,7 +242,80 @@ def YB_1BottleCarrier(name: str) -> BottleCarrier: return carrier -"""5ml分液瓶板 - 4x2布局,8个位置""" +# 高粘液瓶载架 - 单个中央位置 +def YB_1GaoNianYeBottleCarrier(name: str) -> BottleCarrier: + + # 载架尺寸 (mm) + carrier_size_x = 127.8 + carrier_size_y = 85.5 + carrier_size_z = 20.0 + + # 烧杯尺寸 + beaker_diameter = 60.0 + + # 计算中央位置 + center_x = (carrier_size_x - beaker_diameter) / 2 + center_y = (carrier_size_y - beaker_diameter) / 2 + center_z = 5.0 + + carrier = BottleCarrier( + name=name, + size_x=carrier_size_x, + size_y=carrier_size_y, + size_z=carrier_size_z, + sites=create_homogeneous_resources( + klass=ResourceHolder, + locations=[Coordinate(center_x, center_y, center_z)], + resource_size_x=beaker_diameter, + resource_size_y=beaker_diameter, + name_prefix=name, + ), + model="1GaoNianYeBottleCarrier", + ) + carrier.num_items_x = 1 + carrier.num_items_y = 1 + carrier.num_items_z = 1 + carrier[0] = YB_gao_nian_ye_Bottle(f"{name}_flask_1") + return carrier + + +# 100ml液体瓶载架 - 单个中央位置 +def YB_1Bottle100mlCarrier(name: str) -> BottleCarrier: + + # 载架尺寸 (mm) + carrier_size_x = 127.8 + carrier_size_y = 85.5 + carrier_size_z = 20.0 + + # 烧杯尺寸 + beaker_diameter = 60.0 + + # 计算中央位置 + center_x = (carrier_size_x - beaker_diameter) / 2 + center_y = (carrier_size_y - beaker_diameter) / 2 + center_z = 5.0 + + carrier = BottleCarrier( + name=name, + size_x=carrier_size_x, + size_y=carrier_size_y, + size_z=carrier_size_z, + sites=create_homogeneous_resources( + klass=ResourceHolder, + locations=[Coordinate(center_x, center_y, center_z)], + resource_size_x=beaker_diameter, + resource_size_y=beaker_diameter, + name_prefix=name, + ), + model="1Bottle100mlCarrier", + ) + carrier.num_items_x = 1 + carrier.num_items_y = 1 + carrier.num_items_z = 1 + carrier[0] = YB_ye_100ml_Bottle(f"{name}_flask_1") + return carrier + +# 5ml分液瓶板 - 4x2布局,8个位置 def YB_6x5ml_DispensingVialCarrier(name: str) -> BottleCarrier: @@ -282,10 +362,10 @@ def YB_6x5ml_DispensingVialCarrier(name: str) -> BottleCarrier: carrier.num_items_z = 1 ordering = ["A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4"] for i in range(8): - carrier[i] = YB_5ml_Dispensing_Vial(f"{name}_vial_{ordering[i]}") + carrier[i] = YB_fen_ye_5ml_Bottle(f"{name}_vial_{ordering[i]}") return carrier -"""20ml分液瓶板 - 4x2布局,8个位置""" +# 20ml分液瓶板 - 4x2布局,8个位置 def YB_6x20ml_DispensingVialCarrier(name: str) -> BottleCarrier: @@ -332,10 +412,10 @@ def YB_6x20ml_DispensingVialCarrier(name: str) -> BottleCarrier: carrier.num_items_z = 1 ordering = ["A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4"] for i in range(8): - carrier[i] = YB_20ml_Dispensing_Vial(f"{name}_vial_{ordering[i]}") + carrier[i] = YB_fen_ye_20ml_Bottle(f"{name}_vial_{ordering[i]}") return carrier -"""配液瓶(小)板 - 4x2布局,8个位置""" +# 配液瓶(小)板 - 4x2布局,8个位置 def YB_6x_SmallSolutionBottleCarrier(name: str) -> BottleCarrier: @@ -382,12 +462,12 @@ def YB_6x_SmallSolutionBottleCarrier(name: str) -> BottleCarrier: carrier.num_items_z = 1 ordering = ["A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4"] for i in range(8): - carrier[i] = YB_Small_Solution_Bottle(f"{name}_bottle_{ordering[i]}") + carrier[i] = YB_pei_ye_xiao_Bottle(f"{name}_bottle_{ordering[i]}") return carrier +# 配液瓶(大)板 - 2x2布局,4个位置 def YB_4x_LargeSolutionBottleCarrier(name: str) -> BottleCarrier: - """配液瓶(大)板 - 2x2布局,4个位置""" # 载架尺寸 (mm) carrier_size_x = 127.8 @@ -432,10 +512,10 @@ def YB_4x_LargeSolutionBottleCarrier(name: str) -> BottleCarrier: carrier.num_items_z = 1 ordering = ["A1", "A2", "B1", "B2"] for i in range(4): - carrier[i] = YB_Large_Solution_Bottle(f"{name}_bottle_{ordering[i]}") + carrier[i] = YB_pei_ye_da_Bottle(f"{name}_bottle_{ordering[i]}") return carrier -"""加样头(大)板 - 1x1布局,1个位置""" +# 加样头(大)板 - 1x1布局,1个位置 def YB_jia_yang_tou_da_1X1_carrier(name: str) -> BottleCarrier: # 载架尺寸 (mm) diff --git a/unilabos/resources/bioyond/YB_bottles.py b/unilabos/resources/bioyond/YB_bottles.py index f38dc360..8ebdb415 100644 --- a/unilabos/resources/bioyond/YB_bottles.py +++ b/unilabos/resources/bioyond/YB_bottles.py @@ -1,6 +1,5 @@ from unilabos.resources.itemized_carrier import Bottle, BottleCarrier # 工厂函数 - """加样头(大)""" def YB_jia_yang_tou_da( name: str, @@ -35,4 +34,130 @@ def YB_ye_Bottle( max_volume=max_volume, barcode=barcode, model="Liquid_Bottle", + ) + +"""100ml液体""" +def YB_ye_100ml_Bottle( + name: str, + diameter: float = 50.0, + height: float = 90.0, + max_volume: float = 100000.0, # 100mL + barcode: str = None, +) -> Bottle: + """创建100ml液体瓶""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Liquid_Bottle_100ml", + ) + +"""高粘液""" +def YB_gao_nian_ye_Bottle( + name: str, + diameter: float = 40.0, + height: float = 70.0, + max_volume: float = 50000.0, # 50mL + barcode: str = None, +) -> Bottle: + """创建高粘液瓶""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="High_Viscosity_Liquid", + ) + +"""5ml分液瓶""" +def YB_fen_ye_5ml_Bottle( + name: str, + diameter: float = 20.0, + height: float = 50.0, + max_volume: float = 5000.0, # 5mL + barcode: str = None, +) -> Bottle: + """创建5ml分液瓶""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Separation_Bottle_5ml", + ) + +"""20ml分液瓶""" +def YB_fen_ye_20ml_Bottle( + name: str, + diameter: float = 30.0, + height: float = 65.0, + max_volume: float = 20000.0, # 20mL + barcode: str = None, +) -> Bottle: + """创建20ml分液瓶""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Separation_Bottle_20ml", + ) + +"""配液瓶(小)""" +def YB_pei_ye_xiao_Bottle( + name: str, + diameter: float = 35.0, + height: float = 60.0, + max_volume: float = 30000.0, # 30mL + barcode: str = None, +) -> Bottle: + """创建配液瓶(小)""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Mixing_Bottle_Small", + ) + +"""配液瓶(大)""" +def YB_pei_ye_da_Bottle( + name: str, + diameter: float = 55.0, + height: float = 100.0, + max_volume: float = 150000.0, # 150mL + barcode: str = None, +) -> Bottle: + """创建配液瓶(大)""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Mixing_Bottle_Large", + ) + +"""枪头""" +def YB_Pipette_Tip( + name: str, + diameter: float = 10.0, + height: float = 50.0, + max_volume: float = 1000.0, # 1mL + barcode: str = None, +) -> Bottle: + """创建枪头""" + return Bottle( + name=name, + diameter=diameter, + height=height, + max_volume=max_volume, + barcode=barcode, + model="Pipette_Tip", )