鱼C论坛

 找回密码
 立即注册
查看: 1217|回复: 1

[已解决]当有多个文件时调用时代码思路混乱。如何优化这段代码

[复制链接]
发表于 2020-9-25 10:00:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    我想用python实现cad的一些自动画图,先是写了一个基本功能,弄了一些类分别画矩形画菱形插入文字之类,运行结果是可以的,f5之后通过在idle里输入命令画出来。  、
但实际用的时候;这样肯定不行,又繁琐别人不会用而且还不如直接画省力。所以需要做图形化,做到点一下按钮就相当于输入了这个命令。
于是我就跟着小甲鱼的教程的Tkinter的部分往下写了,新弄了一个图形界面文件来实现调用之前基本功能的文件。然后中途出现很多****变量未定义、没有**方法之类的问题。
现在这些问题虽然解决了(程序能够正常运行实现功能),但是中间的代码结构感觉肯定有些问题,不够规范,理解也不深,就是一点试错改出来的。使得其繁琐,以后修改也容易出错。
所以想问问大家怎么修改一下,能使得代码变得更好一些。比如我觉得是不是不需要这么多self不需要重复定义这么多方法??因为我想同步修改另一个文件里多个类里相同的属性所以每个类都设定了方法和类中的属性,这些感觉应该可以简化?
还有在之前的提问中,有大佬说一般不要实例化,而写成:if __name__ == '__main__':    这个是为什么呢?我用实例化是当时想着运行的时候类里就要执行的命令应该放在实例化里,这个理解大概有问题,应该如何理解如何修改代码呢?

下面是代码,两个文件,分别是现基本画图插入文字功能的代码plant.py和图形界面化的代码(引用了plant.py)

