Merge branch 'main' of https://github.com/HPCL-EI/RoboWaiter
This commit is contained in:
commit
c4dd4f4378
|
@ -1,3 +0,0 @@
|
|||
from . import navigate
|
||||
from . import dstar_lite
|
||||
|
|
@ -7,7 +7,6 @@ import pickle
|
|||
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
from robowaiter.scene import scene
|
||||
|
||||
from robowaiter.algos.navigator.dstar_lite import DStarLite, euclidean_distance
|
||||
|
||||
|
@ -94,6 +93,7 @@ class Navigator:
|
|||
if __name__ == '__main__':
|
||||
|
||||
# 根据map计算并保存cost_map
|
||||
from robowaiter.scene import scene
|
||||
|
||||
file_name = 'map_4.pkl'
|
||||
if os.path.exists(file_name):
|
||||
|
|
|
@ -81,9 +81,10 @@ class Bahavior(ptree.behaviour.Behaviour):
|
|||
|
||||
|
||||
# let behavior node interact with the scene
|
||||
def set_scene(self, scene):
|
||||
self.scene = scene
|
||||
self.robot = scene.robot
|
||||
def set_scene(self, scene=None):
|
||||
if scene:
|
||||
self.scene = scene
|
||||
self.robot = scene.robot
|
||||
|
||||
def setup(self, **kwargs: Any) -> None:
|
||||
return super().setup(**kwargs)
|
||||
|
|
|
@ -3,6 +3,7 @@ from typing import Any
|
|||
|
||||
class Selector(ptree.composites.Selector):
|
||||
print_name = "Selector"
|
||||
ins_name = "Selector"
|
||||
type = "Selector"
|
||||
|
||||
def __init__(self,*args,**kwargs):
|
||||
|
|
|
@ -3,6 +3,7 @@ from typing import Any
|
|||
|
||||
class Sequence(ptree.composites.Sequence):
|
||||
print_name = "Sequence"
|
||||
ins_name = "Selector"
|
||||
type = "Sequence"
|
||||
|
||||
def __init__(self,*args,**kwargs):
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
import py_trees as ptree
|
||||
from robowaiter.behavior_lib._base.Act import Act
|
||||
|
||||
from robowaiter.llm_client.multi_rounds import ask_llm,new_history
|
||||
from robowaiter.llm_client.multi_rounds import ask_llm, new_history
|
||||
import random
|
||||
|
||||
|
||||
# import spacy
|
||||
# nlp = spacy.load('en_core_web_lg')
|
||||
|
||||
|
||||
class DealChat(Act):
|
||||
def __init__(self):
|
||||
|
@ -10,13 +16,14 @@ class DealChat(Act):
|
|||
self.function_success = False
|
||||
self.func_map = {
|
||||
"create_sub_task": self.create_sub_task,
|
||||
"get_object_info": self.get_object_info,
|
||||
"stop_serve": self.stop_serve
|
||||
"stop_serve": self.stop_serve,
|
||||
# "get_object_info": self.get_object_info,
|
||||
# "find_location": self.find_location
|
||||
}
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
name,sentence = self.scene.state['chat_list'].pop(0)
|
||||
name, sentence = self.scene.state['chat_list'].pop(0)
|
||||
|
||||
if name == "Goal":
|
||||
self.create_sub_task(goal=sentence)
|
||||
|
@ -39,14 +46,14 @@ class DealChat(Act):
|
|||
return ptree.common.Status.RUNNING
|
||||
|
||||
|
||||
def create_sub_task(self,**args):
|
||||
def create_sub_task(self, **args):
|
||||
try:
|
||||
goal = args['goal']
|
||||
|
||||
w = goal.split(")")
|
||||
goal_set = set()
|
||||
goal_set.add(w[0] + ")")
|
||||
if len(w)>1:
|
||||
if len(w) > 1:
|
||||
for x in w[1:]:
|
||||
if x != "":
|
||||
goal_set.add(x[1:] + ")")
|
||||
|
@ -56,25 +63,73 @@ class DealChat(Act):
|
|||
|
||||
self.scene.robot.expand_sub_task_tree(goal_set)
|
||||
|
||||
|
||||
def get_object_info(self,**args):
|
||||
try:
|
||||
obj = args['obj']
|
||||
|
||||
self.function_success = True
|
||||
except:
|
||||
obj = None
|
||||
print("参数解析错误")
|
||||
|
||||
near_object = "None"
|
||||
if obj == "洗手间":
|
||||
near_object = "大门"
|
||||
|
||||
return near_object
|
||||
|
||||
|
||||
# def get_object_info(self,**args):
|
||||
# try:
|
||||
# obj = args['obj']
|
||||
#
|
||||
# self.function_success = True
|
||||
# except:
|
||||
# obj = None
|
||||
# print("参数解析错误")
|
||||
#
|
||||
# near_object = "None"
|
||||
#
|
||||
# max_similarity = 0.02
|
||||
# similar_word = None
|
||||
#
|
||||
# # 场景中现有物品
|
||||
# cur_things = set()
|
||||
# for item in self.scene.status.objects:
|
||||
# cur_things.add(item.name)
|
||||
# # obj与现有物品进行相似度匹配
|
||||
# query_token = nlp(obj)
|
||||
# for w in cur_things:
|
||||
# word_token = nlp(w)
|
||||
# similarity = query_token.similarity(word_token)
|
||||
# if similarity > max_similarity:
|
||||
# max_similarity = similarity
|
||||
# similar_word = w
|
||||
# if similar_word:
|
||||
# print("max_similarity:",max_similarity,"similar_word:",similar_word)
|
||||
#
|
||||
# if similar_word: # 存在同义词说明场景中存在该物品
|
||||
# near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品
|
||||
#
|
||||
# if obj == "洗手间":
|
||||
# near_object = "Door"
|
||||
#
|
||||
# return near_object
|
||||
#
|
||||
# def find_location(self, **args):
|
||||
# try:
|
||||
# location = args['obj']
|
||||
# self.function_success = True
|
||||
# except:
|
||||
# obj = None
|
||||
# print("参数解析错误")
|
||||
#
|
||||
# near_location = None
|
||||
# # 用户咨询的地点
|
||||
# query_token = nlp(location)
|
||||
# max_similarity = 0
|
||||
# similar_word = None
|
||||
# # 到自己维护的地点列表中找同义词
|
||||
# for w in self.scene.all_loc_en:
|
||||
# word_token = nlp(w)
|
||||
# similarity = query_token.similarity(word_token)
|
||||
# if similarity > max_similarity:
|
||||
# max_similarity = similarity
|
||||
# similar_word = w
|
||||
# print("similarity:", max_similarity, "similar_word:", similar_word)
|
||||
# # 存在同义词说明客户咨询的地点有效
|
||||
# if similar_word:
|
||||
# mp = list(self.scene.loc_map_en[similar_word])
|
||||
# near_location = random.choice(mp)
|
||||
# return near_location
|
||||
|
||||
def stop_serve(self,**args):
|
||||
|
||||
|
||||
return "好的"
|
||||
return "好的"
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
import py_trees as ptree
|
||||
from robowaiter.behavior_lib._base.Act import Act
|
||||
|
||||
from robowaiter.llm_client.multi_rounds import ask_llm, new_history
|
||||
import random
|
||||
|
||||
|
||||
import spacy
|
||||
nlp = spacy.load('en_core_web_lg')
|
||||
|
||||
|
||||
class DealChat(Act):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.chat_history = ""
|
||||
self.function_success = False
|
||||
self.func_map = {
|
||||
"create_sub_task": self.create_sub_task,
|
||||
"stop_serve": self.stop_serve,
|
||||
"get_object_info": self.get_object_info,
|
||||
"find_location": self.find_location
|
||||
}
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
name, sentence = self.scene.state['chat_list'].pop(0)
|
||||
|
||||
if name == "Goal":
|
||||
self.create_sub_task(goal=sentence)
|
||||
return ptree.common.Status.RUNNING
|
||||
|
||||
if name not in self.scene.state["chat_history"]:
|
||||
self.scene.state["chat_history"][name] = new_history()
|
||||
|
||||
history = self.scene.state["chat_history"][name]
|
||||
self.scene.state["attention"]["customer"] = name
|
||||
self.scene.state["serve_state"] = {
|
||||
"last_chat_time": self.scene.time,
|
||||
}
|
||||
|
||||
function_call, response = ask_llm(sentence,history,func_map=self.func_map)
|
||||
|
||||
|
||||
self.scene.chat_bubble(response) # 机器人输出对话
|
||||
|
||||
return ptree.common.Status.RUNNING
|
||||
|
||||
|
||||
def create_sub_task(self, **args):
|
||||
try:
|
||||
goal = args['goal']
|
||||
|
||||
w = goal.split(")")
|
||||
goal_set = set()
|
||||
goal_set.add(w[0] + ")")
|
||||
if len(w) > 1:
|
||||
for x in w[1:]:
|
||||
if x != "":
|
||||
goal_set.add(x[1:] + ")")
|
||||
self.function_success = True
|
||||
except:
|
||||
print("参数解析错误")
|
||||
|
||||
self.scene.robot.expand_sub_task_tree(goal_set)
|
||||
|
||||
def get_object_info(self,**args):
|
||||
try:
|
||||
obj = args['obj']
|
||||
|
||||
self.function_success = True
|
||||
except:
|
||||
obj = None
|
||||
print("参数解析错误")
|
||||
|
||||
near_object = "None"
|
||||
|
||||
max_similarity = 0.02
|
||||
similar_word = None
|
||||
|
||||
# 场景中现有物品
|
||||
cur_things = set()
|
||||
for item in self.scene.status.objects:
|
||||
cur_things.add(item.name)
|
||||
# obj与现有物品进行相似度匹配
|
||||
query_token = nlp(obj)
|
||||
for w in cur_things:
|
||||
word_token = nlp(w)
|
||||
similarity = query_token.similarity(word_token)
|
||||
if similarity > max_similarity:
|
||||
max_similarity = similarity
|
||||
similar_word = w
|
||||
if similar_word:
|
||||
print("max_similarity:",max_similarity,"similar_word:",similar_word)
|
||||
|
||||
if similar_word: # 存在同义词说明场景中存在该物品
|
||||
near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品
|
||||
|
||||
if obj == "洗手间":
|
||||
near_object = "Door"
|
||||
|
||||
return near_object
|
||||
|
||||
def find_location(self, **args):
|
||||
try:
|
||||
location = args['obj']
|
||||
self.function_success = True
|
||||
except:
|
||||
obj = None
|
||||
print("参数解析错误")
|
||||
|
||||
near_location = None
|
||||
# 用户咨询的地点
|
||||
query_token = nlp(location)
|
||||
max_similarity = 0
|
||||
similar_word = None
|
||||
# 到自己维护的地点列表中找同义词
|
||||
for w in self.scene.all_loc_en:
|
||||
word_token = nlp(w)
|
||||
similarity = query_token.similarity(word_token)
|
||||
if similarity > max_similarity:
|
||||
max_similarity = similarity
|
||||
similar_word = w
|
||||
print("similarity:", max_similarity, "similar_word:", similar_word)
|
||||
# 存在同义词说明客户咨询的地点有效
|
||||
if similar_word:
|
||||
mp = list(self.scene.loc_map_en[similar_word])
|
||||
near_location = random.choice(mp)
|
||||
return near_location
|
||||
|
||||
def stop_serve(self,**args):
|
||||
|
||||
|
||||
return "好的"
|
||||
|
||||
|
|
@ -107,9 +107,12 @@ def format_trans_to_bracket(file_path: str) -> str:
|
|||
for i in range(level):
|
||||
ptml_new += '}'
|
||||
|
||||
import re
|
||||
new_path = re.sub('\\\[a-zA-Z0-9_]*\.ptml', '/bracket_ptml.ptml', file_path)
|
||||
with open(new_path, 'w+') as file:
|
||||
file_name = os.path.basename(file_path).split(".")[0]
|
||||
dir_path = os.path.dirname(file_path)
|
||||
# import re
|
||||
# new_path = re.sub('\\\[a-zA-Z0-9_]*\.ptml', '/bracket_ptml.ptml', file_path)
|
||||
new_path = os.path.join(dir_path,file_name+"_bracket.ptml")
|
||||
with open(new_path, 'w') as file:
|
||||
file.write(ptml_new)
|
||||
return new_path
|
||||
|
||||
|
|
|
@ -30,9 +30,8 @@ all_obj = ['马克杯', '香蕉', '牙膏', '面包', '软饮料', '酸奶', 'AD
|
|||
all_loc = ['吧台', '餐桌', '沙发', '灶台', '大门', '灯开关', '空调开关', '橱柜', '卫生间', '窗户', '音响', '休闲区', '工作台', '服务台', '收银台', '墙角',
|
||||
'蛋糕柜', '充电处', '冰箱', '书架']
|
||||
|
||||
all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window',
|
||||
'audio', 'lounge area', 'workstation', 'service counter', 'cashier counter', 'corner',
|
||||
'cake display', 'ChargingStations', 'refrigerator', 'bookshelf']
|
||||
all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window','audio', 'lounge area',
|
||||
'workstation', 'service counter', 'cashier counter', 'corner','cake display', 'ChargingStations', 'refrigerator', 'bookshelf']
|
||||
|
||||
loc_map_en = {'bar': {'工作台', '服务台', '收银台', '蛋糕柜'},
|
||||
'Table': {'大门', '休闲区', '墙角'},
|
||||
|
|
|
@ -154,7 +154,7 @@ def ask_llm(question,history, func_map=None, retry=3):
|
|||
"你是机器人服务员,请把以下句子换一种表述方式对顾客说,但是意思不变,尽量简短:\n")
|
||||
else:
|
||||
reply = fix_questions_dict[question]["answer"]
|
||||
result = single_round(f"你是机器人服务员,顾客想知道{question}, 你的具身场景查询返回的是{result},请把按照以下句子对顾客说,{reply}, 尽量简短。\n")
|
||||
result = single_round(f"你是机器人服务员,顾客想知道{question}, 你的具身场景查询返回的是{result},把返回的英文名词翻译成中文,请把按照以下句子对顾客说,{reply}, 尽量简短。\n")
|
||||
|
||||
message = {'role': 'assistant', 'content': result, 'name': None,
|
||||
'function_call': None}
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
selector
|
||||
{
|
||||
sequence
|
||||
{
|
||||
cond CustomerChatting()
|
||||
act DealChatNLP()
|
||||
}
|
||||
sequence
|
||||
{
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
{
|
||||
act SubTaskPlaceHolder()
|
||||
}
|
||||
}
|
||||
sequence
|
||||
{
|
||||
cond FocusingCustomer()
|
||||
act ServeCustomer()
|
||||
}
|
||||
sequence
|
||||
{
|
||||
cond NewCustomerComing()
|
||||
selector
|
||||
{
|
||||
cond At(Robot,Bar)
|
||||
act MoveTo(Bar)
|
||||
}
|
||||
act GreetCustomer()
|
||||
}
|
||||
|
||||
}
|
|
@ -35,7 +35,7 @@ class Robot(object):
|
|||
self.action_list = None
|
||||
|
||||
|
||||
def set_scene(self,scene):
|
||||
def set_scene(self,scene=None):
|
||||
self.scene = scene
|
||||
|
||||
|
||||
|
|
|
@ -132,6 +132,25 @@ class Scene:
|
|||
with open(self.filename, 'rb') as file:
|
||||
self.map_file = pickle.load(file)
|
||||
|
||||
# tool register
|
||||
self.all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window', 'audio',
|
||||
'lounge area', 'workstation', 'service counter', 'cashier counter', 'corner', 'cake display', 'ChargingStations',
|
||||
'refrigerator', 'bookshelf']
|
||||
|
||||
self.loc_map_en = {'bar': {'工作台', '服务台', '收银台', '蛋糕柜'}, 'Table': {'大门', '休闲区', '墙角'},
|
||||
'sofa': {'餐桌', '窗户', '音响', '休闲区', '墙角', '书架'},
|
||||
'stove': {'吧台', '橱柜', '工作台', '服务台', '收银台', '蛋糕柜', '冰箱'},
|
||||
'Gate': {'吧台', '灯开关', '空调开关', '卫生间', '墙角'}, 'light switch': {'大门', '空调开关', '卫生间', '墙角'},
|
||||
'airconditioner switch': {'大门', '灯开关', '卫生间', '墙角'},
|
||||
'cabinet': {'灶台', '吧台', '工作台', '服务台', '收银台', '蛋糕柜', '充电处', '冰箱'}, 'bathroom': {'大门', '墙角'},
|
||||
'window': {'餐桌', '沙发', '休闲区'}, 'audio': {'餐桌', '沙发', '休闲区', '墙角', '书架'},
|
||||
'lounge area': {'沙发', '餐桌', '墙角', '书架', '音响'}, 'workstation': {'吧台', '服务台', '收银台'},
|
||||
'service counter': {'吧台', '工作台', '收银台'}, 'cashier counter': {'吧台', '工作台', '服务台'},
|
||||
'corner': {'卫生间', '沙发', '灯开关', '空调开关', '音响', '休闲区', '书架'},
|
||||
'cake display': {'吧台', '橱柜', '服务台', '收银台', '冰箱'},
|
||||
'ChargingStations': {'吧台', '餐桌', '沙发', '休闲区', '工作台', '服务台', '收银台', '墙角', '书架'},
|
||||
'refrigerator': {'吧台', '服务台', '蛋糕柜'}, 'bookshelf': {'餐桌', '沙发', '窗户', '休闲区', '墙角'}}
|
||||
|
||||
|
||||
def reset(self):
|
||||
# 基类reset,默认执行仿真器初始化操作
|
||||
|
|
|
@ -16,7 +16,7 @@ class SceneGQA(Scene):
|
|||
super().__init__(robot)
|
||||
# 在这里加入场景中发生的事件, (事件发生的时间,事件函数)
|
||||
self.new_event_list = [
|
||||
(3, self.customer_say, ("System","请问洗手间在哪里?"))
|
||||
(3, self.customer_say, ("System","哪里有蛋糕"))
|
||||
]
|
||||
|
||||
def _reset(self):
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
"""
|
||||
具身多轮对话 GQA
|
||||
点餐(order)的对话,咖啡厅服务员可以为客人(NPC)完成点餐基本对话
|
||||
场景对话(GQA)结合场景:询问卫生间、附近娱乐场所(数据来源自主定义)
|
||||
开始条件:顾客NPC发出点餐指令
|
||||
结束条件:顾客NPC发出指令,表示不再需要服务
|
||||
"""
|
||||
|
||||
# todo: 使用大模型进行对话,获得指令信息,适时结束对话
|
||||
# order = {...}
|
||||
|
||||
from robowaiter.scene.scene import Scene
|
||||
|
||||
class SceneGQA(Scene):
|
||||
def __init__(self, robot):
|
||||
super().__init__(robot)
|
||||
# 在这里加入场景中发生的事件, (事件发生的时间,事件函数)
|
||||
self.new_event_list = [
|
||||
(3, self.customer_say, ("System","哪里有蛋糕"))
|
||||
]
|
||||
|
||||
def _reset(self):
|
||||
# self.clean_walker()
|
||||
# self.add_walkers([[50, 500,90]])
|
||||
pass
|
||||
|
||||
# self.walker_bubble("洗手间在哪里")
|
||||
# self.control_walker([self.walker_control_generator(0, False, 100, 755, 1900, 180)])
|
||||
|
||||
|
||||
def _run(self):
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import os
|
||||
from robowaiter.robot.robot import Robot
|
||||
from robowaiter.utils.basic import get_root_path
|
||||
root_path = get_root_path()
|
||||
ptml_path = os.path.join(root_path, 'robowaiter/robot/DefaultNLP.ptml')
|
||||
|
||||
robot = Robot(ptml_path=ptml_path)
|
||||
|
||||
# create task
|
||||
task = SceneGQA(robot)
|
||||
task.reset()
|
||||
task.run()
|
|
@ -111,10 +111,10 @@ def dot_tree(
|
|||
if with_qualified_names:
|
||||
node_label += f"\n({utilities.get_fully_qualified_name(behaviour)})"
|
||||
'''
|
||||
if node_name == "Sequence":
|
||||
node_name = ">"
|
||||
if node_name == "Selector":
|
||||
node_name = "?"
|
||||
# if node_name == "Sequence":
|
||||
# node_name = ">"
|
||||
# if node_name == "Selector":
|
||||
# node_name = "?"
|
||||
return node_name
|
||||
|
||||
fontsize = 20
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
selector
|
||||
sequence
|
||||
cond CustomerChatting()
|
||||
act DealChat()
|
||||
sequence
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
act SubTaskPlaceHolder()
|
||||
sequence
|
||||
cond FocusingCustomer()
|
||||
act ServeCustomer()
|
||||
sequence
|
||||
cond NewCustomerComing()
|
||||
selector
|
||||
cond At(Robot,Bar)
|
||||
act MoveTo(Bar)
|
||||
act GreetCustomer()
|
|
@ -0,0 +1,28 @@
|
|||
selector
|
||||
{
|
||||
sequence
|
||||
{
|
||||
cond CustomerChatting()
|
||||
act DealChat()
|
||||
|
||||
} sequence
|
||||
{
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
{
|
||||
act SubTaskPlaceHolder()
|
||||
|
||||
} sequence
|
||||
cond FocusingCustomer()
|
||||
act ServeCustomer()
|
||||
|
||||
} sequence
|
||||
{
|
||||
cond NewCustomerComing()
|
||||
selector
|
||||
{
|
||||
cond At(Robot,Bar)
|
||||
act MoveTo(Bar)
|
||||
|
||||
} act GreetCustomer()
|
||||
}}
|
|
@ -0,0 +1,21 @@
|
|||
# from robowaiter.scene.scene import Scene
|
||||
# from robowaiter.behavior_tree.ptml.ptmlCompiler import load
|
||||
|
||||
import os
|
||||
from robowaiter.robot.robot import Robot
|
||||
from robowaiter.utils.bt.draw import render_dot_tree
|
||||
from robowaiter.utils.basic import get_root_path
|
||||
from robowaiter.utils.bt.load import load_bt_from_ptml
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
# create robot
|
||||
root_path = get_root_path()
|
||||
ptml_path = os.path.join(root_path, 'robowaiter/utils/draw_bt/Default.ptml')
|
||||
behavior_lib_path = os.path.join(root_path, 'robowaiter/behavior_lib')
|
||||
bt = load_bt_from_ptml(None, ptml_path, behavior_lib_path)
|
||||
|
||||
|
||||
|
||||
render_dot_tree(bt.root,name="test")
|
||||
# build and tick
|
|
@ -0,0 +1,39 @@
|
|||
digraph pastafarianism {
|
||||
ordering=out;
|
||||
graph [fontname="times-roman"];
|
||||
node [fontname="times-roman"];
|
||||
edge [fontname="times-roman"];
|
||||
"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label=Selector, shape=diamond, style=filled, width=0.01];
|
||||
"717a1290-56bc-41e1-9b4b-e6df93d40e64" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01];
|
||||
"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" -> "717a1290-56bc-41e1-9b4b-e6df93d40e64";
|
||||
"b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2" [fillcolor=yellow, fontcolor=black, fontsize=20, label="CustomerChatting()", shape=ellipse, style=filled];
|
||||
"717a1290-56bc-41e1-9b4b-e6df93d40e64" -> "b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2";
|
||||
"28015225-b7a4-4f38-b26f-4dbe5eea4154" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="DealChat()", shape=box, style=filled];
|
||||
"717a1290-56bc-41e1-9b4b-e6df93d40e64" -> "28015225-b7a4-4f38-b26f-4dbe5eea4154";
|
||||
"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01];
|
||||
"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" -> "ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e";
|
||||
"2f77f976-499c-4601-9d8c-86dd80d66dfa" [fillcolor=yellow, fontcolor=black, fontsize=20, label="HasSubTask()", shape=ellipse, style=filled];
|
||||
"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "2f77f976-499c-4601-9d8c-86dd80d66dfa";
|
||||
"2428792c-3896-443d-8744-f5e286644fad" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01];
|
||||
"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "2428792c-3896-443d-8744-f5e286644fad";
|
||||
"4bb7a9c3-521b-408f-b403-1fd25d54b192" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="SubTaskPlaceHolder()", shape=box, style=filled];
|
||||
"2428792c-3896-443d-8744-f5e286644fad" -> "4bb7a9c3-521b-408f-b403-1fd25d54b192";
|
||||
"64b2362a-d99e-4e99-8772-ad1419e53a2e" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01];
|
||||
"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "64b2362a-d99e-4e99-8772-ad1419e53a2e";
|
||||
"fd7124ba-c9d1-4fde-8063-e8337d335121" [fillcolor=yellow, fontcolor=black, fontsize=20, label="FocusingCustomer()", shape=ellipse, style=filled];
|
||||
"64b2362a-d99e-4e99-8772-ad1419e53a2e" -> "fd7124ba-c9d1-4fde-8063-e8337d335121";
|
||||
"169ebec9-3645-4fbb-a533-5186a8e5967b" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="ServeCustomer()", shape=box, style=filled];
|
||||
"64b2362a-d99e-4e99-8772-ad1419e53a2e" -> "169ebec9-3645-4fbb-a533-5186a8e5967b";
|
||||
"bea12066-ecbd-49b0-8934-efcb2c38b5f5" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01];
|
||||
"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "bea12066-ecbd-49b0-8934-efcb2c38b5f5";
|
||||
"a847a0cc-c5af-4757-aa8c-8baef72788dc" [fillcolor=yellow, fontcolor=black, fontsize=20, label="NewCustomerComing()", shape=ellipse, style=filled];
|
||||
"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "a847a0cc-c5af-4757-aa8c-8baef72788dc";
|
||||
"99354f05-1716-46b2-9151-d88eac0a5b27" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label=Selector, shape=diamond, style=filled, width=0.01];
|
||||
"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "99354f05-1716-46b2-9151-d88eac0a5b27";
|
||||
"19de10a3-7554-43a3-b892-34cb2e32ab9a" [fillcolor=yellow, fontcolor=black, fontsize=20, label="At(Robot,Bar)", shape=ellipse, style=filled];
|
||||
"99354f05-1716-46b2-9151-d88eac0a5b27" -> "19de10a3-7554-43a3-b892-34cb2e32ab9a";
|
||||
"4286d652-c4ef-4522-a7f1-b5c865dcc4c9" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="MoveTo(Bar)", shape=box, style=filled];
|
||||
"99354f05-1716-46b2-9151-d88eac0a5b27" -> "4286d652-c4ef-4522-a7f1-b5c865dcc4c9";
|
||||
"a3766a34-5152-4f82-8fba-8bf1f6b3830b" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="GreetCustomer()", shape=box, style=filled];
|
||||
"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "a3766a34-5152-4f82-8fba-8bf1f6b3830b";
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 98 KiB |
|
@ -0,0 +1,211 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 9.0.0 (20230911.1827)
|
||||
-->
|
||||
<!-- Title: pastafarianism Pages: 1 -->
|
||||
<svg width="1699pt" height="417pt"
|
||||
viewBox="0.00 0.00 1699.49 416.87" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 412.87)">
|
||||
<title>pastafarianism</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-412.87 1695.49,-412.87 1695.49,4 -4,4"/>
|
||||
<!-- a3ac082f-ad46-4cc9-86b4-3e76c3c564d3 -->
|
||||
<g id="node1" class="node">
|
||||
<title>a3ac082f-ad46-4cc9-86b4-3e76c3c564d3</title>
|
||||
<polygon fill="cyan" stroke="black" points="495.87,-408.87 412.37,-377.62 495.87,-346.37 579.37,-377.62 495.87,-408.87"/>
|
||||
<text text-anchor="middle" x="495.87" y="-370.24" font-family="Times New Roman,serif" font-size="20.00">Selector</text>
|
||||
</g>
|
||||
<!-- 717a1290-56bc-41e1-9b4b-e6df93d40e64 -->
|
||||
<g id="node2" class="node">
|
||||
<title>717a1290-56bc-41e1-9b4b-e6df93d40e64</title>
|
||||
<polygon fill="orange" stroke="black" points="395.38,-276.54 395.38,-296.35 352.9,-310.37 292.83,-310.37 250.35,-296.35 250.35,-276.54 292.83,-262.53 352.9,-262.53 395.38,-276.54"/>
|
||||
<text text-anchor="middle" x="322.87" y="-279.07" font-family="Times New Roman,serif" font-size="20.00">Sequence</text>
|
||||
</g>
|
||||
<!-- a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->717a1290-56bc-41e1-9b4b-e6df93d40e64 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->717a1290-56bc-41e1-9b4b-e6df93d40e64</title>
|
||||
<path fill="none" stroke="black" d="M461.27,-358.78C435.8,-345.66 400.81,-327.62 372.38,-312.97"/>
|
||||
<polygon fill="black" stroke="black" points="374.07,-309.9 363.58,-308.43 370.87,-316.13 374.07,-309.9"/>
|
||||
</g>
|
||||
<!-- ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e -->
|
||||
<g id="node5" class="node">
|
||||
<title>ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e</title>
|
||||
<polygon fill="orange" stroke="black" points="742.38,-276.54 742.38,-296.35 699.9,-310.37 639.83,-310.37 597.35,-296.35 597.35,-276.54 639.83,-262.53 699.9,-262.53 742.38,-276.54"/>
|
||||
<text text-anchor="middle" x="669.87" y="-279.07" font-family="Times New Roman,serif" font-size="20.00">Sequence</text>
|
||||
</g>
|
||||
<!-- a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e</title>
|
||||
<path fill="none" stroke="black" d="M530.24,-359C556.02,-345.79 591.68,-327.51 620.51,-312.74"/>
|
||||
<polygon fill="black" stroke="black" points="621.74,-316.04 629.04,-308.37 618.55,-309.81 621.74,-316.04"/>
|
||||
</g>
|
||||
<!-- b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2 -->
|
||||
<g id="node3" class="node">
|
||||
<title>b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="125.87" cy="-202.61" rx="125.87" ry="22.1"/>
|
||||
<text text-anchor="middle" x="125.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">CustomerChatting()</text>
|
||||
</g>
|
||||
<!-- 717a1290-56bc-41e1-9b4b-e6df93d40e64->b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>717a1290-56bc-41e1-9b4b-e6df93d40e64->b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2</title>
|
||||
<path fill="none" stroke="black" d="M278.16,-266.88C250.24,-255.28 213.99,-240.22 183.86,-227.7"/>
|
||||
<polygon fill="black" stroke="black" points="185.46,-224.58 174.88,-223.97 182.77,-231.04 185.46,-224.58"/>
|
||||
</g>
|
||||
<!-- 28015225-b7a4-4f38-b26f-4dbe5eea4154 -->
|
||||
<g id="node4" class="node">
|
||||
<title>28015225-b7a4-4f38-b26f-4dbe5eea4154</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="376.24,-220.61 269.49,-220.61 269.49,-184.61 376.24,-184.61 376.24,-220.61"/>
|
||||
<text text-anchor="middle" x="322.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">DealChat()</text>
|
||||
</g>
|
||||
<!-- 717a1290-56bc-41e1-9b4b-e6df93d40e64->28015225-b7a4-4f38-b26f-4dbe5eea4154 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>717a1290-56bc-41e1-9b4b-e6df93d40e64->28015225-b7a4-4f38-b26f-4dbe5eea4154</title>
|
||||
<path fill="none" stroke="black" d="M322.87,-262.22C322.87,-252.88 322.87,-242.01 322.87,-232.2"/>
|
||||
<polygon fill="black" stroke="black" points="326.37,-232.43 322.87,-222.43 319.37,-232.43 326.37,-232.43"/>
|
||||
</g>
|
||||
<!-- 2f77f976-499c-4601-9d8c-86dd80d66dfa -->
|
||||
<g id="node6" class="node">
|
||||
<title>2f77f976-499c-4601-9d8c-86dd80d66dfa</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="486.87" cy="-202.61" rx="92.45" ry="22.1"/>
|
||||
<text text-anchor="middle" x="486.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">HasSubTask()</text>
|
||||
</g>
|
||||
<!-- ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2f77f976-499c-4601-9d8c-86dd80d66dfa -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2f77f976-499c-4601-9d8c-86dd80d66dfa</title>
|
||||
<path fill="none" stroke="black" d="M626.96,-266.26C600.92,-254.61 567.48,-239.66 539.8,-227.28"/>
|
||||
<polygon fill="black" stroke="black" points="541.44,-224.18 530.88,-223.3 538.58,-230.57 541.44,-224.18"/>
|
||||
</g>
|
||||
<!-- 2428792c-3896-443d-8744-f5e286644fad -->
|
||||
<g id="node7" class="node">
|
||||
<title>2428792c-3896-443d-8744-f5e286644fad</title>
|
||||
<polygon fill="orange" stroke="black" points="742.38,-192.7 742.38,-212.52 699.9,-226.53 639.83,-226.53 597.35,-212.52 597.35,-192.7 639.83,-178.69 699.9,-178.69 742.38,-192.7"/>
|
||||
<text text-anchor="middle" x="669.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">Sequence</text>
|
||||
</g>
|
||||
<!-- ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2428792c-3896-443d-8744-f5e286644fad -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2428792c-3896-443d-8744-f5e286644fad</title>
|
||||
<path fill="none" stroke="black" d="M669.87,-262.22C669.87,-254.79 669.87,-246.39 669.87,-238.33"/>
|
||||
<polygon fill="black" stroke="black" points="673.37,-238.42 669.87,-228.42 666.37,-238.42 673.37,-238.42"/>
|
||||
</g>
|
||||
<!-- 64b2362a-d99e-4e99-8772-ad1419e53a2e -->
|
||||
<g id="node9" class="node">
|
||||
<title>64b2362a-d99e-4e99-8772-ad1419e53a2e</title>
|
||||
<polygon fill="orange" stroke="black" points="905.38,-192.7 905.38,-212.52 862.9,-226.53 802.83,-226.53 760.35,-212.52 760.35,-192.7 802.83,-178.69 862.9,-178.69 905.38,-192.7"/>
|
||||
<text text-anchor="middle" x="832.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">Sequence</text>
|
||||
</g>
|
||||
<!-- ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->64b2362a-d99e-4e99-8772-ad1419e53a2e -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->64b2362a-d99e-4e99-8772-ad1419e53a2e</title>
|
||||
<path fill="none" stroke="black" d="M709.74,-265.43C731.74,-254.38 759.28,-240.56 782.73,-228.78"/>
|
||||
<polygon fill="black" stroke="black" points="784.12,-232 791.48,-224.39 780.98,-225.75 784.12,-232"/>
|
||||
</g>
|
||||
<!-- bea12066-ecbd-49b0-8934-efcb2c38b5f5 -->
|
||||
<g id="node12" class="node">
|
||||
<title>bea12066-ecbd-49b0-8934-efcb2c38b5f5</title>
|
||||
<polygon fill="orange" stroke="black" points="1384.38,-192.7 1384.38,-212.52 1341.9,-226.53 1281.83,-226.53 1239.35,-212.52 1239.35,-192.7 1281.83,-178.69 1341.9,-178.69 1384.38,-192.7"/>
|
||||
<text text-anchor="middle" x="1311.87" y="-195.24" font-family="Times New Roman,serif" font-size="20.00">Sequence</text>
|
||||
</g>
|
||||
<!-- ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->bea12066-ecbd-49b0-8934-efcb2c38b5f5 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->bea12066-ecbd-49b0-8934-efcb2c38b5f5</title>
|
||||
<path fill="none" stroke="black" d="M742.57,-276.18C862.55,-260.89 1101.31,-230.45 1228.15,-214.28"/>
|
||||
<polygon fill="black" stroke="black" points="1228.34,-217.79 1237.82,-213.05 1227.46,-210.84 1228.34,-217.79"/>
|
||||
</g>
|
||||
<!-- 4bb7a9c3-521b-408f-b403-1fd25d54b192 -->
|
||||
<g id="node8" class="node">
|
||||
<title>4bb7a9c3-521b-408f-b403-1fd25d54b192</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="574.49,-129.44 373.24,-129.44 373.24,-93.44 574.49,-93.44 574.49,-129.44"/>
|
||||
<text text-anchor="middle" x="473.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">SubTaskPlaceHolder()</text>
|
||||
</g>
|
||||
<!-- 2428792c-3896-443d-8744-f5e286644fad->4bb7a9c3-521b-408f-b403-1fd25d54b192 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>2428792c-3896-443d-8744-f5e286644fad->4bb7a9c3-521b-408f-b403-1fd25d54b192</title>
|
||||
<path fill="none" stroke="black" d="M627.82,-182.48C596.86,-168.4 554.7,-149.22 522.33,-134.49"/>
|
||||
<polygon fill="black" stroke="black" points="524.12,-131.46 513.57,-130.51 521.22,-137.83 524.12,-131.46"/>
|
||||
</g>
|
||||
<!-- fd7124ba-c9d1-4fde-8063-e8337d335121 -->
|
||||
<g id="node10" class="node">
|
||||
<title>fd7124ba-c9d1-4fde-8063-e8337d335121</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="720.87" cy="-111.44" rx="128.52" ry="22.1"/>
|
||||
<text text-anchor="middle" x="720.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">FocusingCustomer()</text>
|
||||
</g>
|
||||
<!-- 64b2362a-d99e-4e99-8772-ad1419e53a2e->fd7124ba-c9d1-4fde-8063-e8337d335121 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>64b2362a-d99e-4e99-8772-ad1419e53a2e->fd7124ba-c9d1-4fde-8063-e8337d335121</title>
|
||||
<path fill="none" stroke="black" d="M803.73,-178.42C789.1,-166.77 771.27,-152.57 755.9,-140.33"/>
|
||||
<polygon fill="black" stroke="black" points="758.36,-137.82 748.36,-134.33 754,-143.3 758.36,-137.82"/>
|
||||
</g>
|
||||
<!-- 169ebec9-3645-4fbb-a533-5186a8e5967b -->
|
||||
<g id="node11" class="node">
|
||||
<title>169ebec9-3645-4fbb-a533-5186a8e5967b</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="1020.49,-129.44 867.24,-129.44 867.24,-93.44 1020.49,-93.44 1020.49,-129.44"/>
|
||||
<text text-anchor="middle" x="943.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">ServeCustomer()</text>
|
||||
</g>
|
||||
<!-- 64b2362a-d99e-4e99-8772-ad1419e53a2e->169ebec9-3645-4fbb-a533-5186a8e5967b -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>64b2362a-d99e-4e99-8772-ad1419e53a2e->169ebec9-3645-4fbb-a533-5186a8e5967b</title>
|
||||
<path fill="none" stroke="black" d="M861.74,-178.42C877.67,-165.62 897.45,-149.73 913.6,-136.76"/>
|
||||
<polygon fill="black" stroke="black" points="915.36,-139.83 920.97,-130.84 910.98,-134.37 915.36,-139.83"/>
|
||||
</g>
|
||||
<!-- a847a0cc-c5af-4757-aa8c-8baef72788dc -->
|
||||
<g id="node13" class="node">
|
||||
<title>a847a0cc-c5af-4757-aa8c-8baef72788dc</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1186.87" cy="-111.44" rx="148.14" ry="22.1"/>
|
||||
<text text-anchor="middle" x="1186.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">NewCustomerComing()</text>
|
||||
</g>
|
||||
<!-- bea12066-ecbd-49b0-8934-efcb2c38b5f5->a847a0cc-c5af-4757-aa8c-8baef72788dc -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>bea12066-ecbd-49b0-8934-efcb2c38b5f5->a847a0cc-c5af-4757-aa8c-8baef72788dc</title>
|
||||
<path fill="none" stroke="black" d="M1280,-178.88C1263.4,-167.04 1242.97,-152.46 1225.48,-139.99"/>
|
||||
<polygon fill="black" stroke="black" points="1227.51,-137.14 1217.34,-134.18 1223.44,-142.84 1227.51,-137.14"/>
|
||||
</g>
|
||||
<!-- 99354f05-1716-46b2-9151-d88eac0a5b27 -->
|
||||
<g id="node14" class="node">
|
||||
<title>99354f05-1716-46b2-9151-d88eac0a5b27</title>
|
||||
<polygon fill="cyan" stroke="black" points="1436.87,-142.69 1353.37,-111.44 1436.87,-80.19 1520.37,-111.44 1436.87,-142.69"/>
|
||||
<text text-anchor="middle" x="1436.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">Selector</text>
|
||||
</g>
|
||||
<!-- bea12066-ecbd-49b0-8934-efcb2c38b5f5->99354f05-1716-46b2-9151-d88eac0a5b27 -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>bea12066-ecbd-49b0-8934-efcb2c38b5f5->99354f05-1716-46b2-9151-d88eac0a5b27</title>
|
||||
<path fill="none" stroke="black" d="M1343.73,-178.88C1360.85,-166.67 1382.05,-151.54 1399.9,-138.81"/>
|
||||
<polygon fill="black" stroke="black" points="1401.55,-141.94 1407.65,-133.28 1397.48,-136.24 1401.55,-141.94"/>
|
||||
</g>
|
||||
<!-- a3766a34-5152-4f82-8fba-8bf1f6b3830b -->
|
||||
<g id="node17" class="node">
|
||||
<title>a3766a34-5152-4f82-8fba-8bf1f6b3830b</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="1691.49,-129.44 1538.24,-129.44 1538.24,-93.44 1691.49,-93.44 1691.49,-129.44"/>
|
||||
<text text-anchor="middle" x="1614.87" y="-104.07" font-family="Times New Roman,serif" font-size="20.00">GreetCustomer()</text>
|
||||
</g>
|
||||
<!-- bea12066-ecbd-49b0-8934-efcb2c38b5f5->a3766a34-5152-4f82-8fba-8bf1f6b3830b -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>bea12066-ecbd-49b0-8934-efcb2c38b5f5->a3766a34-5152-4f82-8fba-8bf1f6b3830b</title>
|
||||
<path fill="none" stroke="black" d="M1369.59,-187.32C1413.74,-176.07 1475.98,-159.54 1529.87,-142.69 1538.78,-139.91 1548.16,-136.78 1557.3,-133.61"/>
|
||||
<polygon fill="black" stroke="black" points="1558.17,-137.02 1566.45,-130.4 1555.85,-130.41 1558.17,-137.02"/>
|
||||
</g>
|
||||
<!-- 19de10a3-7554-43a3-b892-34cb2e32ab9a -->
|
||||
<g id="node15" class="node">
|
||||
<title>19de10a3-7554-43a3-b892-34cb2e32ab9a</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="1347.87" cy="-22.1" rx="95.64" ry="22.1"/>
|
||||
<text text-anchor="middle" x="1347.87" y="-14.72" font-family="Times New Roman,serif" font-size="20.00">At(Robot,Bar)</text>
|
||||
</g>
|
||||
<!-- 99354f05-1716-46b2-9151-d88eac0a5b27->19de10a3-7554-43a3-b892-34cb2e32ab9a -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>99354f05-1716-46b2-9151-d88eac0a5b27->19de10a3-7554-43a3-b892-34cb2e32ab9a</title>
|
||||
<path fill="none" stroke="black" d="M1414.41,-88.4C1403.11,-77.32 1389.28,-63.74 1377.16,-51.84"/>
|
||||
<polygon fill="black" stroke="black" points="1379.76,-49.5 1370.17,-44.99 1374.86,-54.49 1379.76,-49.5"/>
|
||||
</g>
|
||||
<!-- 4286d652-c4ef-4522-a7f1-b5c865dcc4c9 -->
|
||||
<g id="node16" class="node">
|
||||
<title>4286d652-c4ef-4522-a7f1-b5c865dcc4c9</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="1589.74,-40.1 1461.99,-40.1 1461.99,-4.1 1589.74,-4.1 1589.74,-40.1"/>
|
||||
<text text-anchor="middle" x="1525.87" y="-14.72" font-family="Times New Roman,serif" font-size="20.00">MoveTo(Bar)</text>
|
||||
</g>
|
||||
<!-- 99354f05-1716-46b2-9151-d88eac0a5b27->4286d652-c4ef-4522-a7f1-b5c865dcc4c9 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>99354f05-1716-46b2-9151-d88eac0a5b27->4286d652-c4ef-4522-a7f1-b5c865dcc4c9</title>
|
||||
<path fill="none" stroke="black" d="M1459.32,-88.4C1471.74,-76.21 1487.23,-61.02 1500.13,-48.35"/>
|
||||
<polygon fill="black" stroke="black" points="1502.42,-51.01 1507.1,-41.51 1497.51,-46.02 1502.42,-51.01"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
Loading…
Reference in New Issue