From 357fc038ef019f7f47bcebee3818a120eed15e5e Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Thu, 16 Oct 2025 03:15:56 +0800 Subject: [PATCH] temp fix for resource get --- unilabos/resources/graphio.py | 5 +++++ unilabos/ros/nodes/base_device_node.py | 28 +++++++++++++++++++------- unilabos/ros/nodes/resource_tracker.py | 7 ++++--- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/unilabos/resources/graphio.py b/unilabos/resources/graphio.py index a8cd6152..b1b5a611 100644 --- a/unilabos/resources/graphio.py +++ b/unilabos/resources/graphio.py @@ -17,6 +17,7 @@ from unilabos.ros.nodes.resource_tracker import ( ResourceDictInstance, ResourceTreeSet, ) +from unilabos.utils import logger from unilabos.utils.banner_print import print_status try: @@ -67,6 +68,10 @@ def canonicalize_nodes_data( z = node.pop("z", None) if z is not None: node["position"]["position"]["z"] = z + if "sample_id" in node: + sample_id = node.pop("sample_id") + if sample_id: + logger.error(f"{node}的sample_id参数已弃用,sample_id: {sample_id}") for k in list(node.keys()): if k not in ["id", "uuid", "name", "description", "schema", "model", "icon", "parent_uuid", "parent", "type", "class", "position", "config", "data", "children"]: v = node.pop(k) diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index d3f224bc..2a1b5b74 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -6,7 +6,7 @@ import threading import time import traceback import uuid -from typing import get_type_hints, TypeVar, Generic, Dict, Any, Type, TypedDict, Optional, List, TYPE_CHECKING +from typing import get_type_hints, TypeVar, Generic, Dict, Any, Type, TypedDict, Optional, List, TYPE_CHECKING, Union from concurrent.futures import ThreadPoolExecutor import asyncio @@ -657,15 +657,27 @@ class BaseROS2DeviceNode(Node, Generic[T]): results.append({"success": True, "action": "update"}) elif action == "remove": # 移除资源 - plr_resources: List[ResourcePLR] = [ - self.resource_tracker.uuid_to_resources[i] for i in resources_uuid - ] + found_resources: List[List[Union[ResourcePLR, dict]]] = self.resource_tracker.figure_resource( + [{"uuid": uid} for uid in resources_uuid], try_mode=True + ) + found_plr_resources = [] + other_plr_resources = [] + for res_list in found_resources: + for res in res_list: + if issubclass(res.__class__, ResourcePLR): + found_plr_resources.append(res) + else: + other_plr_resources.append(res) func = getattr(self.driver_instance, "resource_tree_remove", None) if callable(func): - func(plr_resources) - for plr_resource in plr_resources: + func(found_plr_resources) + for plr_resource in found_plr_resources: plr_resource.parent.unassign_child_resource(plr_resource) self.resource_tracker.remove_resource(plr_resource) + self.lab_logger().info(f"移除物料 {plr_resource} 及其子节点") + for res in other_plr_resources: + self.resource_tracker.remove_resource(res) + self.lab_logger().info(f"移除物料 {res} 及其子节点") results.append({"success": True, "action": "remove"}) except Exception as e: error_msg = f"Error processing {action} operation: {str(e)}" @@ -945,7 +957,9 @@ class BaseROS2DeviceNode(Node, Generic[T]): # 通过资源跟踪器获取本地实例 final_resources = queried_resources if is_sequence else queried_resources[0] - action_kwargs[k] = self.resource_tracker.figure_resource(final_resources, try_mode=False) + final_resources = self.resource_tracker.figure_resource({"name": final_resources.id}, try_mode=False) if not is_sequence else [ + self.resource_tracker.figure_resource({"name": res.id}, try_mode=False) for res in queried_resources + ] except Exception as e: self.lab_logger().error(f"{action_name} 物料实例获取失败: {e}\n{traceback.format_exc()}") diff --git a/unilabos/ros/nodes/resource_tracker.py b/unilabos/ros/nodes/resource_tracker.py index e6c1beea..79d8e616 100644 --- a/unilabos/ros/nodes/resource_tracker.py +++ b/unilabos/ros/nodes/resource_tracker.py @@ -774,7 +774,8 @@ class DeviceNodeResourceTracker(object): else: return getattr(resource, uuid_attr, None) - def _set_resource_uuid(self, resource, new_uuid: str): + @classmethod + def set_resource_uuid(cls, resource, new_uuid: str): """ 设置资源的 uuid,统一处理 dict 和 instance 两种类型 @@ -827,7 +828,7 @@ class DeviceNodeResourceTracker(object): resource_name = self._get_resource_attr(res, "name") if resource_name and resource_name in name_to_uuid_map: new_uuid = name_to_uuid_map[resource_name] - self._set_resource_uuid(res, new_uuid) + self.set_resource_uuid(res, new_uuid) self.uuid_to_resources[new_uuid] = res logger.debug(f"设置资源UUID: {resource_name} -> {new_uuid}") return 1 @@ -853,7 +854,7 @@ class DeviceNodeResourceTracker(object): if current_uuid and current_uuid in uuid_map: new_uuid = uuid_map[current_uuid] if current_uuid != new_uuid: - self._set_resource_uuid(res, new_uuid) + self.set_resource_uuid(res, new_uuid) # 更新uuid_to_resources映射 if current_uuid in self.uuid_to_resources: self.uuid_to_resources.pop(current_uuid)