plant、:
  1. from pyautocad import Autocad, APoint,aDouble
  2. acad = Autocad(create_if_not_exists = True)
  3. import math
  4. import numpy as np
  5. pyacad = Autocad(create_if_not_exists=True)
  6. pyacad.prompt("Hello! AutoCAD from pyautocad.")
  7. print(pyacad.doc.Name)
  8. CPX = 500 #中心点 CenterPointX
  9. CPY = 500 # CenterPointY
  10. DeltaX = 50 #间距
  11. DeltaY = 30
  12. HW = 13 #HalfRWidth 矩形一半宽
  13. HH = 6.5 #HalfRHight 矩形一半高

  14. class SetPoint:
  15.     CPX = 500 #中心点 CenterPointX
  16.     CPY = 500 # CenterPointY
  17.     def creat(self):
  18.         self.juxing = Rectangle()
  19.         self.lingxing = Choose()
  20.         self.wenzi = InsertText()
  21.         self.block = Block()

  22.     def set_CP(self):
  23.         self.CPX = float(input('请输入x坐标:'))
  24.         self.CPY = float(input('请输入y坐标:'))
  25.         self.juxing.set_CP()
  26.         self.lingxing.set_CP()
  27.         self.wenzi.set_CP()
  28.         self.block.set_CP()
  29.         

  30.     def set_Delta(self):
  31.         Delta = float(input('请设置间隔:'))
  32.         DeltaX = Delta + 2*HW
  33.         DeltaY = Delta + 2*HH

  34.     def set_RWH(self):
  35.         self.juxing.set_RWH()

  36.     def set_RCH(self):
  37.         self.lingxing.set_RWH()


  38.     def changeUpCP(self):
  39.         self.juxing.changeUpCP()
  40.         self.lingxing.changeUpCP()
  41.         self.wenzi.changeUpCP()
  42.         self.block.changeUpCP()
  43.    
  44.     def changeDownCP(self):
  45.         self.juxing.changeDownCP()
  46.         self.lingxing.changeDownCP()
  47.         self.wenzi.changeDownCP()
  48.         self.block.changeDownCP()

  49.     def changeLeftCP(self):
  50.         self.juxing.changeLeftCP()
  51.         self.lingxing.changeLeftCP()
  52.         self.wenzi.changeLeftCP()
  53.         self.block.changeLeftCP()


  54.     def changeRightCP(self):
  55.         self.juxing.changeRightCP()
  56.         self.lingxing.changeRightCP()
  57.         self.wenzi.changeRightCP()
  58.         self.block.changeRightCP()

  59. class Rectangle:
  60.     HRW = 13 #HalfRWidth 矩形一半宽
  61.     HRH = 6.5 #HalfRHight 矩形一半高
  62.     DeltaX = 50 #间距
  63.     DeltaY = 30
  64.    
  65.     def set_CP(self):
  66.         self.CPX = aa.CPX
  67.         self.CPY = aa.CPY
  68.     def set_Delta(self):
  69.         self.Delta = aa.Delta
  70.         self.DeltaX = Delta + 2*HW
  71.         self.DeltaY = Delta + 2*HH

  72.     def set_RWH(self):
  73.         self.HRW = float(input('请输入矩形的宽度:'))/2
  74.         self.HRH = float(input('请输入矩形的高度:'))/2

  75.     def changeUpCP(self):
  76.         self.CPY = self.CPY + self.DeltaY
  77.    
  78.     def changeDownCP(self):
  79.         self.CPY = self.CPY - self.DeltaY

  80.     def changeLeftCP(self):
  81.         self.CPX = self.CPX - self.DeltaX


  82.     def changeRightCP(self):
  83.         self.CPX = self.CPX + self.DeltaX

  84.         
  85.     def plant(self):
  86.         x = [self.CPX-self.HRW,self.CPX+self.HRW,self.CPX+self.HRW,self.CPX-self.HRW]
  87.         y = [self.CPY+self.HRH,self.CPY+self.HRH,self.CPY-self.HRH,self.CPY-self.HRH]
  88.         pnts = [APoint(x[0], y[0]), APoint(x[1], y[1]), APoint(x[1], y[1]),
  89.         APoint(x[2], y[2]), APoint(x[2], y[2]), APoint(x[3], y[3]),
  90.         APoint(x[3], y[3]), APoint(x[0], y[0])]
  91.         pnts = [j for i in pnts for j in i]  # 将各点坐标顺序变换为行数据
  92.         pnts = aDouble(pnts)  # 转化为双精度浮点数
  93.         plineObj = pyacad.model.AddPolyLine(pnts)
  94.         plineObj.Closed = True  # 闭合多段线


  95.         
  96. class Choose:
  97.     HCW = 13 #HalfRWidth 矩形一半宽
  98.     HCH = 6.5 #HalfRHight 矩形一半高
  99.     DeltaX = 50 #间距
  100.     DeltaY = 30
  101.    
  102.     def set_CP(self):
  103.         self.CPX = aa.CPX
  104.         self.CPY = aa.CPY

  105.     def set_Delta(self):
  106.         self.Delta = aa.Delta
  107.         self.DeltaX = Delta + 2*HW
  108.         self.DeltaY = Delta + 2*HH

  109.     def set_CWH(self):
  110.         self.HCW = float(input('请输入菱形的宽度:'))/2
  111.         self.HCH = float(input('请输入菱形的高度:'))/2

  112.     def changeUpCP(self):
  113.         self.CPY = self.CPY + self.DeltaY
  114.    
  115.     def changeDownCP(self):
  116.         self.CPY = self.CPY - self.DeltaY

  117.     def changeLeftCP(self):
  118.         self.CPX = self.CPX - self.DeltaX


  119.     def changeRightCP(self):
  120.         self.CPX = self.CPX + self.DeltaX

  121.     def plant(self):
  122.         x = [self.CPX,self.CPX+self.HCW,self.CPX,self.CPX-self.HCW]
  123.         y = [self.CPY+self.HCH,self.CPY,self.CPY-self.HCH,self.CPY]
  124.         pnts = [APoint(x[0], y[0]), APoint(x[1], y[1]), APoint(x[1], y[1]),
  125.         APoint(x[2], y[2]), APoint(x[2], y[2]), APoint(x[3], y[3]),
  126.         APoint(x[3], y[3]), APoint(x[0], y[0])]
  127.         pnts = [j for i in pnts for j in i]  # 将各点坐标顺序变换为行数据
  128.         pnts = aDouble(pnts)  # 转化为双精度浮点数
  129.         plineObj = pyacad.model.AddPolyLine(pnts)
  130.         plineObj.Closed = True  # 闭合多段线

  131. class InsertText:
  132.     DeltaX = 50 #间距
  133.     DeltaY = 30
  134.     text = '请在文本框中输入文字'
  135.    
  136.     def set_CP(self):
  137.         self.CPX = aa.CPX
  138.         self.CPY = aa.CPY

  139.     def set_Delta(self):
  140.         self.Delta = aa.Delta
  141.         self.DeltaX = Delta + 2*HCW
  142.         self.DeltaY = Delta + 2*HCH

  143.     def changeUpCP(self):
  144.         self.CPY = self.CPY + self.DeltaY
  145.    
  146.     def changeDownCP(self):
  147.         self.CPY = self.CPY - self.DeltaY

  148.     def changeLeftCP(self):
  149.         self.CPX = self.CPX - self.DeltaX


  150.     def changeRightCP(self):
  151.         self.CPX = self.CPX + self.DeltaX
  152.         
  153.     def in_text(self):
  154.         p = APoint(self.CPX,self.CPY)
  155.         #text = acad.model.AddText('Hi !' , p, 2.5)
  156.         #insert = acad.model.AddText("{0}".format(text), p, 3)
  157.         insert = acad.model.AddText(self.text, p , 3)
  158.         AlignNum = 10
  159.         insert.Alignment = AlignNum
  160.         insertPnt = p
  161.         insert.TextAlignmentPoint = insertPnt

  162. class Block:
  163.     HCW = 13 #HalfRWidth 矩形一半宽
  164.     HCH = 6.5 #HalfRHight 矩形一半高
  165.     DeltaX = 50 #间距
  166.     DeltaY = 30
  167.    
  168.     def set_CP(self):
  169.         self.CPX = aa.CPX
  170.         self.CPY = aa.CPY

  171.     def set_Delta(self):
  172.         self.Delta = aa.Delta
  173.         self.DeltaX = Delta + 2*HW
  174.         self.DeltaY = Delta + 2*HH

  175.     def set_CWH(self):
  176.         self.HCW = float(input('请输入菱形的宽度:'))/2
  177.         self.HCH = float(input('请输入菱形的高度:'))/2

  178.     def changeUpCP(self):
  179.         self.CPY = self.CPY + self.DeltaY
  180.    
  181.     def changeDownCP(self):
  182.         self.CPY = self.CPY - self.DeltaY

  183.     def changeLeftCP(self):
  184.         self.CPX = self.CPX - self.DeltaX


  185.     def changeRightCP(self):
  186.         self.CPX = self.CPX + self.DeltaX

  187.     def plant(self):
  188.         insertionPnt = APoint(self.CPX,self.CPY)
  189.         RetVal = acad.model.InsertBlock(insertionPnt, "D:\\test1.dwg", 1, 1, 1, 0 )
  190.         
  191. aa=SetPoint()
  192. aa.creat()
  193. aa.set_CP()
  194.    
  195.    


