明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1356|回复: 6

$0$ # | 乱字符清除

[复制链接]
发表于 2023-2-1 01:06:22 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2023-2-2 01:11 编辑

对于喜欢用参照的话,大量产生的乱字符,一直很头疼,
特别是字体类型名称,不好清除,结合本坛透露出的技术,
摸索几天,算是可以达到使用级别。
但对于字体类型乱码问题,倘有的图纸,未知原因,可能未能清除。
但,一般另开新图,复制进来,再一次清除即可完美
从前我发过段EMODE 修改STYLE DXF方式,不知什么原因,一直无效。
  1. ;;重命名字体样式 去除$0$;参照----(一级)------存在BUG,不成功
  2. (defun rensty$0$ (/ i n stylis sty stnew fstName fsdxf)
  3.   (setq stylis (getexiststynams))
  4.   (repeat (setq i (length stylis))
  5.     (setq sty (nth (setq i (1- i)) stylis) stnew sty)
  6.     (while (vl-string-search "\#" stnew 0) (setq stnew (vl-string-subst "" "\#" stnew)));去#的样式名称
  7.     (while (setq n (vl-string-search "$" stnew 0)) (setq stnew (substr stnew (+ 2 n))));处理有$的样式名称
  8.     (setq stnew (t-string-subst "" (slmsg "-参照" "-把酚" "-reference") stnew))
  9.     (setq stnew (t-string-subst "" "|" stnew))
  10.     (if (and (/= stnew sty) (= (tblobjname "style" stnew) nil))
  11.       (progn
  12.         (setq fstName (tblobjname "style" sty))
  13.         (setq fsdxf (entget fstName))
  14.         (entmod (emod fsdxf 2 stnew))
  15.         (entupd fstName)
  16.       )
  17.     )
  18.   )
  19. )


对于测试成功的功能 均首发集成于《三领设计》使用!

