import pygame from pygame.locals import * from CGB.TK import CC import time import os #定义一些变量 pen_C = [0, 0, 0] # 画笔颜色 Z_C = [0,0,255] J_C = [255,0,0] d = 2 # 圆形的粗细(线条*2)=中笔 m_x = None m_y = None # 为画图所准备的 Done = False # 设置免按 XY = 0 axy = [0, 0, 0] # 坐标系 XY_x = 0 XY_y = 0 # 原点坐标 X_P = [] # X点 Y_C = [] # Y点 X_L = [] # X个数 Y_L = [] # Y个数 X_M = [] Y_M = [] _KD = 60 # 坐标系跨度调节 ZJ = 0 # 中键模式 Line = [] # 画线列表 Rect = [] # 画矩阵和圆列表 Poly = [] # 画多边形列表 Talk = ''#设置备注 BC_Dic = ''#保存路径 Tip = [0,0,0,0,0]#底部显示信息[x,y,左键,中间,右键] Done_Name = {1:'绘制坐标系',2:'绘制直线(g)',3:'填充矩形(f)',4:'线条矩形(s)', 5:'绘制横线(k)',6:'绘制竖线(l)',7:'绘制多段线(j)', 8:'绘制横打点多段线(i)',9:'绘制竖打点多段线(u)',10:'坐标测绘(h)', 11:'绘制虚线(q)',12:'填充圆形(c)',13:'线条圆形(v)',14:'多边形(n-填充,m-线条)', 15:'填充椭圆形(e)',16:'线条椭圆形(r)',0:'None'}#快捷键名字 #绘制函数 def HS(HS_list,JD = 1000): global X_P,X_L,Y_C,Y_L,Y_M,X_M,pen_C,Z_C,J_C c = [0,0,0]#增函数颜色 X_Done = lambda x: (x - X_L[0]) / (X_L[1] - X_L[0]) * (X_P[1] - X_P[0]) + X_P[0]#x是数值,换算为像素 Y_Done = lambda y: (y - Y_L[0]) / (Y_L[1] - Y_L[0]) * (Y_C[1] - Y_C[0]) + Y_C[0] # x是数值,换算为像素 for i in HS_list: x1 = None # 上一组X和Y y1 = None if HS_list == None:continue D = HS_list[i] try: for x in range((X_L[0]-1)*JD,(X_L[1]+1)*JD,1): x /= JD try: y = D(x) except: x1 = None y1 = None continue try: x2 = X_Done(x) y2 = Y_Done(y) if y2>Y_M[0] or y2X_M[1]: x1 = None y1 = None continue except TypeError:#预防复数 continue if x1 != None: if y1>y2:c=Z_C#增函数 elif y1= 100: p1 = [Line[0][0],Line[1][0]] p2 = {Line[0][0]:Line[0][1],Line[1][0]:Line[1][1]} p1.sort() X1 = p1[0] Y1 = p2[X1] X2 = p1[1] Y2 = p2[X2] a = list(range(X1, X2, 10)) for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替 i += 1 i = 2 * i - 1 x1 = a[i - 1] # 计算两点的x坐标 x2 = a[i] y1 = (x1 - X1) / (X2 - X1) * (Y2 - Y1) + Y1 y2 = (x2 - X1) / (X2 - X1) * (Y2 - Y1) + Y1 pygame.draw.line(root, pen_C, (x1, y1), (x2, y2), d) # 横线 elif abs(Line[0][1]- Line[1][1]) >= 100: p1 = [Line[0][1], Line[1][1]] p2 = {Line[0][1]: Line[0][0], Line[1][1]: Line[1][0]} p1.sort() Y1 = p1[0] X1 = p2[Y1] Y2 = p1[1] X2 = p2[Y2] a = list(range(Y1, Y2, 10)) for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替 i += 1 i = 2 * i - 1 y1 = a[i - 1] # 计算两点的x坐标 y2 = a[i] x1 = (y1 - Y1) / (Y2 - Y1) * (X2 - X1) + X1 x2 = (y2 - Y1) / (Y2 - Y1) * (X2 - X1) + X1 pygame.draw.line(root, pen_C, (x1, y1), (x2, y2), d) # 横线 else: pygame.draw.line(root, pen_C, Line[1], Line[0], d) ZJ = 0 elif ZJ == 12:#画圆模式 Rect.append(event.pos) if len(Rect) == 2: r = int(((Rect[0][0]-Rect[1][0])**2 + (Rect[0][1]-Rect[1][1])**2)**(1/2))#两点间求距离 pygame.draw.circle(root, pen_C, Rect[0], r, 0) ZJ = 0 else: pygame.draw.circle(root, pen_C, Rect[0], d*2, 0) elif ZJ == 13:#画圆线框模式 Rect.append(event.pos) if len(Rect) == 2: r = int(((Rect[0][0]-Rect[1][0])**2 + (Rect[0][1]-Rect[1][1])**2)**(1/2))#两点间求距离 pygame.draw.circle(root, pen_C, Rect[0], r, d) ZJ = 0 else: pygame.draw.circle(root, pen_C, Rect[0], d, 0) elif ZJ == 14: # 画多边形模式 Line.append(event.pos) if len(Line) == 2: pygame.draw.line(root, pen_C, Line[0], Line[1], d) del Line[0] Poly.append(event.pos) elif ZJ == 15:#画椭圆模式 Rect.append(event.pos) if len(Rect) == 2: x = [Rect[0][0],Rect[1][0]] y = [Rect[0][1],Rect[1][1]] x.sort();y.sort() pygame.draw.ellipse(root, pen_C,[x[0], y[0], x[1]-x[0], y[1]-y[0]], 0) ZJ = 0 elif ZJ == 16:#画椭圆边框模式 Rect.append(event.pos) if len(Rect) == 2: x = [Rect[0][0],Rect[1][0]] y = [Rect[0][1],Rect[1][1]] x.sort();y.sort() pygame.draw.ellipse(root, pen_C,[x[0], y[0], x[1]-x[0], y[1]-y[0]], d) ZJ = 0 elif event.button == 1: Tip[2] = 1 pygame.draw.circle(root, pen_C, event.pos, d, 0) m_x = event.pos[0] m_y = event.pos[1] elif event.type == KEYDOWN:#键盘按下(长按不算)快捷键 if event.key == K_d:#不用点击左键画线 if Done: Done = False else: Done = True m_x = None m_y = None elif event.key == K_g:#画直线 Talk = '根据两个端点画直线' ZJ = 2 Line = [] Rect = [] Poly = [] elif event.key == K_f:#画矩阵 ZJ = 3 Talk = '根据两个相对的顶点绘制矩形' Line = [] Rect = [] Poly = [] elif event.key == K_s:#画矩阵边框 ZJ = 4 Talk = '根据两个相对的顶点绘制矩形' Line = [] Rect = [] Poly = [] elif event.key == K_k:#画横线 ZJ = 5 Talk = '选择起点和与终点y坐标相同的点' Line = [] Rect = [] Poly = [] elif event.key == K_l:#画竖线 ZJ = 6 Talk = '选择起点和与终点x坐标相同的点' Line = [] Rect = [] Poly = [] elif event.key == K_j:#多段线 if ZJ == 7: ZJ = 0 else: ZJ = 7 Talk = '依次选择多段线的顶点' Line = [] Rect = [] Poly = [] elif event.key == K_i:#多段线横线打点 if ZJ == 8: ZJ = 0 else: ZJ = 8 Talk = '选择终点,依次选择与其他端点y坐标相同的点(点击i结束)' Line = [] Rect = [] Poly = [] elif event.key == K_u:#多段线竖线打点 if ZJ == 9: ZJ = 0 else: ZJ = 9 Talk = '选择终点,依次选择与其他端点x坐标相同的点(点击u结束)' Line = [] Rect = [] Poly = [] elif event.key == K_h:#多段横竖线打点 if ZJ == 10: ZJ = 0 else: ZJ = 10 Talk = '选择参考点,再选择研究对象(点击h结束)' Line = [] Rect = [] Poly = [] elif event.key == K_q:#绘制虚线 ZJ = 11 Talk = '选择虚线的两个端点' Line = [] Rect = [] Poly = [] elif event.key == K_c:#绘制圆形 ZJ = 12 Talk = '选择圆形和圆上任意一点(确定半径)' Line = [] Rect = [] Poly = [] elif event.key == K_v:#绘制圆形线框 ZJ = 13 Talk = '选择圆形和圆上任意一点(确定半径)' Line = [] Rect = [] Poly = [] elif event.key == K_o:#捕捉 Talk = '起点已经捕捉到坐标系原点了' Line=[[XY_x,XY_y]] Rect=[[XY_x,XY_y]] Poly=[[XY_x,XY_y]] elif event.key == K_y:#捕捉上y轴 if len(Line) >= 1: Talk = '起点已经移动到坐标系y轴上了' Line[0][0] = XY_x if len(Rect) >= 1: Talk = '起点已经移动到坐标系y轴上了' Rect[0][0] = XY_x if len(Poly) >= 1: Talk = '起点已经移动到坐标系y轴上了' Rect[0][0] = XY_x elif event.key == K_x:#捕捉上x轴 if len(Line) >= 1: Talk = '起点已经移动到坐标系x轴上了' Line[0][1] = XY_y if len(Rect) >= 1: Talk = '起点已经移动到坐标系x轴上了' Rect[0][1] = XY_y if len(Poly) >= 1: Talk = '起点已经移动到坐标系x轴上了' Rect[0][1] = XY_y elif event.key == K_n: # 画多边形 if ZJ == 14: ZJ = 0 pygame.draw.polygon(root,pen_C,Poly,0) else: Talk = '依次选择多边形的各个端点(点击n闭合并填充)' ZJ = 14 elif event.key == K_m: # 画多边形边框 if ZJ == 14: ZJ = 0 pygame.draw.polygon(root, pen_C, Poly, d) else: Talk = '依次选择多边形的各个端点(点击m闭合)' ZJ = 14 Line = [] Rect = [] Poly = [] elif event.key == K_e:#绘制填充椭圆 ZJ = 15 Talk = '选择椭圆外界矩形的两个相对的顶点' Line = [] Rect = [] Poly = [] elif event.key == K_r:#绘制椭圆边框 ZJ = 16 Talk = '选择椭圆外界矩形的两个相对的顶点' Line = [] Rect = [] Poly = [] elif event.key == K_w:#保存 if BC_Dic != '': pygame.image.save(root, BC_Dic) # 保存当前环境 elif event.key == K_b:#清空当前操作 ZJ = 0 Line = [] Rect = [] Poly = [] # 快捷键操作指南 # d-不用点击左键画线(再次点击关闭) # g-画直线 # f-画填充矩阵 # s-画矩阵边框 # k-画横线 # l-画竖线 # j-画多段线 # i-横线多段线打点(再次点击结束绘制) # u-竖线多段线打点(再次点击结束绘制) # h-横线和竖线多段线打点并由虚线标注(再次点击结束绘制) # q-绘制虚线 # c-绘制填充圆形 # v-绘制圆形边框 # n和m-绘制多边形 # n-再次点击完成填充多边形绘制 # m-再次点击完成多边形边框绘制 # o-捕捉坐标原点(请先点击功能快捷键) # x-捕捉坐标x轴(请先点击功能快捷键并选择起点) # y-捕捉坐标y轴(同上) # b-关闭当前所有快捷键操作 # e-绘制填充椭圆 # r-绘制椭圆边框