明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1858|回复: 12

[提问] 请求完善自动合并图层程序

[复制链接]
发表于 2023-7-25 18:03:19 | 显示全部楼层 |阅读模式
经常打开别的图纸,每次改图层很浪费时间,所以想用List自动处理
程序如下:
(defun c:mergelayers ( / lst)
        (setq lst '(
                ("*Door*" "A-Door")
                ("*门*" "A-Door")
        ))
          (foreach e lst (mergelayers (car e) (cadr e)))
        (princ)
)
(defun mergelayers (match to / lst def lay)
        (setq str "")
        (while (setq def (tblnext "LAYER" (null lay)))
                (if (wcmatch (setq lay (cdr (assoc 2 def))) match)
                        (setq lst (cons lay lst))))
        (if lst
                (progn
                        (command "_.LAYMRG")
                        (foreach e lst (command "_Name" e))
                        (command "" "_N" to "_Y")))
        (princ)
)
现在程序运行有几点问题,求大神指点
1、("*Door*" "A-Door"),*Door*会匹配到目标图层A-Door,而导致程序停止,有办法排除目标图层吗?
2、("*Door*" "A-Door")        ("*门*" "A-Door")有没有办法合并成("*Door*" "*门*" "A-Door")这样?
3、如果匹配到外部参照的图层也会导致程序停止,应该怎么规避?

发表于 2023-7-28 18:47:04 | 显示全部楼层
ddvcx 发表于 2023-7-28 08:34
谢谢回复,这个参数变多之后还是会有目标图层被选择的问题,这是测试dwg:

strcase 误写成了 strcat,修改代码见7楼
回复 支持 0 反对 1

使用道具 举报

发表于 2023-7-27 17:44:02 | 显示全部楼层
本帖最后由 ssyfeng 于 2023-7-27 17:57 编辑

看看是不是这样





支持图层名称的表:'(("A-Door" "*Door*" "*门*" "后面可以添加") ("A-Window" "*Wind*" "*窗*" "后面可以添加"))

本帖子中包含更多资源

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

x
回复 支持 0 反对 1

使用道具 举报

发表于 2023-7-25 22:18:31 | 显示全部楼层
  1. (defun c:tt (/ lst)
  2.   (setq lst '(("*Door*" "*门*") "A-Door"))
  3.   (mergelayers (car lst) (cadr lst))
  4.   (princ)
  5. )
  6. (defun mergelayers (lst-match to / lst def la)
  7.   (while (setq def (tblnext "LAYER" (null la)))
  8.     (foreach a lst-match
  9.       (if (wcmatch (setq la (cdr (assoc 2 def))) a)
  10.         (setq lst (cons la lst))
  11.       )
  12.     )
  13.   )
  14.   (if (setq lst (vl-remove to lst))
  15.     (progn
  16.       (command "_.LAYMRG")
  17.       (foreach e lst (command "_Name" e))
  18.       (command "" "_N" to "_Y")
  19.     )
  20.   )
  21.   (princ)
  22. )
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-7-26 08:45:49 | 显示全部楼层

多谢大佬,完美运行
 楼主| 发表于 2023-7-26 10:12:02 | 显示全部楼层

再请教下,这段代码
(("*Door*" "*门*") "A-Door")
怎么再增加
(("*Wind*" "*窗*") "A-Window")
 楼主| 发表于 2023-7-27 16:02:35 | 显示全部楼层

另外,如果重复运行命令的时候还是会匹配到目标图层,然后报错:

图层名无效。
选定的图层: A-Door。
*无效选择*
需要点或上一个(L)/名称(N)
; 错误: 函数已取消

怎样才能排除目标图层呢
发表于 2023-7-27 18:33:08 | 显示全部楼层
本帖最后由 xyp1964 于 2023-7-28 18:45 编辑
ddvcx 发表于 2023-7-27 16:02
另外,如果重复运行命令的时候还是会匹配到目标图层,然后报错:

图层名无效。

  1. (defun c:tt (/ lst)
  2.   (setq        lst '((("*Door*" "*门*") "A-Door")
  3.               (("*Wind*" "*窗*") "A-Window")
  4.              )
  5.   )
  6.   (foreach a lst (Ulaymrg (car a) (cadr a)))
  7.   (princ)
  8. )
  9. (defun Ulaymrg (lst-match to / lst def la)
  10.   (while (setq def (tblnext "LAYER" (null la)))
  11.     (foreach a lst-match
  12.       (if (wcmatch (setq la (strcase (cdr (assoc 2 def)))) (strcase a))
  13.         (setq lst (cons la lst))
  14.       )
  15.     )
  16.   )
  17.   (if (setq lst (vl-remove (strcase to) lst))
  18.     (progn
  19.       (command "_.LAYMRG")
  20.       (foreach e lst (command "_Name" e))
  21.       (command "" "_N" to "_Y")
  22.     )
  23.   )
  24.   (princ)
  25. )
 楼主| 发表于 2023-7-28 08:28:47 | 显示全部楼层
本帖最后由 ddvcx 于 2023-7-28 08:34 编辑
ssyfeng 发表于 2023-7-27 17:44
看看是不是这样

谢谢回复,这个参数变多之后还是会有目标图层被选择的问题,这是测试dwg:


命令: TT
选定的图层: DOOR。
******** 警告 ********
将要把图层“DOOR”合并到图层“A-Door”中。
删除图层“DOOR”。
已删除 1 个图层。
选定的图层: A-WINDOW。
选定的图层: A-WINDOW,WINDOW_TEXT。
选定的图层: A-WINDOW,WINDOW_TEXT,WINDOW。
无法将图层与其自身合并。图层 A-WINDOW 已选定。
*无效选择*
需要点或上一个(L)/名称(N)]:
; 错误: 函数已取消

