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"文件中將不需要的包剔除。
不安于小成,然后足以成大器;不誘于小利,然后可以立遠功。
浙公網安備 33010602011771號