mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2026-02-05 05:45:10 +00:00
74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
import networkx as nx
|
|
from typing import List, Dict, Any
|
|
|
|
def generate_add_protocol(
|
|
G: nx.DiGraph,
|
|
vessel: str,
|
|
reagent: str,
|
|
volume: float,
|
|
mass: float,
|
|
amount: str,
|
|
time: float,
|
|
stir: bool,
|
|
stir_speed: float,
|
|
viscous: bool,
|
|
purpose: str
|
|
) -> List[Dict[str, Any]]:
|
|
"""
|
|
生成添加试剂的协议序列 - 严格按照 Add.action
|
|
"""
|
|
action_sequence = []
|
|
|
|
# 如果指定了体积,执行液体转移
|
|
if volume > 0:
|
|
# 查找可用的试剂瓶
|
|
available_flasks = [node for node in G.nodes()
|
|
if node.startswith('flask_')
|
|
and G.nodes[node].get('type') == 'container']
|
|
|
|
if not available_flasks:
|
|
raise ValueError("没有找到可用的试剂容器")
|
|
|
|
reagent_vessel = available_flasks[0]
|
|
|
|
# 查找泵设备
|
|
pump_nodes = [node for node in G.nodes()
|
|
if G.nodes[node].get('class') == 'virtual_pump']
|
|
|
|
if pump_nodes:
|
|
pump_id = pump_nodes[0]
|
|
action_sequence.append({
|
|
"device_id": pump_id,
|
|
"action_name": "transfer",
|
|
"action_kwargs": {
|
|
"from_vessel": reagent_vessel,
|
|
"to_vessel": vessel,
|
|
"volume": volume,
|
|
"amount": amount,
|
|
"time": time,
|
|
"viscous": viscous,
|
|
"rinsing_solvent": "",
|
|
"rinsing_volume": 0.0,
|
|
"rinsing_repeats": 0,
|
|
"solid": False
|
|
}
|
|
})
|
|
|
|
# 如果需要搅拌,使用 StartStir 而不是 Stir
|
|
if stir:
|
|
stirrer_nodes = [node for node in G.nodes()
|
|
if G.nodes[node].get('class') == 'virtual_stirrer']
|
|
|
|
if stirrer_nodes:
|
|
stirrer_id = stirrer_nodes[0]
|
|
action_sequence.append({
|
|
"device_id": stirrer_id,
|
|
"action_name": "start_stir", # 使用 start_stir 而不是 stir
|
|
"action_kwargs": {
|
|
"vessel": vessel,
|
|
"stir_speed": stir_speed,
|
|
"purpose": f"添加 {reagent} 后搅拌"
|
|
}
|
|
})
|
|
|
|
return action_sequence |