diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index ffe898b2..6d4922ee 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -546,100 +546,6 @@ class PRCXI9300TubeRack(TubeRack): return data -class PRCXI9300PlateAdapterSite(ItemizedCarrier): - def __init__(self, name: str, size_x: float, size_y: float, size_z: float, - material_info: Optional[Dict[str, Any]] = None, **kwargs): - # 处理 sites 参数的不同格式 - - sites = create_homogeneous_resources( - klass=ResourceHolder, - locations=[Coordinate(0, 0, 0)], - resource_size_x=size_x, - resource_size_y=size_y, - resource_size_z=size_z, - name_prefix=name, - )[0] - - # 确保不传递重复的参数 - kwargs.pop('layout', None) - sites_in = kwargs.pop('sites', None) - - # 创建默认的sites字典 - sites_dict = {name: sites} - # 优先从 sites_in 读取 'content_type',否则使用默认值 - - content_type = [ - "plate", - "tip_rack", - "plates", - "tip_racks", - "tube_rack", - "plateadapter" - ] - # 如果提供了sites参数,则用sites_in中的值替换sites_dict中对应的元素 - if sites_in is not None and isinstance(sites_in, dict): - for site_key, site_value in sites_in.items(): - if site_key in sites_dict: - sites_dict[site_key] = site_value - - super().__init__(name, size_x, size_y, size_z, - sites=sites_dict, - num_items_x=kwargs.pop('num_items_x', 1), - num_items_y=kwargs.pop('num_items_y', 1), - num_items_z=kwargs.pop('num_items_z', 1), - content_type=content_type, - **kwargs) - self._unilabos_state = {} - if material_info: - self._unilabos_state["Material"] = material_info - - - def assign_child_resource(self, resource, location=Coordinate(0, 0, 0), reassign=True, spot=None): - """重写 assign_child_resource 方法,对于适配器位置,不使用索引分配""" - # 直接调用 Resource 的 assign_child_resource,避免 ItemizedCarrier 的索引逻辑 - from pylabrobot.resources.resource import Resource - Resource.assign_child_resource(self, resource, location=location, reassign=reassign) - - def unassign_child_resource(self, resource): - """重写 unassign_child_resource 方法,对于适配器位置,不使用 sites 列表""" - # 直接调用 Resource 的 unassign_child_resource,避免 ItemizedCarrier 的 sites 逻辑 - from pylabrobot.resources.resource import Resource - Resource.unassign_child_resource(self, resource) - - def serialize_state(self) -> Dict[str, Dict[str, Any]]: - try: - data = super().serialize_state() - except AttributeError: - data = {} - - # 包含 sites 配置信息,但避免序列化 ResourceHolder 对象 - if hasattr(self, 'sites') and self.sites: - # 只保存 sites 的基本信息,不保存 ResourceHolder 对象本身 - sites_info = [] - for site in self.sites: - if hasattr(site, '__class__') and 'pylabrobot' in str(site.__class__.__module__): - # 对于 pylabrobot 对象,只保存基本信息 - sites_info.append({ - "__pylabrobot_object__": True, - "class": site.__class__.__name__, - "module": site.__class__.__module__, - "name": getattr(site, 'name', str(site)) - }) - else: - sites_info.append(site) - data['sites'] = sites_info - - return data - - def load_state(self, state: Dict[str, Any]) -> None: - """加载状态,包括 sites 配置信息""" - super().load_state(state) - - # 从状态中恢复 sites 配置信息 - if 'sites' in state: - self.sites = [state['sites']] - - class PRCXI9300ModuleSite(ItemizedCarrier): """ PRCXI 功能模块的基础站点类(加热/冷却/震荡/磁吸等)。