链接:https://pan.baidu.com/s/1IzA0ncDFqz2ytZfEAfzstg
提取码:1chu



  1. ;;常量定义--------0000级加载
  2. (setq *Acad* (vlax-get-acad-object)
  3.   *AcDocument* (vla-get-activedocument *Acad*)  ; 获取当前图档指针
  4.   *Model-Space* (vla-get-modelspace *AcDocument*)
  5.   *Paper-Space* (vla-get-PaperSpace *AcDocument*)
  6.   *BLKS* (vla-get-Blocks *AcDocument*)
  7.   *LAYS* (vla-get-Layers *AcDocument*)
  8.   *ACLYS*  (vla-get-activeLayer *AcDocument*)
  9.   *LTS*  (vla-get-Linetypes *AcDocument*)
  10.   pi2     (* pi 0.5)
  11.   pi4     (* pi 0.25)
  12.   3pi4   (* 0.75 pi)
  13.   2pi     (+ pi pi)
  14.   3pi2   (+ 3pi4 3pi4)  ;; (* 1.5 pi)
  15.   5pi4   (+ pi pi4)  ;;(* 1.25 pi)
  16.   7pi4   (+ 3pi2 pi4) ;;(* 1.75 pi)
  17. )
  18. ;所有图层去除【$0$】参照-----(一级)----
  19. (defun dellay$0$ (/ n obj s2 ss1 ss2 ss3 tc tc1 tc2 x y)
  20.   (setq ss1 '() ss2 '())
  21.   (vlax-for obj *Model-Space* ;取得所有图元
  22.     (if (null (vl-catch-all-error-p (setq tc (vl-catch-all-apply 'vla-get-layer (list obj)))))
  23.       (setq ss1 (cons (list tc obj) ss1))
  24.     )
  25.   )
  26.   (vlax-for b2 *BLKS* ;查找出所有块
  27.     (vlax-for obj b2 ;块里面所有对象
  28.       (if (null (vl-catch-all-error-p (setq tc (vl-catch-all-apply 'vla-get-layer (list obj)))))
  29.         (setq ss1 (cons (list tc obj) ss1))
  30.       )
  31.     )
  32.   )
  33.   (vlax-for obj *LAYS* (setq ss2 (cons (list (vla-get-name obj) obj) ss2)));图层集合
  34.   (setq
  35.     ss3 (mapcar 'strcase (mapcar 'car ss2));图层名称集合
  36.     tc1 (getvar "clayer");取得当前图层名称
  37.   )
  38.   (if (or (vl-string-search "\#" tc1 0) (vl-string-search "$" tc1 0)) (setvar "clayer" "0") );如果当前图层需要修改,就转换图层为"0"
  39.   (while (setq s2 (car ss2));处理图层
  40.     (setq ss2 (cdr ss2) tc1 (car s2) tc2 tc1 obj (cadr s2))
  41.     (while (vl-string-search "\|" tc2 0) (setq tc2 (vl-string-subst "" "\|" tc2)))
  42.     (while (vl-string-search "\#" tc2 0) (setq tc2 (vl-string-subst "" "\#" tc2)))
  43.     (while (setq n (vl-string-search "$" tc2 0)) (setq tc2 (substr tc2 (+ 2 n))))
  44.     (setq tc2 (t-string-subst "" (slmsg "-参照" "-把酚" "-reference") tc2))
  45.     (if (= tc2 "") (setq tc2 "0"));如果是空就修改图层为"0"
  46.     (if (/= tc2 tc1) ;如果名称发生变化
  47.       (if (member (strcase tc2) ss3)  ;2;如果已经有这个图层名称
  48.         (progn
  49.           (mapcar '(lambda (y) (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-layer (list y tc2))))
  50.             (mapcar 'cadr
  51.               (vl-remove-if-not '(lambda (x) (= (car x) tc1)) ss1);取得所有TC1的对象
  52.             ) ;提取出图元名称
  53.           ) ;所有这个图层的所有图元改变图层
  54.           (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list obj)));删除这个图层
  55.             (command "laymrg" "N" tc1 "" "N" tc2 "Y");如果图层不能删除就合并
  56.           )
  57.         )
  58.         (if (null (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-name (list obj tc2))));如果没有相同命名的图层就改变图层名称
  59.           (setq ss3 (cons (strcase tc2) ss3))
  60.         )
  61.       )
  62.     )
  63.   )
  64. )
  65. ;;已有文字样式表----(一级)------
  66. ;返回("Standard" "图框-结构$0$黑" "MtXpl_" "檩托|Standard")
  67. (defun getexiststynams (/ FontStys exstylis stynam)
  68.   (setq FontStys (tblnext "STYLE" T))
  69.   (while FontStys
  70.     (setq stynam (dxf1 FontStys 2))
  71.     (if (/= stynam "")
  72.       (setq exstylis (append exstylis (list stynam)))
  73.     )
  74.     (setq FontStys (tblnext "STYLE"))
  75.   )  
  76.   exstylis
  77. )
  78. ;;创建、修改文字样式 ----(一级)-------
  79. ;2:样式名 40:高度 41:宽度因子 3:主要字体文件名 4:大字体文件名
  80. ;;(emk_style "样式名" (* use 0.003) 1 "黑体" "SIMHEI.TTF")
  81. (defun emk_style (Name h w rd hz / fsdxf)
  82.   (if (not (tblobjname "style" Name))
  83.     (entmake
  84.       (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord")
  85.         (cons 2 Name) '(70 . 0) (cons 40 h) (cons 41 w) (cons 3 rd) (cons 4 hz)
  86.       )
  87.     )
  88.     (progn
  89.       (setq fsdxf (entget (tblobjname "style" Name)))
  90.       (if (/= (dxf1 fsdxf 40) h) (entmod (emod fsdxf 40 h)))
  91.       (if (/= (dxf1 fsdxf 41) w) (entmod (emod fsdxf 41 w)))
  92.       (if (/= (dxf1 fsdxf 3) rd) (entmod (emod fsdxf 3 rd)))
  93.       (if (/= (dxf1 fsdxf 4) hz) (entmod (emod fsdxf 4 hz)))
  94.     )
  95.   )
  96. )
  97. ;;块内所有实体表-----(一级)----
  98. (defun kualst (bname / blk kua lst name1 ty)
  99.   (setq kua (cdr (assoc 2 (entget bname))) lst '())
  100.   (setq blk (tblobjname "Block" kua))
  101.   (while (setq name1 (entnext blk))
  102.     (setq ty (cdr (assoc 0 (entget name1))))
  103.     (if (= ty "INSERT")
  104.       (setq lst (cons name1 lst) lst (append (kualst name1) lst))
  105.       (setq lst (cons name1 lst))
  106.     )
  107.     (setq blk name1)
  108.   )
  109.   lst
  110. )
  111. ;;改文字实体:文字样式 (支持标注、属性块、嵌套块内文字)---(一级)----
  112. ;;ss 选择集  styi 旧文字样式  sty 新文字样式
  113. (defun ch-ss-sty (ss styi sty / ent ent1 i name name1 tp)
  114.   (repeat (setq i (sslength ss))
  115.     (setq ent (entget (setq name (ssname ss (setq i (1- i))))) tp (dxf1 ent 0))
  116.     (cond
  117.       ((member tp '("TEXT" "MTEXT" "TCH_TEXT" "TCH_MTEXT"))
  118.         (if (= (dxf1 ent 7) styi) (entmod (emod ent 7 sty)))
  119.       )
  120.       ((= tp "DIMENSION")
  121.         (if (= (vlax-get (en2obj name) 'TextStyle) styi)
  122.           (progn
  123.             (command "DIMOVERRIDE" "DIMTXSTY" sty "dimfit" 3 "" name "")
  124.             (entmod ent)
  125.           )
  126.         )
  127.       )
  128.       ((member tp '("INSERT"))
  129.         (setq ent1 ent)
  130.         (while (= (dxf1 (setq ent1 (entget (entnext (dxf1 ent1 -1)))) 0) "ATTRIB")
  131.           (if (= (dxf1 ent1 7) styi)
  132.             (progn (entmod (emod ent1 7 sty)) (entmod ent))
  133.           )
  134.         )
  135.         (foreach name1 (kualst name)
  136.           (setq ent1 (entget name1))
  137.           (if (member (dxf1 ent1 0) '("TEXT" "MTEXT" "TCH_TEXT" "TCH_MTEXT"))
  138.             (if (= (dxf1 ent1 7) styi) (progn (entmod (emod ent1 7 sty)) (entmod ent)))
  139.           )
  140.         )
  141.       )
  142.     )
  143.   )
  144.   (if (tblsearch "style" styi)
  145.     (vl-catch-all-error-p (vl-catch-all-apply 'vla-delete (list (vla-item (vla-get-textstyles *AcDocument*) styi))));删除
  146.   )
  147.   (command "purge" "st" "*" "n")
  148.   (princ)
  149. )
  150. ;;文字样式 去除 $0$参照#|乱码----(一级)------(rensty$0$)
  151. (defun rensty$0$ (/ i n stylis sty stnew stdxf Font BigFont hi w Obj k)
  152.   (setq stylis (getexiststynams))
  153.   (repeat (setq i (length stylis))
  154.     (setq sty (nth (setq i (1- i)) stylis))
  155.     (setq stdxf (tblsearch "STYLE" sty))
  156.     (setq Font (dxf1 stdxf 3)) ;主要字体文件名
  157.     (setq BigFont (dxf1 stdxf 4)) ;大字体文件名
  158.     (setq hi (dxf1 stdxf 40)) ;固定的文字高度
  159.     (setq w (dxf1 stdxf 41)) ;宽度因子
  160.     (setq stnew sty)
  161.     (while (vl-string-search "\#" stnew 0) (setq stnew (vl-string-subst "" "\#" stnew)))  ;去#的样式名称
  162.     (while (setq n (vl-string-search "$" stnew 0)) (setq stnew (substr stnew (+ 2 n))))   ;处理有$的样式名称
  163.     (setq stnew (t-string-subst "" (slmsg "-参照" "-把酚" "-reference") stnew))
  164.     (setq stnew (t-string-subst "" "|" stnew))
  165.     (if (/= stnew sty)
  166.       (progn
  167.         (vlax-for Obj (vla-get-TextStyles *AcDocument*)
  168.           (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-Name (list Obj stnew)))  
  169.             (setq k t)
  170.           )
  171.         )
  172.         (if (= k t)
  173.           (progn
  174.             (if (= (tblobjname "style" stnew) nil)
  175.               (emk_style stnew hi w Font BigFont)
  176.             )
  177.             (ch-ss-sty (ssget "X" '((0 . "TEXT,MTEXT,TCH_TEXT,TCH_MTEXT,DIMENSION,INSERT,ATTRIB"))) sty stnew)
  178.           )
  179.         )
  180.       )
  181.     )
  182.   )
  183. )

本来想发个我画的测试图纸,附件上传不了。


本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +5 收起 理由
tigcat + 5 很给力!

查看全部评分

发表于 2023-2-1 08:41:59 | 显示全部楼层
非常不错的代码,谢谢分享啊。
发表于 2023-2-1 09:36:41 | 显示全部楼层
帅哥,能不能用论坛自带的代码格式化(论坛编辑栏笑脸符号左侧那个括号图标)排版,你这种带行号的,看着太恼火了
发表于 2023-2-1 09:39:58 来自手机 | 显示全部楼层
谢谢分享。参照的绑定保留前缀是用来区分的参照图和本图信息的,一般发图时绑定,自己需要绘制的图很少绑定使用。还就就是清楚图层图块等前缀还存在重名的问题,可能会造成位置错误。
 楼主| 发表于 2023-2-1 09:54:59 | 显示全部楼层
yuanziyou 发表于 2023-2-1 09:36
帅哥,能不能用论坛自带的代码格式化(论坛编辑栏笑脸符号左侧那个括号图标)排版,你这种带行号的,看着太 ...

这样发,有颜色区分,对看原理比较好,

附件已上传,

发表于 2023-2-1 10:44:50 | 显示全部楼层

非常不错的代码,谢谢分享啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 06:47 , Processed in 0.168017 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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