You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

487 lines
21 KiB

# -*- encoding: utf-8 -*-
from head import *
from NODE import *
N = Node()
class Edge:
def __init__(self):
self.mark = []
# 记录已标记的节点数目(连接操作)
self.user_cur = 0
# 记录用户所在点
def node_edge(self, no, n1, n2): # 根据节点返回编号
if n1 > n2:
n = n1
n1 = n2
n2 = n
for e in d.Edges:
if e[1] == n1 and e[2] == n2 and e[8] == no:
return e[0]
return -1
def edge_mark_display(self):
for w in frame_right.winfo_children():
w.destroy()
# 清除右侧组件
cura = ""
cur1 = -1
curb = ""
cur2 = -1
lab = tk.Label(frame_right, text="连接操作", bg=RED, fg=BLACK, font=('微软雅黑', 20))
lab.place(relx=0.18, rely=0.02, width=200, height=30)
for i in d.Nodes:
if i[2] == 1:
cura = str(i[1])
cur1 = i[0]
if i[2] == 2:
curb = str(i[1])
cur2 = i[0]
E = 0
for e in d.Edges:
if ((cur1 == e[1] and cur2 == e[2]) or (cur2 == e[1] and cur1 == e[2])):
if e[8] == 1 and e[3] == 1 and E < 1:
E = 1
elif e[8] == 2 and e[3] == 1 and E < 2:
E = 2
elif e[8] == 3 and e[3] == 1 and E < 3:
E = 3
y0 = 0.1
B = tk.Button(frame_right, text="建立为完全图", command=lambda: self.edge_addall())
B.place(relx=0.15, rely=y0 - 0.02, width=80, height=30)
B = tk.Button(frame_right, text="删除所有链接", command=lambda: self.edge_delall())
B.place(relx=0.65, rely=y0 - 0.02, width=80, height=30)
# 当前两个节点信息
laba1 = tk.Label(frame_right, text="当前节点1:", bg=RED, fg=BLACK, font=('微软雅黑', 12))
laba2 = tk.Label(frame_right, text=f"{cura}", bg=BLUE, fg=BLACK, font=('微软雅黑', 8))
laba1.place(relx=0.05, rely=0.02 + y0, width=80, height=30)
laba2.place(relx=0.35, rely=0.02 + y0, width=50, height=30)
labb1 = tk.Label(frame_right, text="当前节点2:", bg=RED, fg=BLACK, font=('微软雅黑', 12))
labb2 = tk.Label(frame_right, text=f"{curb}", bg=BLUE, fg=BLACK, font=('微软雅黑', 8))
labb1.place(relx=0.52, rely=0.02 + y0, width=80, height=30)
labb2.place(relx=0.82, rely=0.02 + y0, width=50, height=30)
# 当前链接信息
cur = -1
for edge in d.Edges:
if edge[8] == 1 and edge[3] == 1 and d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
cur = edge[0]
if E == 0:
text = "两点间不存在链接"
else:
text = "两点间存在" + str(E) + "条链接"
lab1 = tk.Label(frame_right, text=f"{text}", bg=RED, fg=BLACK, font=('微软雅黑', 15))
lab1.place(relx=0.05, rely=0.08 + y0, width=200, height=30)
if E == 0:
B = tk.Button(frame_right, text="建立链接", command=lambda: self.edge_add())
B.place(relx=0.7, rely=0.08 + y0, width=80, height=30)
elif E == 1:
B = tk.Button(frame_right, text="删除链接", command=lambda: self.edge_del())
B.place(relx=0.7, rely=0.08 + y0, width=80, height=30)
if not E == 0:
y0 += 0.1
lab = tk.Label(frame_right, text="链接一", bg=RED, fg=BLACK, font=('微软雅黑', 15))
lab.place(relx=0.1, rely=0.08 + y0, width=150, height=30)
lab1 = tk.Label(frame_right, text="当前链接", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][5])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 8))
B = tk.Button(frame_right, text="设置标签", command=lambda: self.edge_rename())
lab1.place(relx=0.1, rely=0.13 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.13 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.13 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接成本", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][6])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置成本", command=lambda: self.edge_recost())
lab1.place(relx=0.1, rely=0.18 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.18 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.18 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接时间", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][7])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置时间", command=lambda: self.edge_retime())
lab1.place(relx=0.1, rely=0.23 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.23 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.23 + y0, width=80, height=30)
# print ("cur",cur1,cur2)
# print (E)
if E == 1:
B = tk.Button(frame_right, text="增加一条连接", command=lambda: self.newedge_add(2, cur1, cur2))
B.place(relx=0.1, rely=0.3 + y0, width=150, height=30)
elif E >= 2:
cur = self.node_edge(2, cur1, cur2)
lab = tk.Label(frame_right, text="链接二", bg=RED, fg=BLACK, font=('微软雅黑', 15))
lab.place(relx=0.1, rely=0.28 + y0, width=150, height=30)
lab1 = tk.Label(frame_right, text="当前链接", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][5])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 8))
B = tk.Button(frame_right, text="设置标签", command=lambda n=cur: self.newedge_rename(n))
lab1.place(relx=0.1, rely=0.33 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.33 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.33 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接成本", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][6])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置成本", command=lambda n=cur: self.newedge_recost(n))
lab1.place(relx=0.1, rely=0.38 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.38 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.38 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接时间", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][7])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置时间", command=lambda n=cur: self.newedge_retime(n))
lab1.place(relx=0.1, rely=0.43 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.43 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.43 + y0, width=80, height=30)
if E == 2:
B = tk.Button(frame_right, text="增加一条连接", command=lambda: self.newedge_add(3, cur1, cur2))
B.place(relx=0.1, rely=0.5 + y0, width=150, height=30)
B = tk.Button(frame_right, text="删除一条连接", command=lambda: self.newedge_del(2, cur1, cur2))
B.place(relx=0.1, rely=0.55 + y0, width=150, height=30)
B = tk.Button(frame_right, text="删除多余连接", command=lambda: self.newedge_del_all(1))
B.place(relx=0.1, rely=0.6 + y0, width=150, height=30)
elif E == 3:
cur = self.node_edge(3, cur1, cur2)
y0 += 0.2
lab = tk.Label(frame_right, text="链接三", bg=RED, fg=BLACK, font=('微软雅黑', 15))
lab.place(relx=0.1, rely=0.28 + y0, width=150, height=30)
lab1 = tk.Label(frame_right, text="当前链接", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][5])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 8))
B = tk.Button(frame_right, text="设置标签", command=lambda n=cur: self.newedge_rename(n))
lab1.place(relx=0.1, rely=0.33 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.33 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.33 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接成本", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][6])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置成本", command=lambda n=cur: self.newedge_recost(n))
lab1.place(relx=0.1, rely=0.38 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.38 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.38 + y0, width=80, height=30)
lab1 = tk.Label(frame_right, text="链接时间", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if cur == -1:
text = ""
else:
text = str(d.Edges[cur][7])
lab2 = tk.Label(frame_right, text=f"{text}", bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
B = tk.Button(frame_right, text="设置时间", command=lambda n=cur: self.newedge_retime(n))
lab1.place(relx=0.1, rely=0.43 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.43 + y0, width=80, height=30)
B.place(relx=0.7, rely=0.43 + y0, width=80, height=30)
B = tk.Button(frame_right, text="删除一条连接", command=lambda: self.newedge_del(3, cur1, cur2))
B.place(relx=0.1, rely=0.5 + y0, width=150, height=30)
B = tk.Button(frame_right, text="删除多余连接", command=lambda: self.newedge_del_all(1))
B.place(relx=0.1, rely=0.55 + y0, width=150, height=30)
def edge_merge_cost(self, n1, n2):
cur1 = node_edge(n1, n2)# 初始化三条可能的边的编号
cur2 = node_edge(n1, n2, 2)# 初始化三条可能的边的编号
cur3 = node_edge(n1, n2, 3)# 初始化三条可能的边的编号
edges = [(cur1, d.Edges[cur1][6]), (cur2, d.Edges[cur2][6]), (cur3, d.Edges[cur3][6])]#提出编号与路径花费
valid_edges = [(edge, cost) for edge, cost in edges if d.Edges[edge][3] == 1]# 过滤出存在的边
valid_edges.sort(key=lambda x: x[1])# 按照 cost 排序,保留 cost 最小的边
for idx, (edge, _) in enumerate(valid_edges):
d.Edges[edge][8] = idx + 1 # 设置边的优先级
d.Edges[edge][0] = edge # 确保边的索引正确
for edge, _ in valid_edges[1:]:# 对于非最优边,设置其为不显示
d.Edges[edge][3] = 0
# def edge_merge_cost(self, n1, n2):
# # 保留cost最小的一条其他路径都不显示
# cur1 = G.node_edge(n1, n2)
# cur2 = self.node_edge(2, n1, n2)
# cur3 = self.node_edge(3, n1, n2)
# # print(d.Edges[cur1])
# # print(d.Edges[cur2])
# # print(d.Edges[cur3])
# if d.Edges[cur2][3] == 1 and d.Edges[cur2][6] < d.Edges[cur1][6]:
# e = d.Edges[cur1].copy()
# d.Edges[cur1] = d.Edges[cur2].copy()
# d.Edges[cur2] = e.copy()
# d.Edges[cur1][8] = 1
# d.Edges[cur2][8] = 2
# if d.Edges[cur2][3] == 1 and d.Edges[cur3][6] < d.Edges[cur1][6]:
# e = d.Edges[cur1].copy()
# d.Edges[cur1] = d.Edges[cur3].copy()
# d.Edges[cur3] = e.copy()
# d.Edges[cur1][8] = 1
# d.Edges[cur3][8] = 3
# if d.Edges[cur2][3] == 1 and d.Edges[cur3][3] == 1 and d.Edges[cur3][6] < d.Edges[cur2][6]:
# e = d.Edges[cur2].copy()
# d.Edges[cur2] = d.Edges[cur3].copy()
# d.Edges[cur3] = e.copy()
# d.Edges[cur2][8] = 2
# d.Edges[cur3][8] = 3
# d.Edges[cur2][3] = 0
# d.Edges[cur3][3] = 0
# d.Edges[cur1][0] = cur1
# d.Edges[cur2][0] = cur2
# d.Edges[cur3][0] = cur3
def edge_merge_time(self, n1, n2):
cur1 = node_edge(n1, n2)# 初始化三条可能的边的编号
cur2 = node_edge(n1, n2, 2)# 初始化三条可能的边的编号
cur3 = node_edge(n1, n2, 3)# 初始化三条可能的边的编号
edges = [(cur1, d.Edges[cur1][7]), (cur2, d.Edges[cur2][7]), (cur3, d.Edges[cur3][7])]#提出编号与路径花费
valid_edges = [(edge, cost) for edge, cost in edges if d.Edges[edge][3] == 1]# 过滤出存在的边
valid_edges.sort(key=lambda x: x[1])# 按照 cost 排序,保留 cost 最小的边
for idx, (edge, _) in enumerate(valid_edges):
d.Edges[edge][8] = idx + 1 # 设置边的优先级
d.Edges[edge][0] = edge # 确保边的索引正确
for edge, _ in valid_edges[1:]:# 对于非最优边,设置其为不显示
d.Edges[edge][3] = 0
def edge_del_all(self, mode):
# mode = 1:优先最短路径
# mode = 2:优先最短时间
# cur1 = node_edge()
if mode == 1:
for e in d.Edges:
if (e[8] == 2 and e[3] == 1) or (e[8] == 3 and e[3] == 1):
self.edge_merge_cost(e[1], e[2])
else:
for e in d.Edges:
if (e[8] == 2 and e[3] == 1) or (e[8] == 3 and e[3] == 1):
self.edge_merge_time(e[1], e[2])
G.draw()
def newedge_del_all(self, mode):
self.edge_del_all(mode)
self.edge_mark_display()
def newedge_recost(self, no):
edge = d.Edges[no]
if not edge:
tk.messagebox.askokcancel(title='错误', message='链接不合法')
result = tkinter.simpledialog.askinteger(title='修改连接花费', prompt='请输入修改后的时间:',
initialvalue=edge[7])
if result:
edge[6] = result
G.draw()
self.edge_mark_display()
def newedge_retime(self, no):
edge = d.Edges[no]
if not edge:
tk.messagebox.askokcancel(title='错误', message='链接不合法')
result = tkinter.simpledialog.askinteger(title='修改连接时间', prompt='请输入修改后的时间:',
initialvalue=edge[7])
if result:
edge[7] = result
G.draw()
self.edge_mark_display()
def newedge_rename(self, no):
edge = d.Edges[no]
if not edge:
tk.messagebox.askokcancel(title='错误', message='链接不合法')
result = tkinter.simpledialog.askstring(title='修改连接标签', prompt='请输入修改后的标签:',
initialvalue=edge[5])
if result:
edge[5] = result
G.draw()
self.edge_mark_display()
def newedge_add(self, no, na, nb):
e = self.node_edge(no, na, nb)
d.Edges[e][3] = 1
G.draw()
self.edge_mark_display()
def newedge_del(self, no, na, nb):
e = self.node_edge(no, na, nb)
d.Edges[e][3] = 0
# print(d.Edges[e])
G.draw()
self.edge_mark_display()
def node_mark1(self, name):
if name >= len(d.Nodes):
N.node_404(name)
return
for node in d.Nodes:
if node[0] == name:
node[2] = 1
elif node[2] == 1:
node[2] = 0
G.draw()
self.edge_mark_display()
def node_mark2(self, name):
if name >= len(d.Nodes):
N.node_404(name)
return
for node in d.Nodes:
if node[0] == name:
node[2] = 2
elif node[2] == 2:
node[2] = 0
G.draw()
self.edge_mark_display()
def edge_add(self):
for edge in d.Edges:
if d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
if edge[8] == 1 and edge[3] == 1:
tk.messagebox.askokcancel(title='错误', message='已存在连线')
return
else:
edge[3] = 1
G.draw()
self.edge_mark_display()
return
tk.messagebox.askokcancel(title='错误', message='请选择两个节点')
def edge_del(self):
for edge in d.Edges:
if d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
edge[3] = 0
G.draw()
self.edge_mark_display()
return
tk.messagebox.askokcancel(title='错误', message='请选择两个节点')
def edge_delall(self):
for edge in d.Edges:
edge[3] = 0
G.draw()
self.edge_mark_display()
def edge_addall(self):
for edge in d.Edges :
if edge[8] == 1:
edge[3] = 1
G.draw()
self.edge_mark_display()
def edge_rename(self):
for edge in d.Edges:
if d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
if edge[3] == 0:
tk.messagebox.askokcancel(title='错误', message='不存在连线')
return
else:
result = tkinter.simpledialog.askstring(title='修改连接标签', prompt='请输入修改后的标签:',
initialvalue=edge[5])
if(result):
edge[5] = result
G.draw()
self.edge_mark_display()
return
tk.messagebox.askokcancel(title='错误', message='请选择两个节点')
def edge_recost(self):
for edge in d.Edges:
if d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
if edge[3] == 0:
tk.messagebox.askokcancel(title='错误', message='不存在连线')
return
else:
result = tkinter.simpledialog.askinteger(title='修改连接成本', prompt='请输入修改后的成本:',
initialvalue=edge[6])
if result:
edge[6] = result
G.draw()
self.edge_mark_display()
return
tk.messagebox.askokcancel(title='错误', message='请选择两个节点')
def edge_retime(self):
for edge in d.Edges:
if d.Nodes[edge[1]][2] + d.Nodes[edge[2]][2] == 3:
if edge[3] == 0:
tk.messagebox.askokcancel(title='错误', message='不存在连线')
return
else:
result = tkinter.simpledialog.askinteger(title='修改连接时间', prompt='请输入修改后的时间:',
initialvalue=edge[7])
if result:
edge[7] = result
G.draw()
self.edge_mark_display()
return
tk.messagebox.askokcancel(title='错误', message='请选择两个节点')
def edge_mark(self):
for i in d.Edges:
if d.Nodes[i[1]][2] == True and d.Nodes[i[2]][2] == True:
i[4] = True
def edge_nmark(self):
for i in d.Edges:
if d.Nodes[i[1]][2] == True and d.Nodes[i[2]][2] == True:
i[4] = False
def edge_clear(self):
for edge in d.Edges:
edge[4] = False
G.draw()
if __name__ == '__main__':
G.draw()
E = Edge()
E.edge_mark_display()
mainloop()