明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1417|回复: 5

求 删除 绑定参照的 图层、线型、尺寸标注、文字样式的名字前缀

[复制链接]
发表于 2018-9-16 11:09 | 显示全部楼层 |阅读模式
100明经币
本帖最后由 hongxibao 于 2018-9-16 12:32 编辑

麻烦大侠帮个忙!写个lsp
绑定参照后,把带进的 图层、线型、尺寸标注、文字样式的名字$0$之前的前缀全部删掉(图纸说不定被二次参照,名字带有两个或三个、n个$0$)

删除前缀时,如果有名字重合,则可以合并名字,如果不能合并,就在名字后面加个数字,比如1(加数字后,如果还有重合,继续循环运行加数字1,直到不重合)
发表于 2018-9-16 11:09 | 显示全部楼层
本帖最后由 437271963 于 2018-11-30 16:51 编辑
  1. (defun c:tes ( / doc msp n obj s2 ss1 ss2 ss3 tc1 tc2 x y)
  2. (setvar "cmdecho" 0)
  3. (setvar "blipmode" 0)
  4. (if (null vlax-dump-object) (vl-load-com) )
  5. (s1811301);修改图层名称
  6. (princ)
  7. )


  8. ;修改图层名称
  9. (defun s1811301 ( / doc n obj s2 ss1 ss2 ss3 tc1 tc2 x y)
  10. (setq doc (vla-get-activedocument (vlax-get-acad-object));取得当前所有对象集合
  11.        msp (vla-get-ModelSpace doc);取得模型空间
  12.        ss1 (s1811302 doc msp);取得所有对象
  13.        ss2 (w1810232 doc);图层集合
  14.        ss3 (mapcar 'strcase (mapcar 'car ss2));图层名称集合
  15.        tc1 (getvar "clayer");取得当前图层名称
  16. )
  17. (if (or (vl-string-search "\#" tc1 0) (vl-string-search "$" tc1 0)) (setvar "clayer" "0") );如果当前图层需要修改,就转换图层为"0"
  18. (while (setq s2 (car ss2));处理图层
  19.   (setq ss2 (cdr ss2) tc1 (car s2) tc2 tc1 obj (cadr s2))
  20.   (while (vl-string-search "\#" tc2 0) (setq tc2 (vl-string-subst "" "\#" tc2)));处理有#的图层名称
  21.   (while (setq n (vl-string-search "$" tc2 0)) (setq tc2 (substr tc2 (+ 2 n))));处理有$的图层名称
  22.   (if (= tc2 "") (setq tc2 "0") );如果是空就修改图层为"0"
  23.   (if (/= tc2 tc1);如果名称发生变化
  24.    (progn;;1
  25.     (if (member (strcase tc2) ss3);2;如果已经有这个图层名称
  26.      (progn;;2
  27.       (mapcar '(lambda (y) (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list y tc2))))
  28.        (mapcar 'cadr
  29.         (vl-remove-if-not '(lambda (x) (= (car x) tc1)) ss1);取得所有TC1的对象
  30.        );提取出图元名称
  31.       );所有这个图层的所有图元改变图层
  32.       (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list obj)));删除这个图层
  33.        (progn
  34.         (Command "laymrg" "N" tc1 "" "N" tc2 "Y");如果图层不能删除就合并
  35.        )
  36.       );if;4
  37.      );progn;2-1
  38.      (progn;;2-2
  39.       (if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-name (list obj tc2))));如果没有相同命名的图层就改变图层名称
  40.        (setq ss3 (cons (strcase tc2) ss3))
  41.       );if;3
  42.      );progn;2-2
  43.     );if;2
  44.    );progn;1
  45.   );if;1
  46. );while
  47. )

  48. ;取得所有图层名称
  49. (defun w1810232 (doc / doc lay obj ss tc)
  50. (setq lay (vla-get-layers doc) ss '())
  51. (vlax-for obj lay
  52.   (setq tc (vla-get-name obj));取得图层名称
  53.   (setq ss (cons (list tc obj) ss))
  54. )
  55. ss
  56. )

  57. ;提取所有图元
  58. (defun s1811302 (doc msp / b1 b2 doc msp obj ss tc)
  59. (setq ss '())
  60. (vlax-for obj msp;取得所有图元
  61.   (if (null (vl-catch-all-error-p (setq tc (vl-catch-all-apply 'vla-get-layer (list obj)))))
  62.     (setq ss (cons (list tc obj) ss))
  63.   )
  64. )
  65. (setq b1 (vla-get-blocks doc));取得所有块集合
  66. (vlax-for b2 b1;查找出所有块
  67.   (vlax-for obj b2;块里面所有对象
  68.    (if (null (vl-catch-all-error-p (setq tc (vl-catch-all-apply 'vla-get-layer (list obj)))))
  69.     (setq ss (cons (list tc obj) ss))
  70.    )
  71.   )
  72. )
  73. ss
  74. )

  75. ;;一键所有图层去除【$0$】
  76. ;;-------------------------------------------

回复

使用道具 举报

 楼主| 发表于 2018-9-17 22:08 | 显示全部楼层
有大侠可以帮忙吗
回复

使用道具 举报

发表于 2018-12-16 01:36 | 显示全部楼层
试用过了,改不了,请大侠复核一下
回复

使用道具 举报

 楼主| 发表于 2019-7-15 21:55 | 显示全部楼层
回复

使用道具 举报

发表于 2019-8-23 15:32 | 显示全部楼层
好东西 谢谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 01:42 , Processed in 0.742636 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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