Merge remote-tracking branch 'origin/dev' into workstation_dev_YB3

This commit is contained in:
calvincao
2025-10-28 11:47:07 +08:00
22 changed files with 2315 additions and 665 deletions

View File

@@ -18,6 +18,7 @@ def bioyond_warehouse_1x4x4(name: str) -> WareHouse:
)
def bioyond_warehouse_1x4x2(name: str) -> WareHouse:
"""创建BioYond 4x1x2仓库"""
return warehouse_factory(

View File

@@ -535,6 +535,7 @@ def resource_ulab_to_plr(resource: dict, plr_model=False) -> "ResourcePLR":
def resource_ulab_to_plr_inner(resource: dict):
all_states[resource["name"]] = resource["data"]
extra = resource.pop("extra", {})
d = {
"name": resource["name"],
"type": resource["type"],
@@ -575,16 +576,16 @@ def resource_plr_to_ulab(resource_plr: "ResourcePLR", parent_name: str = None, w
replace_info = {
"plate": "plate",
"well": "well",
"tip_spot": "container",
"trash": "container",
"tip_spot": "tip_spot",
"trash": "trash",
"deck": "deck",
"tip_rack": "container",
"tip_rack": "tip_rack",
}
if source in replace_info:
return replace_info[source]
else:
print("转换pylabrobot的时候出现未知类型", source)
return "container"
return source
def resource_plr_to_ulab_inner(d: dict, all_states: dict, child=True) -> dict:
r = {

View File

@@ -78,6 +78,7 @@ class ItemizedCarrier(ResourcePLR):
sites: Optional[Dict[Union[int, str], Optional[ResourcePLR]]] = None,
category: Optional[str] = "carrier",
model: Optional[str] = None,
invisible_slots: Optional[str] = None,
):
super().__init__(
name=name,
@@ -89,6 +90,7 @@ class ItemizedCarrier(ResourcePLR):
)
self.num_items = len(sites)
self.num_items_x, self.num_items_y, self.num_items_z = num_items_x, num_items_y, num_items_z
self.invisible_slots = [] if invisible_slots is None else invisible_slots
self.layout = "z-y" if self.num_items_z > 1 and self.num_items_x == 1 else "x-z" if self.num_items_z > 1 and self.num_items_y == 1 else "x-y"
if isinstance(sites, dict):
@@ -410,7 +412,7 @@ class ItemizedCarrier(ResourcePLR):
"layout": self.layout,
"sites": [{
"label": str(identifier),
"visible": True if self[identifier] is not None else False,
"visible": False if identifier in self.invisible_slots else True,
"occupied_by": self[identifier].name
if isinstance(self[identifier], ResourcePLR) and not isinstance(self[identifier], ResourceHolder) else
self[identifier] if isinstance(self[identifier], str) else None,
@@ -433,6 +435,7 @@ class BottleCarrier(ItemizedCarrier):
sites: Optional[Dict[Union[int, str], ResourceHolder]] = None,
category: str = "bottle_carrier",
model: Optional[str] = None,
invisible_slots: List[str] = None,
**kwargs,
):
super().__init__(
@@ -443,4 +446,5 @@ class BottleCarrier(ItemizedCarrier):
sites=sites,
category=category,
model=model,
invisible_slots=invisible_slots,
)