Write.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. import pygame
  2. from pygame.locals import *
  3. from CGB.TK import CC
  4. import time
  5. import os
  6. #定义一些变量
  7. pen_C = [0, 0, 0] # 画笔颜色
  8. Z_C = [0,0,255]
  9. J_C = [255,0,0]
  10. d = 2 # 圆形的粗细(线条*2)=中笔
  11. m_x = None
  12. m_y = None # 为画图所准备的
  13. Done = False # 设置免按
  14. XY = 0
  15. axy = [0, 0, 0] # 坐标系
  16. XY_x = 0
  17. XY_y = 0 # 原点坐标
  18. X_P = [] # X点
  19. Y_C = [] # Y点
  20. X_L = [] # X个数
  21. Y_L = [] # Y个数
  22. X_M = []
  23. Y_M = []
  24. _KD = 60 # 坐标系跨度调节
  25. ZJ = 0 # 中键模式
  26. Line = [] # 画线列表
  27. Rect = [] # 画矩阵和圆列表
  28. Poly = [] # 画多边形列表
  29. Talk = ''#设置备注
  30. BC_Dic = ''#保存路径
  31. Tip = [0,0,0,0,0]#底部显示信息[x,y,左键,中间,右键]
  32. Done_Name = {1:'绘制坐标系',2:'绘制直线(g)',3:'填充矩形(f)',4:'线条矩形(s)',
  33. 5:'绘制横线(k)',6:'绘制竖线(l)',7:'绘制多段线(j)',
  34. 8:'绘制横打点多段线(i)',9:'绘制竖打点多段线(u)',10:'坐标测绘(h)',
  35. 11:'绘制虚线(q)',12:'填充圆形(c)',13:'线条圆形(v)',14:'多边形(n-填充,m-线条)',
  36. 15:'填充椭圆形(e)',16:'线条椭圆形(r)',0:'None'}#快捷键名字
  37. #绘制函数
  38. def HS(HS_list,JD = 1000):
  39. global X_P,X_L,Y_C,Y_L,Y_M,X_M,pen_C,Z_C,J_C
  40. c = [0,0,0]#增函数颜色
  41. X_Done = lambda x: (x - X_L[0]) / (X_L[1] - X_L[0]) * (X_P[1] - X_P[0]) + X_P[0]#x是数值,换算为像素
  42. Y_Done = lambda y: (y - Y_L[0]) / (Y_L[1] - Y_L[0]) * (Y_C[1] - Y_C[0]) + Y_C[0] # x是数值,换算为像素
  43. for i in HS_list:
  44. x1 = None # 上一组X和Y
  45. y1 = None
  46. if HS_list == None:continue
  47. D = HS_list[i]
  48. try:
  49. for x in range((X_L[0]-1)*JD,(X_L[1]+1)*JD,1):
  50. x /= JD
  51. try:
  52. y = D(x)
  53. except:
  54. x1 = None
  55. y1 = None
  56. continue
  57. try:
  58. x2 = X_Done(x)
  59. y2 = Y_Done(y)
  60. if y2>Y_M[0] or y2<Y_M[1] or x2<X_M[0] or x2>X_M[1]:
  61. x1 = None
  62. y1 = None
  63. continue
  64. except TypeError:#预防复数
  65. continue
  66. if x1 != None:
  67. if y1>y2:c=Z_C#增函数
  68. elif y1<y2:c=J_C#减函数#改为检查Y数值而不是坐标
  69. pygame.draw.line(root, c, (int(x1),int(y1)), (int(x2),int(y2)), d)
  70. x1 = x2
  71. y1 = y2
  72. except IndexError:
  73. break
  74. #画曲线系统
  75. def draw_Line(xy,c=False):#c-是否带点
  76. global m_x,m_y
  77. if c:pygame.draw.circle(root, pen_C, xy, d, 0)
  78. if m_x != None:
  79. pygame.draw.line(root,pen_C,(m_x,m_y), xy, d)
  80. m_x = xy[0]
  81. m_y = xy[1]
  82. #绘制XY坐标系
  83. def XYZ_ZBX(s_x,s_y,p = (-100, 100),c = (-200, 100),kd = 10,b = 3,jt = 3,r = 3):
  84. kd = abs(kd)#kd大于0
  85. global d,XY_x,XY_y,X_L,X_P,Y_L,Y_C,X_M,Y_M
  86. XY_x = s_x
  87. XY_y = s_y#存储原点坐标
  88. X_M = [s_x + p[0],s_x + p[1]]
  89. Y_M = [s_y + c[1],s_y + c[0]]
  90. pygame.draw.circle(root, pen_C, (s_x, s_y), r, 0)#绘制原点
  91. pygame.draw.line(root, pen_C, (s_x + p[0], s_y), (s_x + p[1], s_y), d) # X轴,Y定
  92. pygame.draw.line(root, pen_C, (s_x, s_y + c[0]), (s_x, s_y + c[1]), d) # y轴,x定
  93. _a = 0#刻度统计
  94. _c = 0
  95. for i in range(s_x ,s_x + p[0], -kd):#右
  96. _a -= 1
  97. pygame.draw.line(root, pen_C, (i, s_y + b), (i, s_y), d)
  98. _c = i
  99. _b = 0
  100. _d = 0
  101. for i in range(s_x, s_x + p[1], kd):#刻度#左
  102. _b += 1
  103. pygame.draw.line(root, pen_C, (i, s_y + b), (i, s_y), d)
  104. _d = i
  105. X_L = [_a+1,_b-1]
  106. X_P = [_c,_d]
  107. _a = 0
  108. _c = 0
  109. for i in range(s_y, s_y + c[0], -kd):#上
  110. _a += 1
  111. pygame.draw.line(root, pen_C, (s_x + b, i), (s_x, i), d)
  112. _c = i
  113. _b = 0
  114. _d = 0
  115. for i in range(s_y, s_y + c[1], kd):#下
  116. _b -= 1
  117. pygame.draw.line(root, pen_C, (s_x + b, i), (s_x, i), d)
  118. _d = i
  119. Y_L = [_b+1,_a-1]
  120. Y_C = [_d,_c]
  121. #箭头
  122. pygame.draw.line(root, pen_C, (s_x + p[1], s_y), (s_x + p[1] - jt, s_y + jt), d) # X上
  123. pygame.draw.line(root, pen_C, (s_x + p[1], s_y), (s_x + p[1] - jt, s_y - jt), d) # X下
  124. pygame.draw.line(root, pen_C, (s_x, s_y + c[0]), (s_x - jt, s_y + c[0] + jt), d) # y左
  125. pygame.draw.line(root, pen_C, (s_x, s_y + c[0]), (s_x + jt, s_y + c[0] + jt), d) # X下
  126. def New_Tip():
  127. #绘制顶部
  128. global d,Font,Tip,Screen_x,Screen_y,ZJ,BC_Dic,Done_Name,Done,XY_x,XY_y,Talk,Line,Rect,Poly,pen_C,Z_C,J_C,axy,_KD
  129. if Done:mod_d = '启动无点击画线(点击d关闭)'
  130. else:mod_d = '关闭无点击画线'
  131. pygame.draw.rect(root,[255,255,255], [0,0,Screen_x,16], 0)
  132. pygame.draw.rect(root, [255, 255, 255], [0, Screen_y-16, Screen_x, Screen_y], 0)
  133. p = ''
  134. if ZJ == 0: Talk = ''
  135. if axy != [0,0,0]:
  136. a = []
  137. for i in axy:
  138. if i != 0:a.append(i)
  139. p += f'坐标端点:{str(a)} '
  140. if Line:
  141. p += f'端点:{str(Line)} '
  142. if Rect:
  143. p += f'顶点(圆心):{str(Rect)} '
  144. if Poly:
  145. p += f'多顶点:{str(Poly)} '
  146. if Done or ZJ != 0:
  147. TIP3 = Font.render(f'模式:{mod_d} , {Done_Name[ZJ]} {Talk}', True, (0, 0, 0))
  148. else:
  149. s = ''
  150. if BC_Dic:s = f'保存路径(w):{BC_Dic}'
  151. TIP3 = Font.render(f'{time.strftime("%Y/%m/%d %I:%M")} {s}', True, (0, 0, 0))
  152. p = ''
  153. if p == '':
  154. p = f'主色调:{pen_C} 增函数颜色:{Z_C} 减函数颜色:{J_C}'
  155. TIP = Font.render(f'鼠标:{Tip[0]},{Tip[1]}',True, (0, 0, 0))
  156. TIP2 = Font.render(f'{Tip[2]},{Tip[3]},{Tip[4]} ; 大小:{d} ; 原点:{XY_x},{XY_y} ; 跨度:{_KD} ; {p}', True, (0, 0, 0))
  157. root.blit(TIP, (0, 0))
  158. root.blit(TIP2, (100, 0))
  159. root.blit(TIP3, (0, Screen_y - 16))
  160. #主程序
  161. def Draw(dis_x=900,dis_y=700):
  162. global m_x, m_y,pen_C,d,BG,XY,axy,XY_x,XY_y,_KD,Line,Done,ZJ,Rect,Poly,root,root_caption,done,m_x, m_y,BC_Dic#定义全局变量
  163. global Z_C,J_C,Tip,Font,Screen_x,Screen_y,Talk,Font
  164. Screen_x = dis_x
  165. Screen_y = dis_y
  166. done = pygame.init() # 初始化所有模块
  167. if done[1] != 0: print('Init!') # 检查是否错误
  168. Font = pygame.font.Font('Font\ZKST.ttf', 16) # 设置字体(Linux下应该用\而不是/)
  169. root = pygame.display.set_mode((dis_x, dis_y),0) # 创建屏幕
  170. root_caption = pygame.display.set_caption('CoTan画图板')#定义标题(后期加上定义Logo)
  171. root.fill([255, 255, 255]) # 默认用白色填充窗口
  172. flat = True#循环条件(不是全局)
  173. while flat:
  174. New_Tip()
  175. pygame.display.update()#屏幕刷新
  176. for event in pygame.event.get():#事件检查
  177. if event.type == QUIT:#退出事件
  178. pygame.quit()
  179. flat = False
  180. break
  181. elif event.type == MOUSEMOTION:#鼠标移动事件
  182. Tip[0],Tip[1] = event.pos
  183. Tip[2],Tip[3],Tip[4] = event.buttons
  184. if event.buttons == (1, 0, 0):#左键点击
  185. draw_Line(event.pos)
  186. elif event.buttons == (0, 0, 0):#无点击绘图(启动快捷键d)
  187. if Done:
  188. draw_Line(event.pos)
  189. else:#m_x和m_y是指上一点的xy,用于画线系统
  190. m_x = None
  191. m_y = None
  192. elif event.type == MOUSEBUTTONDOWN:#鼠标按下
  193. event.pos = list(event.pos)
  194. if event.button == 3:#右键点击
  195. Tip[4] = 1
  196. pygame.image.save(root,'$CoTanCC.png')#保存当前环境
  197. root = pygame.display.set_mode((dis_x, dis_y), pygame.NOFRAME)#隐藏关闭按钮
  198. bg = pygame.image.load('$CoTanCC.png').convert()#加载位图
  199. root.blit(bg, (0, 0))#绘制位图
  200. pygame.display.update()#更新屏幕
  201. g = CC()#启动工具箱
  202. root = pygame.display.set_mode((dis_x, dis_y), 0)#显示关闭按钮
  203. bg = pygame.image.load('$CoTanCC.png').convert()#加载位图
  204. root.blit(bg, (0, 0))#绘制位图
  205. pygame.display.update()#更新屏幕
  206. os.remove('$CoTanCC.png')
  207. if g[0] != None:pen_C = g[0]#设置颜色
  208. if g[1] != None:d = g[1]#设置笔的粗细
  209. if g[2] != None: root.fill(g[2])#设置背景填充
  210. if g[3] == 1:#绘制坐标系
  211. Talk = '选择坐标三个端点'
  212. ZJ = 1
  213. XY = 3
  214. _KD = 60
  215. elif g[3] == 2:#绘制坐标系2(小跨度)
  216. Talk = '选择坐标三个端点'
  217. ZJ = 1
  218. XY = 3
  219. _KD = 20
  220. elif g[3] == 3:#绘制坐标系3(大跨度)
  221. Talk = '选择坐标三个端点'
  222. ZJ = 1
  223. XY = 3
  224. _KD = 120#坐标系跨度(字定义跨度再下面)
  225. else:
  226. ZJ = 0
  227. XY = 0#恢复选项
  228. if g[6] != None: Z_C = g[6] # 增函数颜色(要在函数绘制之前设置好)
  229. if g[7] != None: J_C = g[7] # 减函数颜色
  230. if g[4] != {}:HS(g[4])#函数绘制
  231. if g[5] != None:
  232. pygame.image.save(root, g[5]) # 保存当前环境
  233. BC_Dic = g[5]
  234. if g[8] != None: _KD = g[8] # 自定义跨度
  235. if g[9] != None:
  236. try:
  237. bg_im = pygame.image.load(g[9]).convert() # 加载位图
  238. root.blit(bg_im, (0, 0)) # 绘制位图
  239. except:pass
  240. #恢复参数
  241. m_x = None
  242. m_y = None
  243. Done = False
  244. pygame.event.clear()
  245. elif event.button == 2:#中键点击,ZJ是指中键的模式,来自快捷键和工具箱
  246. Tip[3] = 1
  247. if ZJ == 1:#坐标系模式
  248. Talk = '选择下一个端点(共3个)'
  249. axy[XY-1] = event.pos#存储
  250. XY -= 1
  251. if XY == 0:
  252. x = []
  253. y = []
  254. for i in axy:
  255. x.append(i[0])
  256. y.append(i[1])
  257. x.sort()
  258. y.sort()#排序
  259. s_x = x[1]
  260. s_y = y[1]
  261. p = (-abs(x[0] - x[1]), abs(x[1] - x[2]))
  262. c = (-abs(y[0] - y[1]), abs(y[1] - y[2]))
  263. b = 2 * d
  264. r = 2 * d
  265. jt = 3 * d
  266. XYZ_ZBX(s_x,s_y,p,c,_KD,b,jt,r)
  267. axy = [0,0,0]
  268. ZJ = 0
  269. elif ZJ == 2:#画线模式
  270. Line.append(event.pos)
  271. # pygame.draw.circle(root, pen_C, event.pos, d, 0)
  272. if len(Line) == 2:
  273. pygame.draw.line(root, pen_C, Line[0],Line[1], d)
  274. ZJ = 0
  275. elif ZJ == 3 or ZJ == 4:#画矩形模式
  276. Rect.append(event.pos)
  277. if len(Rect) == 2:
  278. x = [Rect[0][0],Rect[1][0]]
  279. y = [Rect[0][1],Rect[1][1]]
  280. x.sort();y.sort()
  281. if ZJ == 3:dx = 0
  282. else:dx = d
  283. pygame.draw.rect(root, pen_C, [x[0], y[0], x[1]-x[0], y[1]-y[0]], dx)
  284. ZJ = 0
  285. elif ZJ == 5:#画横线模式
  286. Line.append(event.pos)
  287. if len(Line) == 2:
  288. pygame.draw.line(root, pen_C, Line[0],(Line[1][0],Line[0][1]), d)
  289. ZJ = 0
  290. elif ZJ == 6:#画竖线模式
  291. Line.append(event.pos)
  292. if len(Line) == 2:
  293. pygame.draw.line(root, pen_C, Line[0],(Line[0][0],Line[1][1]), d)
  294. ZJ = 0
  295. elif ZJ == 7:#画线多段线
  296. Line.append(event.pos)
  297. if len(Line) == 2:
  298. pygame.draw.line(root, pen_C, Line[0],Line[1], d)
  299. del Line[0]
  300. elif ZJ == 8:#画横线多段线
  301. Line.append(event.pos)
  302. if len(Line) == 2:
  303. pygame.draw.line(root, pen_C, Line[0],(Line[1][0],Line[0][1]), d)
  304. pygame.draw.circle(root, pen_C, (Line[1][0],Line[0][1]), d*2, 0)
  305. del Line[1]
  306. else:
  307. pygame.draw.circle(root, pen_C, event.pos, d, 0)
  308. elif ZJ == 9:#画竖线多段线
  309. Line.append(event.pos)
  310. if len(Line) == 2:
  311. pygame.draw.line(root, pen_C, Line[0],(Line[0][0],Line[1][1]), d)
  312. pygame.draw.circle(root, pen_C, (Line[0][0],Line[1][1]), d*2, 0)
  313. del Line[1]
  314. else:
  315. pygame.draw.circle(root, pen_C, event.pos, d, 0)
  316. elif ZJ == 10:#画竖线和横线多段线
  317. Line.append(event.pos)
  318. if len(Line) == 2:
  319. pygame.draw.line(root, pen_C, Line[0], (Line[1][0], Line[0][1]), d)#横线
  320. pygame.draw.circle(root, pen_C, (Line[1][0], Line[0][1]), d*2, 0)
  321. pygame.draw.circle(root, pen_C, (Line[1][0], Line[1][1]), d * 2, 0)
  322. pygame.draw.line(root, pen_C, Line[0],(Line[0][0],Line[1][1]), d)#竖线
  323. pygame.draw.circle(root, pen_C, (Line[0][0],Line[1][1]), d*2, 0)
  324. #垂直于横线的虚线
  325. p = [Line[1][1],Line[0][1]]
  326. p.sort()
  327. Y1 = p[0]
  328. Y2 = p[1]
  329. a = list(range(Y1, Y2, 10))
  330. for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替
  331. i += 1
  332. i = 2 * i - 1
  333. y1 = a[i - 1] # 计算两点的y坐标
  334. y2 = a[i]
  335. pygame.draw.line(root, pen_C, (Line[1][0], y1), (Line[1][0], y2), d) # 横线
  336. # 垂直于竖线的虚线
  337. p = [Line[1][0],Line[0][0]]
  338. p.sort()
  339. X1 = p[0]
  340. X2 = p[1]
  341. a = list(range(X1, X2, 10))
  342. for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替
  343. i += 1
  344. i = 2 * i - 1
  345. x1 = a[i - 1] # 计算两点的x坐标
  346. x2 = a[i]
  347. pygame.draw.line(root, pen_C, (x1, Line[1][1]), (x2, Line[1][1]), d) # 横线
  348. del Line[1]
  349. else:
  350. pygame.draw.circle(root, pen_C, event.pos, d, 0)
  351. elif ZJ == 11:#画虚线线模式
  352. Line.append(event.pos)
  353. pygame.draw.circle(root, pen_C, event.pos, d, 0)
  354. if len(Line) == 2:
  355. if abs(Line[0][0]- Line[1][0]) >= 100:
  356. p1 = [Line[0][0],Line[1][0]]
  357. p2 = {Line[0][0]:Line[0][1],Line[1][0]:Line[1][1]}
  358. p1.sort()
  359. X1 = p1[0]
  360. Y1 = p2[X1]
  361. X2 = p1[1]
  362. Y2 = p2[X2]
  363. a = list(range(X1, X2, 10))
  364. for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替
  365. i += 1
  366. i = 2 * i - 1
  367. x1 = a[i - 1] # 计算两点的x坐标
  368. x2 = a[i]
  369. y1 = (x1 - X1) / (X2 - X1) * (Y2 - Y1) + Y1
  370. y2 = (x2 - X1) / (X2 - X1) * (Y2 - Y1) + Y1
  371. pygame.draw.line(root, pen_C, (x1, y1), (x2, y2), d) # 横线
  372. elif abs(Line[0][1]- Line[1][1]) >= 100:
  373. p1 = [Line[0][1], Line[1][1]]
  374. p2 = {Line[0][1]: Line[0][0], Line[1][1]: Line[1][0]}
  375. p1.sort()
  376. Y1 = p1[0]
  377. X1 = p2[Y1]
  378. Y2 = p1[1]
  379. X2 = p2[Y2]
  380. a = list(range(Y1, Y2, 10))
  381. for i in range(int(len(a) / 2)): # 向下取整,可用math.ceil代替
  382. i += 1
  383. i = 2 * i - 1
  384. y1 = a[i - 1] # 计算两点的x坐标
  385. y2 = a[i]
  386. x1 = (y1 - Y1) / (Y2 - Y1) * (X2 - X1) + X1
  387. x2 = (y2 - Y1) / (Y2 - Y1) * (X2 - X1) + X1
  388. pygame.draw.line(root, pen_C, (x1, y1), (x2, y2), d) # 横线
  389. else:
  390. pygame.draw.line(root, pen_C, Line[1], Line[0], d)
  391. ZJ = 0
  392. elif ZJ == 12:#画圆模式
  393. Rect.append(event.pos)
  394. if len(Rect) == 2:
  395. r = int(((Rect[0][0]-Rect[1][0])**2 + (Rect[0][1]-Rect[1][1])**2)**(1/2))#两点间求距离
  396. pygame.draw.circle(root, pen_C, Rect[0], r, 0)
  397. ZJ = 0
  398. else:
  399. pygame.draw.circle(root, pen_C, Rect[0], d*2, 0)
  400. elif ZJ == 13:#画圆线框模式
  401. Rect.append(event.pos)
  402. if len(Rect) == 2:
  403. r = int(((Rect[0][0]-Rect[1][0])**2 + (Rect[0][1]-Rect[1][1])**2)**(1/2))#两点间求距离
  404. pygame.draw.circle(root, pen_C, Rect[0], r, d)
  405. ZJ = 0
  406. else:
  407. pygame.draw.circle(root, pen_C, Rect[0], d, 0)
  408. elif ZJ == 14: # 画多边形模式
  409. Line.append(event.pos)
  410. if len(Line) == 2:
  411. pygame.draw.line(root, pen_C, Line[0], Line[1], d)
  412. del Line[0]
  413. Poly.append(event.pos)
  414. elif ZJ == 15:#画椭圆模式
  415. Rect.append(event.pos)
  416. if len(Rect) == 2:
  417. x = [Rect[0][0],Rect[1][0]]
  418. y = [Rect[0][1],Rect[1][1]]
  419. x.sort();y.sort()
  420. pygame.draw.ellipse(root, pen_C,[x[0], y[0], x[1]-x[0], y[1]-y[0]], 0)
  421. ZJ = 0
  422. elif ZJ == 16:#画椭圆边框模式
  423. Rect.append(event.pos)
  424. if len(Rect) == 2:
  425. x = [Rect[0][0],Rect[1][0]]
  426. y = [Rect[0][1],Rect[1][1]]
  427. x.sort();y.sort()
  428. pygame.draw.ellipse(root, pen_C,[x[0], y[0], x[1]-x[0], y[1]-y[0]], d)
  429. ZJ = 0
  430. elif event.button == 1:
  431. Tip[2] = 1
  432. pygame.draw.circle(root, pen_C, event.pos, d, 0)
  433. m_x = event.pos[0]
  434. m_y = event.pos[1]
  435. elif event.type == KEYDOWN:#键盘按下(长按不算)快捷键
  436. if event.key == K_d:#不用点击左键画线
  437. if Done:
  438. Done = False
  439. else:
  440. Done = True
  441. m_x = None
  442. m_y = None
  443. elif event.key == K_g:#画直线
  444. Talk = '根据两个端点画直线'
  445. ZJ = 2
  446. Line = []
  447. Rect = []
  448. Poly = []
  449. elif event.key == K_f:#画矩阵
  450. ZJ = 3
  451. Talk = '根据两个相对的顶点绘制矩形'
  452. Line = []
  453. Rect = []
  454. Poly = []
  455. elif event.key == K_s:#画矩阵边框
  456. ZJ = 4
  457. Talk = '根据两个相对的顶点绘制矩形'
  458. Line = []
  459. Rect = []
  460. Poly = []
  461. elif event.key == K_k:#画横线
  462. ZJ = 5
  463. Talk = '选择起点和与终点y坐标相同的点'
  464. Line = []
  465. Rect = []
  466. Poly = []
  467. elif event.key == K_l:#画竖线
  468. ZJ = 6
  469. Talk = '选择起点和与终点x坐标相同的点'
  470. Line = []
  471. Rect = []
  472. Poly = []
  473. elif event.key == K_j:#多段线
  474. if ZJ == 7:
  475. ZJ = 0
  476. else:
  477. ZJ = 7
  478. Talk = '依次选择多段线的顶点'
  479. Line = []
  480. Rect = []
  481. Poly = []
  482. elif event.key == K_i:#多段线横线打点
  483. if ZJ == 8:
  484. ZJ = 0
  485. else:
  486. ZJ = 8
  487. Talk = '选择终点,依次选择与其他端点y坐标相同的点(点击i结束)'
  488. Line = []
  489. Rect = []
  490. Poly = []
  491. elif event.key == K_u:#多段线竖线打点
  492. if ZJ == 9:
  493. ZJ = 0
  494. else:
  495. ZJ = 9
  496. Talk = '选择终点,依次选择与其他端点x坐标相同的点(点击u结束)'
  497. Line = []
  498. Rect = []
  499. Poly = []
  500. elif event.key == K_h:#多段横竖线打点
  501. if ZJ == 10:
  502. ZJ = 0
  503. else:
  504. ZJ = 10
  505. Talk = '选择参考点,再选择研究对象(点击h结束)'
  506. Line = []
  507. Rect = []
  508. Poly = []
  509. elif event.key == K_q:#绘制虚线
  510. ZJ = 11
  511. Talk = '选择虚线的两个端点'
  512. Line = []
  513. Rect = []
  514. Poly = []
  515. elif event.key == K_c:#绘制圆形
  516. ZJ = 12
  517. Talk = '选择圆形和圆上任意一点(确定半径)'
  518. Line = []
  519. Rect = []
  520. Poly = []
  521. elif event.key == K_v:#绘制圆形线框
  522. ZJ = 13
  523. Talk = '选择圆形和圆上任意一点(确定半径)'
  524. Line = []
  525. Rect = []
  526. Poly = []
  527. elif event.key == K_o:#捕捉
  528. Talk = '起点已经捕捉到坐标系原点了'
  529. Line=[[XY_x,XY_y]]
  530. Rect=[[XY_x,XY_y]]
  531. Poly=[[XY_x,XY_y]]
  532. elif event.key == K_y:#捕捉上y轴
  533. if len(Line) >= 1:
  534. Talk = '起点已经移动到坐标系y轴上了'
  535. Line[0][0] = XY_x
  536. if len(Rect) >= 1:
  537. Talk = '起点已经移动到坐标系y轴上了'
  538. Rect[0][0] = XY_x
  539. if len(Poly) >= 1:
  540. Talk = '起点已经移动到坐标系y轴上了'
  541. Rect[0][0] = XY_x
  542. elif event.key == K_x:#捕捉上x轴
  543. if len(Line) >= 1:
  544. Talk = '起点已经移动到坐标系x轴上了'
  545. Line[0][1] = XY_y
  546. if len(Rect) >= 1:
  547. Talk = '起点已经移动到坐标系x轴上了'
  548. Rect[0][1] = XY_y
  549. if len(Poly) >= 1:
  550. Talk = '起点已经移动到坐标系x轴上了'
  551. Rect[0][1] = XY_y
  552. elif event.key == K_n: # 画多边形
  553. if ZJ == 14:
  554. ZJ = 0
  555. pygame.draw.polygon(root,pen_C,Poly,0)
  556. else:
  557. Talk = '依次选择多边形的各个端点(点击n闭合并填充)'
  558. ZJ = 14
  559. elif event.key == K_m: # 画多边形边框
  560. if ZJ == 14:
  561. ZJ = 0
  562. pygame.draw.polygon(root, pen_C, Poly, d)
  563. else:
  564. Talk = '依次选择多边形的各个端点(点击m闭合)'
  565. ZJ = 14
  566. Line = []
  567. Rect = []
  568. Poly = []
  569. elif event.key == K_e:#绘制填充椭圆
  570. ZJ = 15
  571. Talk = '选择椭圆外界矩形的两个相对的顶点'
  572. Line = []
  573. Rect = []
  574. Poly = []
  575. elif event.key == K_r:#绘制椭圆边框
  576. ZJ = 16
  577. Talk = '选择椭圆外界矩形的两个相对的顶点'
  578. Line = []
  579. Rect = []
  580. Poly = []
  581. elif event.key == K_w:#保存
  582. if BC_Dic != '':
  583. pygame.image.save(root, BC_Dic) # 保存当前环境
  584. elif event.key == K_b:#清空当前操作
  585. ZJ = 0
  586. Line = []
  587. Rect = []
  588. Poly = []
  589. # 快捷键操作指南
  590. # d-不用点击左键画线(再次点击关闭)
  591. # g-画直线
  592. # f-画填充矩阵
  593. # s-画矩阵边框
  594. # k-画横线
  595. # l-画竖线
  596. # j-画多段线
  597. # i-横线多段线打点(再次点击结束绘制)
  598. # u-竖线多段线打点(再次点击结束绘制)
  599. # h-横线和竖线多段线打点并由虚线标注(再次点击结束绘制)
  600. # q-绘制虚线
  601. # c-绘制填充圆形
  602. # v-绘制圆形边框
  603. # n和m-绘制多边形
  604. # n-再次点击完成填充多边形绘制
  605. # m-再次点击完成多边形边框绘制
  606. # o-捕捉坐标原点(请先点击功能快捷键)
  607. # x-捕捉坐标x轴(请先点击功能快捷键并选择起点)
  608. # y-捕捉坐标y轴(同上)
  609. # b-关闭当前所有快捷键操作
  610. # e-绘制填充椭圆
  611. # r-绘制椭圆边框