当前位置:首页>python>《CAD图纸合并太折磨?Python打造批量合并神器,一键搞定,效率超前,彻底告别加班!》

《CAD图纸合并太折磨?Python打造批量合并神器,一键搞定,效率超前,彻底告别加班!》

  • 2026-10-11 06:58:59
《CAD图纸合并太折磨?Python打造批量合并神器,一键搞定,效率超前,彻底告别加班!》

“带你横跨办公自动化的数据江海”

@摸鱼

前言

关于摸鱼

(

ABOUT MOYU

)

闻道有先后,术业有专攻。

各位大佬朋友们好!

~我依旧是你们的老朋友摸鱼~

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了140多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼

好了,多了不说,少了不唠,今天给大佬们分享一款本人原创的【 CAD图纸批量批量合并工具】。这款工具相比手动拼图和排版,效率提升数十倍,无需逐个打开调整位置和格式。它能智能识别图框并自动分组排版,只需选择包含DWG文件的目录,自研算法即可自动解析图纸边界、智能分组、一键合并输出完整DWG文档。支持自定义CAD版本选择、分组间距参数调节、基点位置设置,差异图纸自动适配排版,一键生成合并图纸,省时省力!

《该办公工具成品展示:》

《该办公工具的演示视频:》

《该办公工具核心功能亮点:》

