cad最终出图时,需要将图纸转成pdf文件,并附带图纸目录提交。通常习惯以图号命名pdf文件,例如“37MC620319CSTZLQ-023”,“37MC620319CSTZLQ-024”等。将cad批量打印为pdf已有不少插件,例如batchplot,贱人工具箱等。因此我需要的功能较为简单,如下:
- 批量打印时已经按照图号顺序转为pdf,获取每个pdf生成时间
- 根据pdf生成时间自动排序,以图号命名文件(用户只需要输入图号前缀和图号起始值)
- 自动生成目录。
需要用到的包有os,sys,pyqt5,openpyxl。其中,pyqt5只是为了做个界面,方便其他人使用,如有编程基础,可以舍弃界面提高启动速度。启动后界面如下:
完整代码如下:
1 import os, sys, openpyxl 2 from PyQt5.QtWidgets import QMainWindow, QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, \ 3 QApplication, QStatusBar, QGroupBox, QLineEdit, QMessageBox, QProgressBar 4 5 6 class Mywin(QMainWindow): 7 8 def __init__(self): 9 super(Mywin, self).__init__() 10 self.step = 0 # 初始值设置为0,计划后期改进时添加进度条,作为起始值 11 self.initui() 12 13 def initui(self): 14 # self.pbar = QProgressBar() #计划后期改进时添加进度条, 15 16 self.setWindowTitle('川小胖工具箱') 17 self.resize(340, 280) 18 self.statusBar = QStatusBar() 19 # self.statusBar.showMessage('内测版1.0',0) 20 self.statusBar.showMessage('状态栏') 21 # ======重命名文件======== 22 groupbox_1 = QGroupBox('重命名文件', self) 23 24 lineedit_start = QLineEdit() 25 lineedit_pre = QLineEdit() 26 lbl_pre = QLabel('设定前缀', self) 27 lbl_start = QLabel('起始值', self) 28 # lbl_pre.setMaximumWidth(130) 29 # lbl_start.setMaximumWidth(50) 30 _ = QLabel() 31 btn_ok = QPushButton('重命名', self) 32 hbx1 = QHBoxLayout() 33 hbx1.addWidget(lbl_pre) 34 hbx1.addWidget(lbl_start) 35 hbx1.addWidget(_) 36 hbx2 = QHBoxLayout() 37 hbx2.addWidget(lineedit_pre) 38 hbx2.addWidget(lineedit_start) 39 hbx2.addWidget(btn_ok) 40 vbx = QVBoxLayout() 41 vbx.addLayout(hbx1) 42 vbx.addLayout(hbx2) 43 groupbox_1.setLayout(vbx) 44 45 # ======添加生成目录控件===== 46 lbl = QLabel('使用说明:\n1.将所有pdf文件放入同一文件夹下;\n2.根据需要点击下方按钮。', self) 47 lbl_no = QLabel('内测版0.1', self) 48 btn_excel = QPushButton('转为excel') 49 btn_excel.setMaximumWidth(100) 50 btn_txt = QPushButton('转为txt') 51 btn_txt.setMaximumWidth(100) 52 53 # 设置布局 54 hbx = QHBoxLayout() 55 hbx.addWidget(btn_txt) 56 hbx.addWidget(btn_excel) 57 vbx = QVBoxLayout() 58 vbx.addWidget(lbl) 59 vbx.addLayout(hbx) 60 61 groupbox_2 = QGroupBox('自动生成目录', self) 62 groupbox_2.setLayout(vbx) 63 64 vbx1 = QVBoxLayout() 65 vbx1.addWidget(groupbox_1) 66 vbx1.addWidget(groupbox_2) 67 vbx1.addWidget(lbl_no) 68 widget = QWidget() 69 widget.setLayout(vbx1) 70 self.setCentralWidget(widget) 71 # self.setLayout(vbx) 72 # btn_ok.clicked.connect(self.action) 73 74 #链接函数 75 btn_ok.clicked.connect(lambda: self.rename(lineedit_pre, lineedit_start)) 76 btn_excel.clicked.connect(lambda: self.output_contents(btn_excel)) 77 btn_txt.clicked.connect(lambda: self.output_contents(btn_txt)) 78 79 def output_contents(self, btn): 80 # =========1.获取文件名,将所有pdf文件名存入列表中=========== 81 path = os.getcwd() # 获取程序所在文件夹路径 82 files = os.listdir(path) # 获取指定路径下的所有文件的文件名称 83 list_pdf = [file.replace('.pdf', '').split('.') for file in files if file.split('.')[-1] in ['pdf']] 84 # ==========2.判断用户选项,做出响应=========== 85 if btn.text() == '转为txt': 86 with open('目录.txt', 'w', encoding='utf-8') as f: 87 for i in list_pdf: 88 f.write(' '.join(i) + '\n') 89 90 elif btn.text() == '转为excel': 91 list_pdf.insert(0, ['序号', '图名']) 92 # =====创建对象===== 93 wb = openpyxl.Workbook() # W”要大写 94 worksheet = wb.active # 获取当前活跃的worksheet,默认就是第一个worksheet 95 worksheet.title = "目录" 96 # =====写入数据===== 97 for i in list_pdf: 98 worksheet.append(i) 99 # =====调整格式===== 100 # for row in worksheet.rows: 101 # for cell in row: 102 # cell.alignment = Alignment(horizontal='center', vertical='center') 103 wb.save(filename='目录.xlsx') 104 105 def rename(self, pre, start): 106 107 for i in [pre, start]: # 检查是否有漏输入项 108 if i.text() == '': 109 QMessageBox.about(self, '参数缺失', '有参数尚未输入,请检查!') 110 i.setFocus() 111 break 112 else: 113 files = os.listdir(os.getcwd()) # 获取指定路径下的所有文件的文件名称 114 list_pdf = [file for file in files if file.split('.')[-1] in ['pdf']] 115 list_time = [os.path.getctime(i) for i in list_pdf] 116 new_list = sorted(list(zip(list_time, list_pdf)), key=lambda x: float(x[0])) 117 118 start1 = int(start.text()) 119 pre1 = pre.text() 120 end = start1 + len(list_pdf) + 1 121 _ = list(zip([i for i in range(start1, end + 1)], new_list)) 122 for index, i in enumerate(_): 123 newname = str(index + 1) + '.' + pre1 + str(i[0]) + '.pdf' 124 os.rename(i[1][1], newname) 125 QMessageBox.about(self, '完成', '所有文件已重命名!') 126 127 def action(self): 128 """测试功能""" 129 pass 130 131 132 if __name__ == '__main__': 133 app = QApplication(sys.argv) 134 win = Mywin() 135 win.show() 136 sys.exit(app.exec_())
打包为exe后,可能文件体积较大,可在".spec"文件中将不需要的包剔除。
不安于小成,然后足以成大器;不诱于小利,然后可以立远功。