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

# -*- 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()