(defun c:tt (/ lay0 lst mergelayers)
        (defun mergelayers (match to / lst def lay)
                (while (setq def (tblnext "LAYER" (null lay)))
                        (if (wcmatch (setq lay (cdr (assoc 2 def))) match)
                                (setq lst (cons lay lst))
                        )
                )
                (setq lst (vl-remove to lst))
                (if lst
                        (progn
                                (if (null (tblsearch "LAYER" to)) (command "-layer" "n" to ""))
                                (command "_.LAYMRG")
                                (foreach e lst (command "_Name" e))
                                (command "" "_N" to "_Y")
                        )
                )
                (princ)
        )
        ;;;--------------------------------------
        (setvar "CMDECHO" 0)
        (vl-cmdf "_.undo" "be")
        (setq lay0 (getvar "CLAYER"))
        (setvar "CLAYER" "0")
        (setq lst '(
                                                         ("A-Door" "*Door*" "*DOOR*" "*门*")
                                                         ("A-Window" "*Wind*" "*WIND*" "*窗*")
                                                         ("A-Stair" "*Stai*" "*STAI*" "*梯*")
                                                 )
        )
        (foreach e lst (foreach a (cdr e) (mergelayers a (car e))))
        (if (tblsearch "LAYER" lay0) (setvar "CLAYER" lay0))
        (vl-cmdf "_.undo" "e")
        (princ)
)

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-7-28 08:34:27 | 显示全部楼层

谢谢回复,这个参数变多之后还是会有目标图层被选择的问题,这是测试dwg:



命令: TT
_.LAYMRG
选择要合并的图层上的对象或 [命名(N)]: _Name
输入图层名称或 [?]: DOOR
选定的图层: DOOR。
选择要合并的图层上的对象或 [名称(N)/放弃(U)]:
选择目标图层上的对象或 [名称(N)]: _N
输入图层名称或 [?]: A-Door
******** 警告 ********
将要把图层“DOOR”合并到图层“A-Door”中。
是否继续? [是(Y)/否(N)] <否(N)>: _Y
删除图层“DOOR”。
已删除 1 个图层。
命令: _.LAYMRG
选择要合并的图层上的对象或 [命名(N)]: _Name
输入图层名称或 [?]: A-WINDOW
选定的图层: A-WINDOW。
选择要合并的图层上的对象或 [名称(N)/放弃(U)]: _Name
输入图层名称或 [?]: WINDOW_TEXT
选定的图层: A-WINDOW,WINDOW_TEXT。
选择要合并的图层上的对象或 [名称(N)/放弃(U)]: _Name
输入图层名称或 [?]: WINDOW
选定的图层: A-WINDOW,WINDOW_TEXT,WINDOW。
选择要合并的图层上的对象或 [名称(N)/放弃(U)]:
选择目标图层上的对象或 [名称(N)]: _N
输入图层名称或 [?]: A-Window
无法将图层与其自身合并。图层 A-WINDOW 已选定。
选择目标图层上的对象或 [名称(N)]: _Y
*无效选择*
需要点或上一个(L)/名称(N)]:
; 错误: 函数已取消
选择目标图层上的对象或 [名称(N)]: *取消*




(defun c:tt (/ lst)
  (setq        lst '((("*Door*" "*DOOR*" "*门*") "A-Door")
              (("*Wind*" "*WIND*" "*窗*") "A-Window")
              (("*Stair*" "*STAI*" "*梯*") "A-Stair")
             )
  )
  (foreach a lst (Ulaymrg (car a) (cadr a)))
  (princ)
)
(defun Ulaymrg (lst-match to / lst def la)
  (while (setq def (tblnext "LAYER" (null la)))
    (foreach a lst-match
      (if (wcmatch (setq la (strcat (cdr (assoc 2 def)))) (strcat a))
        (setq lst (cons la lst))
      )
    )
  )
  (if (setq lst (vl-remove (strcat to) lst))
    (progn
      (command "_.LAYMRG")
      (foreach e lst (command "_Name" e))
      (command "" "_N" to "_Y")
    )
  )
  (princ)
)

本帖子中包含更多资源

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

x
发表于 2023-7-28 08:40:11 | 显示全部楼层
ddvcx 发表于 2023-7-28 08:28
谢谢回复,这个参数变多之后还是会有目标图层被选择的问题,这是测试dwg:

再试试这个:
(defun c:tt (/ lay0 lst mergelayers)
        (defun mergelayers (match to / lst def lay)
                (while (setq def (tblnext "LAYER" (null lay)))
                        (if (wcmatch (setq lay (cdr (assoc 2 def))) match)
                                (setq lst (cons (strcase lay) lst))
                        )
                )
                (setq lst (vl-remove (strcase to) lst))
                (if lst
                        (progn
                                (if (null (tblsearch "LAYER" to)) (command "-layer" "n" to ""))
                                (command "_.LAYMRG")
                                (foreach e lst (command "_Name" e))
                                (command "" "_N" to "_Y")
                        )
                )
                (princ)
        )
        ;;;--------------------------------------
        (setvar "CMDECHO" 0)
        (vl-cmdf "_.undo" "be")
        (setq lay0 (getvar "CLAYER"))
        (setvar "CLAYER" "0")
        (setq lst '(
                                                         ("A-Door" "*Door*" "*DOOR*" "*门*")
                                                         ("A-Window" "*Wind*" "*WIND*" "*窗*")
                                                         ("A-Stair" "*Stai*" "*STAI*" "*梯*")
                                                 )
        )
        (foreach e lst (foreach a (cdr e) (mergelayers a (car e))))
        (if (tblsearch "LAYER" lay0) (setvar "CLAYER" lay0))
        (vl-cmdf "_.undo" "e")
        (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 00:32 , Processed in 0.185093 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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