01

 亮点1:智能图框识别与分组🤖

        02

         亮点2:智能排版算法📄

            03

            亮点3:一键批量合并🚀

            《该办公工具代码展示:》

            下面,我就用python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"

            import sysimport globimport osfrom os import path as ospimport timefrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,                              QHBoxLayout, QGridLayout, QGroupBox, QLabel,                              QLineEdit, QPushButton, QSpinBox, QTextEdit,                              QMessageBox, QFileDialog, QComboBox)from PyQt6.QtCore import Qt, QThreadPoolfrom PyQt6.QtGui import QFontclass CADMergeMainWindow(QMainWindow):    """主窗口"""    def __init__(self):        super().__init__()        self.init_ui()        self.setup_styles()    def init_ui(self):        self.setWindowTitle("CAD图纸合并工具(欢迎关注微信公众号:码海听潮)")        self.setMinimumSize(700, 620)        self.setFixedSize(700, 620)        # 中央部件        central_widget = QWidget()        self.setCentralWidget(central_widget)        main_layout = QVBoxLayout(central_widget)        main_layout.setSpacing(10)        main_layout.setContentsMargins(15, 15, 15, 15)        # 参数设置区域        param_group = QGroupBox("参数设置")        param_group.setObjectName("paramGroup")        param_layout = QGridLayout(param_group)        param_layout.setSpacing(8)        param_layout.setContentsMargins(12, 15, 12, 12)        # 路径选择        param_layout.addWidget(QLabel("工作目录:"), 0, 0)        self.path_edit = QLineEdit()        self.path_edit.setPlaceholderText("选择包含DWG文件的目录...")        self.path_edit.setReadOnly(True)        self.path_edit.setMaximumHeight(28)        param_layout.addWidget(self.path_edit, 0, 1)        self.browse_btn = QPushButton("浏览")        self.browse_btn.setObjectName("browseBtn")        self.browse_btn.setMaximumHeight(28)        self.browse_btn.clicked.connect(self.browse_folder)        param_layout.addWidget(self.browse_btn, 0, 2)        # CAD版本选择        param_layout.addWidget(QLabel("CAD版本:"), 1, 0)        self.cad_version_combo = QComboBox()        self.cad_version_combo.setMaximumHeight(28)        self.cad_version_combo.addItems([            "ZWCAD.Application.2017",            "ZWCAD.Application.2018",            "ZWCAD.Application.2019",            "ZWCAD.Application.2020",            "ZWCAD.Application.2021",            "ZWCAD.Application.2022",            "ZWCAD.Application.2023",            "ZWCAD.Application.2024",            "ZWCAD.Application.2025",            "ZWCAD.Application.2026"        ])        self.cad_version_combo.setEditable(True)        param_layout.addWidget(self.cad_version_combo, 1, 1)        # 参数输入        param_layout.addWidget(QLabel("分组间距 (d):"), 2, 0)        self.d_spin = QSpinBox()        self.d_spin.setRange(0, 10000)        self.d_spin.setValue(50)        self.d_spin.setMaximumHeight(28)        param_layout.addWidget(self.d_spin, 2, 1)        param_layout.addWidget(QLabel("上下间距 (t):"), 3, 0)        self.t_spin = QSpinBox()        self.t_spin.setRange(0, 10000)        self.t_spin.setValue(100)        self.t_spin.setMaximumHeight(28)        param_layout.addWidget(self.t_spin, 3, 1)        param_layout.addWidget(QLabel("基点 X:"), 4, 0)        self.base_x_spin = QSpinBox()        self.base_x_spin.setRange(0, 100000)        self.base_x_spin.setValue(5000)        self.base_x_spin.setMaximumHeight(28)        param_layout.addWidget(self.base_x_spin, 4, 1)        param_layout.addWidget(QLabel("基点 Y:"), 5, 0)        self.base_y_spin = QSpinBox()        self.base_y_spin.setRange(0, 100000)        self.base_y_spin.setValue(5000)        self.base_y_spin.setMaximumHeight(28)        param_layout.addWidget(self.base_y_spin, 5, 1)        param_layout.setColumnStretch(1, 1)        main_layout.addWidget(param_group)        # 控制按钮        btn_layout = QHBoxLayout()        btn_layout.setSpacing(10)        self.start_btn = QPushButton("开始合并")        self.start_btn.setObjectName("startBtn")        self.start_btn.clicked.connect(self.start_merge)        self.start_btn.setMaximumHeight(36)        self.stop_btn = QPushButton("停止")        self.stop_btn.setObjectName("stopBtn")        self.stop_btn.clicked.connect(self.stop_merge)        self.stop_btn.setEnabled(False)        self.stop_btn.setMaximumHeight(36)        btn_layout.addStretch()        btn_layout.addWidget(self.start_btn)        btn_layout.addWidget(self.stop_btn)        btn_layout.addStretch()        main_layout.addLayout(btn_layout)        # 日志区域        log_group = QGroupBox("处理日志")        log_group.setObjectName("logGroup")        log_layout = QVBoxLayout(log_group)        log_layout.setSpacing(5)        log_layout.setContentsMargins(10, 12, 10, 10)        self.log_text = QTextEdit()        self.log_text.setReadOnly(True)        self.log_text.setObjectName("logText")        self.log_text.setFont(QFont("Consolas", 9))        self.log_text.setMaximumHeight(300)        log_layout.addWidget(self.log_text)        main_layout.addWidget(log_group)        # 初始化线程池        self.threadpool = QThreadPool()        self.threadpool.setMaxThreadCount(1)    def setup_styles(self):        """设置样式表"""        style = """        QMainWindow {            background-color: #f0f2f5;        }        QGroupBox {            font-size: 12px;            font-weight: bold;            font-family: "Microsoft YaHei";            border: 2px solid #d0d7e2;            border-radius: 8px;            margin-top: 10px;            padding-top: 10px;            background-color: white;        }        QGroupBox::title {            subcontrol-origin: margin;            left: 12px;            padding: 0 8px;            color: #2c3e50;        }#paramGroup {            background-color: white;        }#logGroup {            background-color: white;        }        QLabel {            font-family: "Microsoft YaHei";            font-size: 12px;            color: #2c3e50;        }        QLineEdit {            padding: 4px 10px;            border: 2px solid #d0d7e2;            border-radius: 6px;            font-size: 12px;            background-color: #f8f9fa;        }        QLineEdit:focus {            border-color: #667eea;        }        QSpinBox {            padding: 4px 8px;            border: 2px solid #d0d7e2;            border-radius: 6px;            font-size: 12px;            background-color: #f8f9fa;            min-height: 20px;        }        QSpinBox:focus {            border-color: #667eea;        }        QComboBox {            padding: 4px 8px;            border: 2px solid #d0d7e2;            border-radius: 6px;            font-size: 12px;            background-color: #f8f9fa;            min-height: 20px;        }        QComboBox:focus {            border-color: #667eea;        }        QComboBox::drop-down {            border: none;        }        QComboBox::down-arrow {            image: none;            border-left: 4px solid transparent;            border-right: 4px solid transparent;            border-top: 4px solid #666;            margin-right: 5px;        }#browseBtn {            background-color: #e8ecf1;            border: none;            border-radius: 6px;            padding: 4px 16px;            font-size: 12px;            font-weight: bold;            font-family: "Microsoft YaHei";            color: #2c3e50;        }#browseBtn:hover {            background-color: #d5dbe4;        }#startBtn {            background: qlineargradient(x1:0, y1:0, x2:1, y2:0,                stop:0 #667eea, stop:1 #764ba2);            border: none;            border-radius: 8px;            padding: 8px 30px;            font-size: 14px;            font-weight: bold;            font-family: "Microsoft YaHei";            color: white;            min-width: 120px;        }#startBtn:hover {            opacity: 0.9;        }#startBtn:disabled {            opacity: 0.5;        }#stopBtn {            background-color: #e74c3c;            border: none;            border-radius: 8px;            padding: 8px 30px;            font-size: 14px;            font-weight: bold;            font-family: "Microsoft YaHei";            color: white;            min-width: 120px;        }#stopBtn:hover {            background-color: #c0392b;        }#stopBtn:disabled {            opacity: 0.5;        }#logText {            background-color: #1a1a2e;            color: #e0e0e0;            border: none;            border-radius: 6px;            font-family: "Consolas";            font-size: 11px;            padding: 8px;        }        """        self.setStyleSheet(style)    def browse_folder(self):        """选择文件夹"""        folder = QFileDialog.getExistingDirectory(            self, "选择包含DWG文件的目录",            "",            QFileDialog.Option.ShowDirsOnly        )        if folder:            self.path_edit.setText(folder)            dwg_files = glob.glob(osp.join(folder, '**', '*.dwg'), recursive=True)            if dwg_files:                self.log(f"找到 {len(dwg_files)} 个DWG文件")            else:                self.log("⚠️ 该目录下未找到DWG文件")    def log(self, message):        """添加日志"""        self.log_text.append(f"[{time.strftime('%H:%M:%S')}] {message}")        scrollbar = self.log_text.verticalScrollBar()        scrollbar.setValue(scrollbar.maximum())    def start_merge(self):        """开始合并(界面逻辑)"""        path = self.path_edit.text()        if not path or not osp.exists(path):            QMessageBox.warning(self, "警告", "请选择有效的工作目录!")            return        dwg_files = glob.glob(osp.join(path, '**', '*.dwg'), recursive=True)        if not dwg_files:            QMessageBox.warning(self, "警告", "指定目录下未找到DWG文件!")            return        reply = QMessageBox.question(            self, "确认开始",            f"将在目录 '{path}' 中处理 {len(dwg_files)} 个DWG文件。\n\n是否继续?",            QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No        )        if reply == QMessageBox.StandardButton.No:            return        # 禁用控件        self.start_btn.setEnabled(False)        self.stop_btn.setEnabled(True)        self.browse_btn.setEnabled(False)        self.cad_version_combo.setEnabled(False)        # 清空日志        self.log_text.clear()        self.log("=" * 60)        self.log("🚀 开始CAD图纸合并任务")        self.log(f"工作目录: {path}")        self.log(f"CAD版本: {self.cad_version_combo.currentText()}")        self.log(f"找到 {len(dwg_files)} 个DWG文件")        self.log("=" * 60)        # 获取参数        d = self.d_spin.value()        t = self.t_spin.value()        base_point = (self.base_x_spin.value(), self.base_y_spin.value(), 0)        cad_version = self.cad_version_combo.currentText()        # TODO: 这里调用实际的合并逻辑        # self.worker = CADMergeWorker(path, d, t, base_point, cad_version)        # self.threadpool.start(self.worker)    def stop_merge(self):        """停止合并(界面逻辑)"""        reply = QMessageBox.question(            self, "确认停止",            "确定要停止当前合并任务吗?\n\n已处理的内容将不会保存。",            QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No        )        if reply == QMessageBox.StandardButton.Yes:            self.log("⏹ 正在停止任务...")            self.stop_btn.setEnabled(False)            # TODO: 调用停止逻辑def main():    app = QApplication(sys.argv)    app.setWindowIcon(QIcon())    app.setApplicationName("CAD图纸合并工具")    app.setOrganizationName("CAD Tools")    window = CADMergeMainWindow()    window.show()    sys.exit(app.exec())if __name__ == "__main__":    main()

            这款CAD图纸批量合并工具,可自动完成原需手动逐张打开CAD文件、反复复制粘贴调整排版一整天的图纸合并工作。从面对数百张DWG文件逐张复制、来回切换窗口、反复调整间距位置的繁琐与崩溃,到用工具实现一键选择目录、自动识别图框、智能分组排版的畅快,工作效率获得指数级提升,终于解放了双手和时间!

            大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

            《该办公工具的应用场景:》

              无论您属于哪个领域,只要工作中涉及以下情况,这款工具都能帮到您:

              ✅ 多张CAD图纸需要合并为一张

              ✅ 图纸数量多(几十张甚至上百张)

              ✅ 需要按顺序规范排列

              ✅ 想节省手动拼图的繁琐时间

              ✅ 需要批量处理,避免重复劳动

              一句话总结:只要您有"多张CAD图纸需要合并整理"的需求,这款工具就是您的效率神器!

              结语

              当Python遇见办公,牛马打工人终于笑出了猪叫声

              【职场人必看】每天早上一睁眼,想到又要面对:

              1.📊 堆积如山的Excel表格

              2.📑 机械重复的复制粘贴

              3.✍️ 永远改不完的各类文档

              4.诸如此类的更多........

              是不是连Ctrl+Alt+Delete的心都有了?

              别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

              追后感谢各位大佬观看,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!

              最新文章

              随机文章