From 44a4c2362dbf71385821ad3fe0c1856b035719a4 Mon Sep 17 00:00:00 2001 From: ALITTLELZ Date: Wed, 14 Jan 2026 15:14:48 +0800 Subject: [PATCH] Enhance PRCXI classes by adding category parameter and updating logic for channel handling; update resource tracking to include tube_rack category. --- .../devices/liquid_handling/prcxi/prcxi.py | 9 +++-- unilabos/resources/graphio.py | 1 + unilabos/resources/resource_tracker.py | 40 ++++++++++--------- .../experiments/prcxi_9320_with_res_test.json | 14 +++---- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 31d18c1..7c5442a 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -405,16 +405,19 @@ class PRCXI9300TubeRack(TubeRack): if items_to_pass is not None: super().__init__(name, size_x, size_y, size_z, ordered_items=items_to_pass, + category=category, model=model, **kwargs) elif ordering_param is not None: # 传递 ordering 参数,让 TubeRack 自己创建 Tube 对象 super().__init__(name, size_x, size_y, size_z, ordering=ordering_param, + category=category, model=model, **kwargs) else: super().__init__(name, size_x, size_y, size_z, + category=category, model=model, **kwargs) @@ -1273,7 +1276,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 hole_row = 1 - if self.num_channels == 1: + if self.num_channels == 1 or self.num_channels == 2: hole_row = tipspot_index % 8 + 1 assert mix_time > 0 @@ -1330,7 +1333,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): PlateNo = plate_indexes[0] + 1 hole_col = tip_columns[0] + 1 hole_row = 1 - if self.num_channels == 1: + if self.num_channels == 1 or self.num_channels == 2: hole_row = tipspot_index % 8 + 1 step = self.api_client.Imbibing( @@ -1388,7 +1391,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_col = tip_columns[0] + 1 hole_row = 1 - if self.num_channels == 1: + if self.num_channels == 1 or self.num_channels == 2: hole_row = tipspot_index % 8 + 1 step = self.api_client.Tapping( diff --git a/unilabos/resources/graphio.py b/unilabos/resources/graphio.py index faf0482..a00227f 100644 --- a/unilabos/resources/graphio.py +++ b/unilabos/resources/graphio.py @@ -592,6 +592,7 @@ def resource_plr_to_ulab(resource_plr: "ResourcePLR", parent_name: str = None, w "trash": "trash", "deck": "deck", "tip_rack": "tip_rack", + "tube_rack": "tube_rack", "warehouse": "warehouse", "container": "container", "tube": "tube", diff --git a/unilabos/resources/resource_tracker.py b/unilabos/resources/resource_tracker.py index 610ba3d..5d69ef6 100644 --- a/unilabos/resources/resource_tracker.py +++ b/unilabos/resources/resource_tracker.py @@ -333,6 +333,7 @@ class ResourceTreeSet(object): "well": "well", "deck": "deck", "tip_rack": "tip_rack", + "tube_rack": "tube_rack", "tip_spot": "tip_spot", "tube": "tube", "bottle_carrier": "bottle_carrier", @@ -379,33 +380,36 @@ class ResourceTreeSet(object): } # 先构建当前节点的字典(不包含children) + # 获取category:优先从顶层获取,如果不存在则从config中获取 + category = d.get("category") or d.get("config", {}).get("category", "") + config_dict = { + k: v + for k, v in d.items() + if k + not in [ + "name", + "children", + "parent_name", + "location", + "rotation", + "size_x", + "size_y", + "size_z", + "cross_section_type", + "bottom_type", + ] + } r_dict = { "id": d["name"], "uuid": current_uuid, "name": d["name"], "parent": parent_resource, # 直接传入 ResourceDict 对象 "parent_uuid": parent_uuid, # 使用 parent_uuid 而不是 parent 对象 - "type": replace_plr_type(d.get("category", "")), + "type": replace_plr_type(category), "class": d.get("class", ""), "position": pos, "pose": pos, - "config": { - k: v - for k, v in d.items() - if k - not in [ - "name", - "children", - "parent_name", - "location", - "rotation", - "size_x", - "size_y", - "size_z", - "cross_section_type", - "bottom_type", - ] - }, + "config": config_dict, "data": states[d["name"]], "extra": extra, } diff --git a/unilabos/test/experiments/prcxi_9320_with_res_test.json b/unilabos/test/experiments/prcxi_9320_with_res_test.json index 43e7e1b..8e888ce 100644 --- a/unilabos/test/experiments/prcxi_9320_with_res_test.json +++ b/unilabos/test/experiments/prcxi_9320_with_res_test.json @@ -6719,9 +6719,9 @@ }, "data": { "Material": { - "uuid": "b05b3b2aafd94ec38ea0cd3215ecea8f", - "Code": "ZX-78-096", - "Name": "细菌培养皿" + "uuid": "73bb9b10bc394978b70e027bf45ce2d3", + "Code": "ZX-023-0.2", + "Name": "0.2ml PCR板" } } }, @@ -16495,11 +16495,9 @@ }, "data": { "Material": { - "uuid": "e146697c395e4eabb3d6b74f0dd6aaf7", - "Code": "1", - "SupplyType": 1, - "Name": "ep适配器", - "SummaryName": "ep适配器" + "uuid": "73bb9b10bc394978b70e027bf45ce2d3", + "Code": "ZX-023-0.2", + "Name": "0.2ml PCR板" } } },