明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1542|回复: 39

[源码] 批量合并图纸又快又避免同名块影响,AI编写的

  [复制链接]
发表于 2025-10-31 20:48:43 | 显示全部楼层 |阅读模式
批量合并图纸又快又避免同名块影响

AI编写的,一遍成活
经多次测试从5个图到100个图,均很快,且能自动避免同名块的影响







本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
qifeifei + 1 非常好用;感谢分享

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 2025-10-31 23:06:43 | 显示全部楼层
qifeifei 发表于 2025-10-31 22:31
写lisp这种非热门代码、体验最好的是qwen

谢谢你的介绍
经测试,相同的提问,从头到尾
四五次修改都没有一次可用的
感觉还是差距大哈
回复 支持 2 反对 0

使用道具 举报

发表于 2025-11-2 18:08:29 | 显示全部楼层
ai的代码 还有不少问题 排版还是有问题



  1. ;;; MergeLayouts.lsp
  2. ;;; 功能:合并多个布局到一个布局(支持块图框 + 多视口)
  3. ;;; 兼容 AutoCAD 2012 – 2024 标准版(无需 DCL,无 vl-choice-list)

  4. (vl-load-com)
  5. ; 快捷命令
  6. (defun c:tt2 () (c:MergeLayouts))
  7. (defun c:tr2 () (c:MergeLayouts))

  8. (princ "\n命令已加载,输入 SIDECUT 或 tt2 启动")
  9. (princ)

  10. ;;; MergeLayouts.lsp
  11. ;;; 功能:合并多个布局到一个布局(支持块图框 + 多视口)
  12. ;;; 兼容 AutoCAD 2012 – 2024 标准版 | 无 DCL | 无第三方依赖

  13. ;;; MergeLayouts.lsp
  14. ;;; 功能:合并多个布局到一个布局(支持块图框 + 多视口)
  15. ;;; 兼容 AutoCAD 2012 – 2024 标准版 | 无 DCL | 自动创建视口

  16. (vl-load-com)

  17. (defun c:MergeLayouts (/ doc layouts allLayoutNames srcNames tgtName
  18.                         delSrc? cols row col basePt offsetVec
  19.                         entsToCopy bbox width height newInsertPt layoutObj
  20.                         input indices)

  21.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  22.   (setq layouts (vla-get-Layouts doc))

  23.   ;; 获取所有非 Model 布局名称
  24.   (setq allLayoutNames '())
  25.   (vlax-for layout layouts
  26.     (setq layName (vla-get-Name layout))
  27.     (if (/= (strcase layName) "MODEL")
  28.       (setq allLayoutNames (cons layName allLayoutNames))
  29.     )
  30.   )
  31.   (setq allLayoutNames (reverse allLayoutNames))

  32.   ;; 检查布局数量
  33.   (if (< (length allLayoutNames) 2)
  34.     (progn
  35.       (alert "至少需要两个布局(不含 Model)才能合并!")
  36.       (princ)
  37.       (exit)
  38.     )
  39.   )

  40.   ;; ========== 选择源布局(编号多选)==========
  41.   (princ "\n可用布局列表:")
  42.   (setq i 0)
  43.   (foreach name allLayoutNames
  44.     (princ (strcat "\n  [" (itoa (setq i (1+ i))) "] " name))
  45.   )
  46.   (princ "\n\n请输入要合并的源布局编号(空格分隔,例如: 1 3 4): ")
  47.   (setq input (getstring T))
  48.   (if (= input "") (exit))

  49.   ;; 安全解析输入
  50.   (if (wcmatch (strcat " " input " ") "*[~ 0-9 ]*")
  51.     (progn
  52.       (alert "输入格式错误!\n请只输入数字,用空格分隔(如: 1 2 3)。")
  53.       (exit)
  54.     )
  55.   )

  56.   (setq indices (read (strcat "(" (vl-string-trim " " input) ")")))
  57.   (if (atom indices) (setq indices (list indices)))

  58.   (setq srcNames
  59.     (vl-remove-if-not
  60.       '(lambda (idx) (and (>= idx 1) (<= idx (length allLayoutNames))))
  61.       indices
  62.     )
  63.   )
  64.   (if (null srcNames)
  65.     (progn (alert "未选择任何有效布局!") (exit))
  66.   )
  67.   (setq srcNames
  68.     (mapcar '(lambda (i) (nth (1- i) allLayoutNames)) srcNames)
  69.   )
  70.   ;; ========== 源布局选择结束 ==========

  71.   ;; ========== 选择目标布局 ==========
  72.   (setq candidates (vl-remove-if '(lambda (x) (member x srcNames)) allLayoutNames))
  73.   (cond
  74.     (candidates
  75.       (princ "\n可选目标布局:")
  76.       (setq i 0)
  77.       (foreach name candidates
  78.         (princ (strcat "\n  [" (itoa (setq i (1+ i))) "] " name))
  79.       )
  80.       (princ "\n\n输入目标布局编号,或直接回车新建布局: ")
  81.       (setq input (getstring T))
  82.       (if (= input "")
  83.         (setq tgtName (getstring "\n输入新布局名称 <Merged_Layout>: "))
  84.         (progn
  85.           (if (wcmatch input "*[~0-9]*")
  86.             (setq tgtName "Merged_Layout")
  87.             (progn
  88.               (setq idx (atoi input))
  89.               (if (and (>= idx 1) (<= idx (length candidates)))
  90.                 (setq tgtName (nth (1- idx) candidates))
  91.                 (setq tgtName "Merged_Layout")
  92.               )
  93.             )
  94.           )
  95.         )
  96.       )
  97.     )
  98.     (T
  99.       (setq tgtName (getstring "\n输入新布局名称 <Merged_Layout>: "))
  100.     )
  101.   )
  102.   (if (= tgtName "") (setq tgtName "Merged_Layout"))

  103.   ;; 创建目标布局(如果不存在)
  104.   (if (not (member tgtName allLayoutNames))
  105.     (vla-Add layouts tgtName)
  106.   )

  107.   ;; &#9989; 关键修正:确保目标布局有活动视口
  108.   (EnsureActiveViewport tgtName)

  109.   ;; 是否删除源布局?
  110.   (initget "是 否")
  111.   (setq delSrc?
  112.     (= (getkword "\n是否删除源布局?[是/否] <否>: ") "是")
  113.   )

  114.   ;; 清空目标布局(保留一个视口)
  115.   (ClearLayout tgtName)

  116.   ;; ========== 合并处理 ==========
  117.   (setq cols 2) ; 每行布局数量
  118.   (setq row 0)
  119.   (setq col 0)

  120.   (foreach layName srcNames
  121.     (princ (strcat "\n正在处理布局: " layName))
  122.     (setq layoutObj (vla-Item layouts layName))
  123.     (setq entsToCopy (ssget "_X" (list (cons 410 layName))))

  124.     (if entsToCopy
  125.       (progn
  126.         (setq basePt (GetFrameBasePoint entsToCopy))
  127.         (if (null basePt) (setq basePt '(0.0 0.0 0.0)))

  128.         (setq bbox (GetLayoutBoundingBox entsToCopy))
  129.         (if bbox
  130.           (progn
  131.             (setq width (- (car (cadr bbox)) (car (car bbox))))
  132.             (setq height (- (cadr (cadr bbox)) (cadr (car bbox))))
  133.           )
  134.           (progn
  135.             (setq width 1189.0) ; A3 宽 (mm)
  136.             (setq height 841.0) ; A3 高 (mm)
  137.           )
  138.         )

  139.         (setq newInsertPt
  140.           (list
  141.             (+ (* col (+ width 20.0)) 10.0)
  142.             (- (* row (+ height 20.0)) 10.0)
  143.             0.0
  144.           )
  145.         )
  146.         (setq offsetVec (mapcar '- newInsertPt basePt))
  147.         (CopyAndMoveEntities entsToCopy tgtName offsetVec)
  148.       )
  149.     )

  150.     (setq col (1+ col))
  151.     (if (>= col cols) (setq col 0 row (1+ row)))

  152.     (if delSrc? (vla-Delete layoutObj))
  153.   )

  154.   (setvar "CTAB" tgtName)
  155.   (princ (strcat "\n&#9989; 合并完成!目标布局: " tgtName))
  156.   (princ)
  157. )

  158. ;; ========== 确保布局有活动视口 ==========
  159. (defun EnsureActiveViewport (layName / doc layouts)
  160.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  161.   (setq layouts (vla-get-Layouts doc))
  162.   
  163.   ;; 切换到目标布局
  164.   (setvar "CTAB" layName)
  165.   
  166.   ;; 检查是否存在视口
  167.   (setq hasViewport nil)
  168.   (vlax-for obj (vla-get-Block (vla-Item layouts layName))
  169.     (if (= (vla-get-ObjectName obj) "AcDbViewport")
  170.       (setq hasViewport T)
  171.     )
  172.   )
  173.   
  174.   ;; 如果没有视口,创建默认视口
  175.   (if (not hasViewport)
  176.     (progn
  177.       (princ (strcat "\n  &#9888;&#65039; 布局 " layName " 无视口,正在创建默认视口..."))
  178.       (command "_.MVIEW" "_FIT")
  179.       ;; 等待命令完成
  180.       (while (> (getvar "CMDACTIVE") 0)
  181.         (command)
  182.       )
  183.     )
  184.   )
  185. )

  186. ;; ========== 安全获取点坐标 ==========
  187. (defun GetPointSafe (obj prop / pt)
  188.   (setq pt (vlax-get obj prop))
  189.   (cond
  190.     ((listp pt) pt)
  191.     ((= (type pt) 'variant)
  192.       (vlax-safearray->list (vlax-variant-value pt))
  193.     )
  194.     (T nil)
  195.   )
  196. )

  197. ;; ========== 获取图框块插入点 ==========
  198. (defun GetFrameBasePoint (ss / i ent obj pt)
  199.   (setq i 0 pt nil)
  200.   (repeat (sslength ss)
  201.     (if (null pt)
  202.       (progn
  203.         (setq ent (ssname ss i))
  204.         (setq obj (vlax-ename->vla-object ent))
  205.         (if (= (vla-get-ObjectName obj) "AcDbBlockReference")
  206.           (setq pt (GetPointSafe obj 'InsertionPoint))
  207.         )
  208.       )
  209.     )
  210.     (setq i (1+ i))
  211.   )
  212.   pt
  213. )

  214. ;; ========== 获取布局包围盒 ==========
  215. (defun GetLayoutBoundingBox (ss / minPt maxPt globalMin globalMax i ent obj)
  216.   (setq i 0 globalMin nil globalMax nil)
  217.   (repeat (sslength ss)
  218.     (setq ent (ssname ss i))
  219.     (setq obj (vlax-ename->vla-object ent))
  220.     (if (not (wcmatch (vla-get-ObjectName obj) "*Viewport"))
  221.       (progn
  222.         (vla-GetBoundingBox obj 'minPt 'maxPt)
  223.         (if (null globalMin)
  224.           (setq globalMin minPt globalMax maxPt)
  225.           (progn
  226.             (setq globalMin (MapMinMax globalMin minPt 'min))
  227.             (setq globalMax (MapMinMax globalMax maxPt 'max))
  228.           )
  229.         )
  230.       )
  231.     )
  232.     (setq i (1+ i))
  233.   )
  234.   (if globalMin
  235.     (list
  236.       (vlax-safearray->list globalMin)
  237.       (vlax-safearray->list globalMax)
  238.     )
  239.   )
  240. )

  241. ;; ========== 向量 min/max ==========
  242. (defun MapMinMax (v1 v2 op / x1 y1 z1 x2 y2 z2)
  243.   (setq x1 (vlax-safearray-get-element v1 0)
  244.         y1 (vlax-safearray-get-element v1 1)
  245.         z1 (vlax-safearray-get-element v1 2)
  246.         x2 (vlax-safearray-get-element v2 0)
  247.         y2 (vlax-safearray-get-element v2 1)
  248.         z2 (vlax-safearray-get-element v2 2)
  249.   )
  250.   (vlax-safearray-fill
  251.     (vlax-make-safearray vlax-vbDouble '(0 . 2))
  252.     (list
  253.       ((if (= op 'min) min max) x1 x2)
  254.       ((if (= op 'min) min max) y1 y2)
  255.       ((if (= op 'min) min max) z1 z2)
  256.     )
  257.   )
  258. )

  259. ;; ========== 复制并移动实体 ==========
  260. (defun CopyAndMoveEntities (ss tgtLayoutName offset / oldCTAB i ent obj newEnt doc)
  261.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  262.   (setq oldCTAB (getvar "CTAB"))
  263.   (setvar "CTAB" tgtLayoutName)

  264.   (setq i 0)
  265.   (repeat (sslength ss)
  266.     (setq ent (ssname ss i))
  267.     (setq obj (vlax-ename->vla-object ent))
  268.     ;; 跳过主视口:保留第一个视口(由 ClearLayout 保证存在)
  269.     (if (/= (vla-get-ObjectName obj) "AcDbViewport")
  270.       (progn
  271.         (setq newEnt (vla-Copy obj))
  272.         (vla-Move newEnt (vlax-3d-point '(0 0 0)) (vlax-3d-point offset))
  273.       )
  274.       ;; 视口也复制(但 ClearLayout 已清空,所以这里不会重复)
  275.       (progn
  276.         (setq newEnt (vla-Copy obj))
  277.         (vla-Move newEnt (vlax-3d-point '(0 0 0)) (vlax-3d-point offset))
  278.       )
  279.     )
  280.     (setq i (1+ i))
  281.   )

  282.   (setvar "CTAB" oldCTAB)
  283. )

  284. ;; ========== 清空布局(保留第一个视口)==========
  285. (defun ClearLayout (layName / oldCTAB doc layoutObj firstVP ss i ent obj)
  286.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  287.   (setq oldCTAB (getvar "CTAB"))
  288.   (setvar "CTAB" layName)
  289.   (setq layoutObj (vla-Item (vla-get-Layouts doc) layName))

  290.   ;; 找到第一个视口(用于保留)
  291.   (setq firstVP nil)
  292.   (vlax-for obj (vla-get-Block layoutObj)
  293.     (if (and (= (vla-get-ObjectName obj) "AcDbViewport") (null firstVP))
  294.       (setq firstVP obj)
  295.     )
  296.   )

  297.   ;; 删除所有实体,除了第一个视口
  298.   (setq ss (ssget "_X" (list (cons 410 layName))))
  299.   (if ss
  300.     (progn
  301.       (setq i 0)
  302.       (repeat (sslength ss)
  303.         (setq ent (ssname ss i))
  304.         (setq obj (vlax-ename->vla-object ent))
  305.         (if (or (/= (vla-get-ObjectName obj) "AcDbViewport")
  306.                 (/= obj firstVP))
  307.           (vla-delete obj)
  308.         )
  309.         (setq i (1+ i))
  310.       )
  311.     )
  312.   )

  313.   (setvar "CTAB" oldCTAB)
  314. )

  315. ;; ========== 字符串工具 ==========
  316. (defun vl-string-trim (chars str / len)
  317.   (while (and (> (strlen str) 0) (vl-position (ascii (substr str 1 1)) (vl-string->list chars)))
  318.     (setq str (substr str 2))
  319.   )
  320.   (while (and (> (strlen str) 0) (vl-position (ascii (substr str (strlen str) 1)) (vl-string->list chars)))
  321.     (setq str (substr str 1 (1- (strlen str))))
  322.   )
  323.   str
  324. )

  325. (defun vl-string->list (str / i lst)
  326.   (setq i 0 lst '())
  327.   (while (< i (strlen str))
  328.     (setq lst (cons (ascii (substr str (setq i (1+ i)) 1)) lst))
  329.   )
  330.   (reverse lst)
  331. )

  332. (princ "\n命令 MERGELAYOUTS 已加载。")
  333. (princ "\n&#9989; 支持:块图框 + 多视口 + 自动创建默认视口")
  334. (princ "\n&#9989; 兼容 AutoCAD 2012 – 2024 标准版")
  335. (princ "\n&#128204; 使用方法:输入 MERGELAYOUTS,按编号选择布局。")
  336. (princ)


点评

合并的新布局是空白的  发表于 2025-11-4 08:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-31 20:53:57 | 显示全部楼层
这是源码和测试文件,及合并后的图

  1. ;;;------------------------------------------------------------------
  2. ;;; 程序名称: MergeDWGs.lsp
  3. ;;; 功能: 批量合并指定文件夹下的所有DWG文件到当前图形
  4. ;;;       - 通过对话框选择文件夹和设置间距
  5. ;;;       - 自动处理块名冲突
  6. ;;;       - 自定义排列布局
  7. ;;; 作者: AI Assistant
  8. ;;; 日期: 2025-10-31
  9. ;;;------------------------------------------------------------------

  10. ;;; 主函数,在AutoCAD中输入 MERGEDWGS 来运行
  11. (defun C:MERGEDWGS (/ dcl_id folder_path x_space y_space col_count dwg_files
  12.                       ins_pt current_col max_row_height current_y old_cmdecho old_filedia)

  13.   ;; --- 1. 加载和显示DCL对话框 ---
  14.   (setq dcl_path (findfile "MergeDWGs.dcl"))
  15.   (if (not dcl_path)
  16.     (progn
  17.       (alert "错误:未找到 MergeDWGs.dcl 文件!\n请确保它与LSP文件在同一目录或AutoCAD支持路径下。")
  18.       (exit)
  19.     )
  20.   )
  21.   
  22.   (setq dcl_id (load_dialog dcl_path))
  23.   (if (not (new_dialog "MergeDWGsDialog" dcl_id))
  24.     (exit)
  25.   )

  26.   ;; --- 2. DCL对话框事件处理 ---
  27.   ;; 浏览文件夹按钮的动作
  28.   (action_tile "browse"
  29.     "(setq folder_path (get_folder))
  30.      (if folder_path
  31.        (set_tile "folder_path" folder_path)
  32.      )"
  33.   )

  34.   ;; 确定按钮的动作
  35.   (action_tile "accept"
  36.     "(progn
  37.        (setq folder_path (get_tile "folder_path"))
  38.        (setq x_space (distof (get_tile "x_space")))
  39.        (setq y_space (distof (get_tile "y_space")))
  40.        (setq col_count (atoi (get_tile "col_count")))
  41.        (if (or (not folder_path) (= folder_path ""))
  42.          (alert "请选择一个文件夹!")
  43.          (if (or (not x_space) (not y_space) (<= col_count 0))
  44.            (alert "无效的间隔或每行数量设置!")
  45.            (done_dialog 1) ; 值为1表示成功
  46.          )
  47.        )
  48.      )"
  49.   )
  50.   
  51.   ;; --- 3. 启动对话框并获取用户输入 ---
  52.   (if (= (start_dialog) 1)
  53.     (progn
  54.       ;; --- 4. 准备工作 ---
  55.       (setq old_cmdecho (getvar "CMDECHO"))
  56.       (setq old_filedia (getvar "FILEDIA"))
  57.       (setvar "CMDECHO" 0)
  58.       (setvar "FILEDIA" 0)
  59.       (princ "\n正在准备合并图纸...")

  60.       ;; 检查文件夹路径最后是否有斜杠
  61.       (if (/= (substr folder_path (strlen folder_path)) "\")
  62.         (setq folder_path (strcat folder_path "\"))
  63.       )

  64.       ;; 获取文件夹内所有DWG文件
  65.       (setq dwg_files (vl-directory-files folder_path "*.dwg" 1))

  66.       (if (not dwg_files)
  67.         (alert (strcat "在文件夹 " folder_path " 中未找到任何DWG文件!"))
  68.         (progn
  69.           ;; --- 5. 开始循环合并 ---
  70.           (setq ins_pt (list 0.0 0.0 0.0)) ; 初始插入点
  71.           (setq current_col 0)             ; 当前列数
  72.           (setq current_y 0.0)             ; 当前行的Y坐标
  73.           (setq max_row_height 0.0)        ; 当前行的最大高度

  74.           (foreach dwg_name dwg_files
  75.             (setq full_path (strcat folder_path dwg_name))
  76.             (setq xref_name (vl-filename-base dwg_name)) ; 使用文件名作为外部参照名
  77.             
  78.             (princ (strcat "\n正在处理: " dwg_name))

  79.             ;; 使用XREF-BIND方法来避免块名冲突
  80.             ;; 1. 附加外部参照 (Attach Xref)
  81.             (command "_.XREF" "_A" full_path "0,0,0" "" "" "")
  82.             
  83.             ;; 2. 绑定外部参照 (Bind Xref) - 'Bind'类型会自动重命名冲突对象
  84.             (command "_.XREF" "_B" xref_name)
  85.             
  86.             ;; 3. 绑定后会生成一个块参照,获取它的信息
  87.             (setq last_ent (entlast))
  88.             (if last_ent
  89.               (progn
  90.                 (setq obj (vlax-ename->vla-object last_ent))
  91.                 (vla-getboundingbox obj 'min_pt 'max_pt)
  92.                 (setq min_pt (vlax-safearray->list min_pt))
  93.                 (setq max_pt (vlax-safearray->list max_pt))
  94.                
  95.                 ;; 计算包围盒的宽度和高度
  96.                 (setq width (- (car max_pt) (car min_pt)))
  97.                 (setq height (- (cadr max_pt) (cadr min_pt)))

  98.                 ;; 4. 移动块参照到计算好的位置
  99.                 (command "_.MOVE" last_ent "" "0,0,0" ins_pt)

  100.                 ;; 5. (可选)分解块参照,使其变为普通实体
  101.                 (command "_.EXPLODE" last_ent)

  102.                 ;; 6. 更新下一个插入点的位置
  103.                 ;; 更新当前行的最大高度
  104.                 (if (> height max_row_height)
  105.                   (setq max_row_height height)
  106.                 )
  107.                
  108.                 ;; 增加列计数器
  109.                 (setq current_col (1+ current_col))
  110.                
  111.                 ;; 检查是否需要换行
  112.                 (if (>= current_col col_count)
  113.                   (progn
  114.                     ;; 换行
  115.                     (setq current_col 0) ; 重置列计数
  116.                     (setq current_y (- current_y max_row_height y_space)) ; 计算新行的Y坐标
  117.                     (setq max_row_height 0.0) ; 重置行高
  118.                     (setq ins_pt (list 0.0 current_y 0.0)) ; 设置新行的第一个插入点
  119.                   )
  120.                   (progn
  121.                     ;; 不换行,更新同一行中的下一个插入点
  122.                     (setq ins_pt (list (+ (car ins_pt) width x_space) (cadr ins_pt) 0.0))
  123.                   )
  124.                 )
  125.               )
  126.               (princ (strcat " ... 无法处理 " dwg_name))
  127.             )
  128.           )
  129.           (princ "\n所有图纸合并完成!")
  130.         )
  131.       )
  132.       
  133.       ;; --- 6. 恢复系统变量 ---
  134.       (setvar "CMDECHO" old_cmdecho)
  135.       (setvar "FILEDIA" old_filedia)
  136.       (princ)
  137.     )
  138.     (princ "\n*已取消*")
  139.   )
  140.   (princ)
  141. )

  142. ;;; 辅助函数: 弹出Windows文件夹选择对话框
  143. (defun get_folder (/ shell folder folder_path)
  144.   (vl-load-com)
  145.   (if (setq shell (vla-getinterfaceobject (vlax-get-acad-object) "Shell.Application"))
  146.     (progn
  147.       (setq folder (vlax-invoke-method shell 'BrowseForFolder 0 "请选择包含DWG图纸的文件夹" 0))
  148.       (vlax-release-object shell)
  149.       (if folder
  150.         (progn
  151.           (setq folder_path (vlax-get-property folder 'Self))
  152.           (setq folder_path (vlax-get-property folder_path 'Path))
  153.           (vlax-release-object folder)
  154.         )
  155.       )
  156.     )
  157.   )
  158.   folder_path
  159. )

  160. (princ "\nMergeDWGs.lsp 已加载。输入 MERGEDWGS 启动程序。")
  161. (princ)

  1. // DCL file for DWG Merge Utility
  2. // Save as MergeDWGs.dcl

  3. MergeDWGsDialog : dialog {
  4.     label = "批量合并DWG图纸";
  5.     : column {
  6.         : boxed_row {
  7.             label = "源文件夹";
  8.             : edit_box { key = "folder_path"; width = 45; }
  9.             : button { key = "browse"; label = "浏览..."; fixed_width = true; }
  10.         }
  11.         : boxed_column {
  12.             label = "布局设置";
  13.             : row {
  14.                 : edit_box { key = "x_space"; label = "横向间隔 (X):"; value = "1000"; edit_width = 8; }
  15.                 : edit_box { key = "y_space"; label = "纵向间隔 (Y):"; value = "1000"; edit_width = 8; }
  16.             }
  17.             : edit_box { key = "col_count"; label = "每行图纸数量:"; value = "5"; edit_width = 8; }
  18.         }
  19.     }
  20.     ok_cancel;
  21. }






















本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-10-31 20:52:57 | 显示全部楼层
用哪个AI写的?
回复 支持 反对

使用道具 举报

发表于 2025-10-31 20:55:31 | 显示全部楼层
不错!!!不错!!!不错!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-31 21:01:41 | 显示全部楼层


DCL和LSP源码文件在此,程序非常好用,但有几个小问题:
1、程序在每打开的一幅图中只能用一次,再次用就出错,经反馈修改几次一直没能改正,后因没充费也就没法再修改了,这程序不是我用的只是爱好试试AI,半年收费80元哈。
2、程序用过后,保存图时被改为不能调用对话框选择路径,感觉是改了那个系统变量。
3、程序结束后要有个运行时间就好了。

以下是AI给出的解决方案,但没试成功

解决方案:
总是卸载对话框:在 (start_dialog) 执行完毕后,无论用户是点击了确定还是取消,都必须立即调用 (unload_dialog dcl_id) 来释放对话框资源。在我的代码中,这一行 (unload_dialog dcl_id) 放在 (start_dialog) 的正下方,确保它一定会被执行。
使用局部变量:在函数定义时使用 (defun c:MDWG (/ var1 var2 ...)) 的方式声明所有变量为局部变量。这样可以防止变量(尤其是 dcl_id)污染全局环境,避免不同次运行之间互相干扰。
完善的错误处理:通过定义局部的 *error* 函数,可以确保即使用户按 ESC 键或程序在执行过程中发生其他错误,(unload_dialog dcl_id) 也能被调用,从而保证程序的健壮性。







以下是AI给出的程序使用说明:


如何使用
保存文件:将上述两段代码分别保存为 MergeDWGs.dcl 和 MergeDWGs.lsp,并确保它们在同一个文件夹里。
加载程序:
打开AutoCAD。
在命令行输入 APPLOAD 命令。
在弹出的对话框中,找到并选择 MergeDWGs.lsp 文件,然后点击“加载”。
或者,您可以直接将 MergeDWGs.lsp 文件拖拽到AutoCAD的绘图窗口中。
运行程序:
在命令行输入 MERGEDWGS 并按回车。
操作对话框:
程序会弹出一个名为“批量合并DWG图纸”的对话框。
点击 “浏览...” 按钮,选择您存放DWG图纸的文件夹。
在 “横向间隔 (X)” 和 “纵向间隔 (Y)” 输入框中设置图与图之间的距离。
在 “每行图纸数量” 中设置一行排列几个图。
点击 “确定”。
等待完成:
程序将开始自动处理,您可以在命令行看到处理进度。
处理完成后,所有图纸将按照您设置的布局排列在当前图形空间中,并且内部的块名都已自动重命名,不会发生冲突。
注意事项
程序会将所有图纸合并到当前打开的这个DWG文件中。建议在一个新建的空白文件中运行此程序。
图纸数量越多,处理时间越长,请耐心等待。
程序最后会分解(Explode)插入的图块,使它们成为独立的实体。如果您希望保留它们为独立的块(块名为原文件名),可以注释掉 (command "_.EXPLODE" last_ent) 这一行代码。
默认的间隔单位与您当前图形的单位一致。如果您的图纸单位是毫米,那么1000就代表1000毫米。
内容由AI生成、真假自行辨别!


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-31 21:03:13 | 显示全部楼层

claude
这是个收费的AI,当然比国产免费的应好的多吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-10-31 21:10:01 | 显示全部楼层
就是用的这个AI

如有老师能再将程序完善一下就好了
谢谢


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-10-31 21:25:30 | 显示全部楼层
感谢大神分享
回复 支持 反对

使用道具 举报

发表于 2025-10-31 22:31:58 | 显示全部楼层
ynhh 发表于 2025-10-31 21:03
claude
这是个收费的AI,当然比国产免费的应好的多吧

写lisp这种非热门代码、体验最好的是qwen
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-13 21:49 , Processed in 0.203276 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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