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.

230 lines
8.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- encoding: utf-8 -*-
from head import *
class Node:
# 标记节点按钮
def node_mark_display(self):
for w in frame_right.winfo_children():
w.destroy()
# 清除右侧组件
curx = -1
y0 = 0.1
for i in d.Nodes:
if i[2] == 1:
curx = i[0]
lab = tk.Label(frame_right, text="节点操作", bg=RED, fg=BLACK, font=('微软雅黑', 20))
lab.place(relx=0.18, rely=0.02, width=200, height=30)
lab1 = tk.Label(frame_right, text=f"当前共有{len(d.Nodes)}个节点", bg=RED, fg=BLACK, font=('微软雅黑', 15))
lab1.place(relx=0.1, rely=0.0 + y0, width=200, height=30)
lab1 = tk.Label(frame_right, text="当前节点:", bg=RED, fg=BLACK, font=('微软雅黑', 12))
if curx == -1:
text = "未选择"
else:
text = f"{d.Nodes[curx][1]}"
lab2 = tk.Label(frame_right, text=text, bg=BLUE, fg=BLACK, font=('微软雅黑', 12))
lab1.place(relx=0.1, rely=0.05 + y0, width=80, height=30)
lab2.place(relx=0.4, rely=0.05 + y0, width=80, height=30)
B = tk.Button(frame_right, text="设置标签", command=lambda: self.node_rename())
B.place(relx=0.7, rely=0.05 + y0, width=80, height=30)
B = tk.Button(frame_right, text="删除当前节点", command=lambda: self.node_del_exact())
B.place(relx=0.1, rely=0.1 + y0, width=150, height=30)
if d.Nodes[curx][4] == 1:
text = '设为非必经节点'
else:
text = '设为必经节点'
B = tk.Button(frame_right, text=text, command=lambda: self.dominator(curx))
B.place(relx=0.1, rely=0.15 + y0, width=150, height=30)
B = tk.Button(frame_right, text="增加一个节点", command=lambda: self.node_add())
B.place(relx=0.1, rely=0.25 + y0, width=150, height=30)
B = tk.Button(frame_right, text="减少一个节点", command=lambda: self.node_del())
B.place(relx=0.1, rely=0.3 + y0, width=150, height=30)
def dominator(self, x):
d.Nodes[x][4] ^= 1
G.draw()
self.node_mark_display()
def node_mark(self, name):
if name >= len(d.Nodes):
self.node_404(name)
return
for node in d.Nodes:
if node[0] == name:
node[2] = 1
else:
node[2] = 0
G.draw()
self.node_mark_display()
def node_del_exact(self):
if d.nodes_num <= 2:# 若删除节点以后节点过少,则直接返回并警告
tk.messagebox.askokcancel(title='错误', message='节点过少')
return
flag = 0
cur = -1
for node in d.Nodes:# 寻找当前选定的节点
if node[2] == 1:
cur = node[0]
flag = 1
if flag == 0:
tk.messagebox.askokcancel(title='错误', message='未选择节点')
return
if d.source == 1:# 如果是均匀分布,则重新计算点的坐标
d.nodes_num -= 1#节点数目减一
d.ang = 360 / d.nodes_num#重新计算圆心角
nodes = d.Nodes.copy()#复制节点
d.Nodes.clear()#清除Data中的节点
num = 0
for n in nodes:#逐个复制节点
if n[0] == cur:#若是删除的节点,则不复制
continue
n[0] = num#重新编号
rad = math.radians(num * d.ang)#计算当前角度
x = int(math.cos(rad) * d.R)#计算当前点x坐标相对
y = int(math.sin(rad) * d.R)#计算当前点y坐标相对
n[3] = (d.center[0] + x, d.center[1] + y)#计算绝对坐标
d.Nodes.append(n)#将当前点加入点集合中
num += 1
edges = d.Edges.copy()#将原有边集复制出来
d.Edges.clear()#删除Data中的边集
num = 0
for e in edges:#复制边
if e[1] == cur or e[2] == cur:#删除的边不复制
continue
if e[1] > cur:#修改边对应的点的编号
e[1] -= 1
if e[2] > cur:#修改边对应的点的编号
e[2] -= 1
e[0] = num#重新编号
d.Edges.append(e)#将边加入边集中
num += 1
# 如果是按照经纬度分布,则重新计算比例尺
elif d.source == 2:
name = []
for i in range(len(d.name)):
if not i == cur:
name.append(d.name[i])
d.name = name.copy()
d.nodes_num -= 1
d.coordinate = d.coord_creat() # 纯节点坐标
d.Nodes = d.JI_nodes_creat() # 节点列表
d.Edges = d.JI_edges_creat()
d.JI_edge_add(2)
d.JI_edge_add(3)
elif d.source == 3:
name = []
for i in range(len(d.name)):
if not i == cur:
name.append(d.name[i])
d.name = name.copy()
d.nodes_num -= 1
d.coordinate = d.coord_creat() # 纯节点坐标
d.Nodes = d.LIAO_nodes_creat() # 节点列表
d.Edges = d.LIAO_edges_creat()
d.LIAO_edge_add(2)
d.LIAO_edge_add(3)
G.draw()
self.node_mark_display()
def node_rename(self):
flag = 0
for node in d.Nodes:
if node[2] == 1:
cur = node
flag = 1
if flag == 1:
result = tkinter.simpledialog.askstring(title='修改节点标签', prompt='请输入修改后的标签:', initialvalue=cur[1])
else:
tk.messagebox.askokcancel(title='错误', message='未选择节点')
return
for node in d.Nodes: # 检查新的名称是否已经存在
if node[1] == result:
return "Error: name already exists"
if result:
cur[1] = result
G.draw()
self.node_mark_display()
def node_clear(self):
for node in d.Nodes:
node[2] = False
G.draw()
def node_add(self):
# 增加一个节点
nodes = len(d.Nodes) + 1
# 如果节点数目大于五,则将连接详细信息改为不显示
if nodes > 5:
d.edgeinfo = 0
self.node_init(nodes)
G.draw()
self.node_mark_display()
def node_set(self):
node = tkinter.simpledialog.askinteger(title='修改节点数目', prompt='请输入修改后的节点数目:',
initialvalue=str(len(d.Nodes)))
if node:
self.node_init(node)
G.draw()
def node_del(self):
if d.nodes_num <= 2:
tk.messagebox.askokcancel(title='错误', message='节点过少')
return
nodes = len(d.Nodes) - 1
if nodes < 6:
d.edgeinfo = 1
self.node_init(nodes)
G.draw()
self.node_mark_display()
def node_init(self, node):
if not node:
return
if d.source == 1:
d.data(node)
elif d.source == 2:
if node > 13:
tk.messagebox.askokcancel(title='错误', message='节点过多')
return
d.HEI_data(node)
else:
if node > 13:
tk.messagebox.askokcancel(title='错误', message='节点过多')
return
d.LIAO_data(node)
if node > 5:
d.edgeinfo = 0
else:
d.edgeinfo = 1
def graph_del(self):
global d
del d
def node_refresh(self):
nodes = len(d.Nodes)
self.node_init(nodes)
G.draw()
self.node_mark_display()
def node_404(self, name):
# 弹出对话框
tk.messagebox.askokcancel(title='错误', message='该节点不存在')
# print(result)
if __name__ == '__main__':
G.draw()
node = Node()
node.node_mark_display()
mainloop()