复制代码



图形界面:

  1. import tkinter as tk
  2. import plant

  3. class APP:

  4.     def __init__(self,master):
  5.         frame = tk.Frame(master)
  6.         frame.grid()



  7.         self.changeUpCP = tk.Button(frame,text='向上移动位置',fg ='blue',command = plant.aa.changeUpCP)
  8.         self.changeDownCP = tk.Button(frame,text='向下移动位置',fg ='blue',command = plant.aa.changeDownCP)
  9.         self.changeLeftCP = tk.Button(frame,text='向左移动位置',fg ='blue',command = plant.aa.changeLeftCP)
  10.         self.changeRightCP = tk.Button(frame,text='向右移动位置',fg ='blue',command = plant.aa.changeRightCP)
  11.         self.juxingwithtxt = tk.Button(frame,text='插入文字和矩形框',fg ='blue',command = lambda:[plant.aa.juxing.plant(),getandin_text()])
  12.         self.juxing = tk.Button(frame,text='画矩形',fg ='blue',command = plant.aa.juxing.plant)
  13.         self.lingxing = tk.Button(frame,text='画菱形',fg ='blue',command = plant.aa.lingxing.plant)
  14.         self.lingxingwithtxt = tk.Button(frame,text='插入文字和选择框',fg ='blue',command = lambda:[plant.aa.lingxing.plant(),getandin_text()])
  15.         self.wenzi = tk.Button(frame,text='插入文字',fg ='blue',command = getandin_text)
  16.         self.block = tk.Button(frame,text='插入块(测试)',fg ='blue',command = plant.aa.block.plant)
  17.         self.changeUpCP.grid(row=1,column=1)
  18.         self.changeDownCP.grid(row=3,column=1)
  19.         self.changeLeftCP.grid(row=2,column=0)
  20.         self.changeRightCP.grid(row=2,column=2)
  21.         self.juxing.grid(row=1,column=4)
  22.         self.juxingwithtxt.grid(row=1,column=5)
  23.         self.lingxingwithtxt.grid(row=2,column=5)
  24.         self.lingxing.grid(row=2,column=4)
  25.         self.wenzi.grid(row=3,column=4)
  26.         self.block.grid(row=3,column=5)
  27. def getandin_text():
  28.     plant.aa.wenzi.text = e1.get()
  29.     plant.aa.wenzi.in_text()


  30.    








  31.         
  32. root =tk.Tk()
  33. root.title('画流程图')
  34. e1 = tk.Entry(root)
  35. e1.grid(row=1,column=1,padx= 0,pady =20)
  36. app = APP(root)

  37. root.mainloop()

复制代码
最佳答案
2020-9-25 11:36:54
python设计模式了解一下,相同的部分多了,就写抽象类
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-25 11:36:54 | 显示全部楼层    本楼为最佳答案   
python设计模式了解一下,相同的部分多了,就写抽象类
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-27 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表