明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11414|回复: 51

[源码]一个超级文字刷程序 - 寻求高手共同完善

  [复制链接]
发表于 2009-8-16 11:08 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-8-19 17:42:23 编辑

类似MATCHPROP命令,目前仅仅可以刷文字的图层、颜色、内容、对正、高度、样式、旋转、宽度比例。

拟实现的功能:通过用户点选可以自动识别对应的CAD图元,并在特性设置里进行图元属性的组合,达到有针对性刷新的目的。

CAD图元包括:文字、直线、多义线、标注、圆、圆弧等。

文本刷子的vlx程序:
源码见二楼。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2009-8-17 00:23 | 显示全部楼层
本帖最后由 yxp 于 2020-7-6 23:44 编辑

汗一下,我把简单的问题复杂化了,感谢caoyin的指点。
源码AutoLisp程序如下:

  1. ;;  将文本的内容、图层、颜色、高度、样式刷为一致
  2. ;;  参考DXF组码: 8 图层 / 1 内容 / 7 样式 / 40 字高 / 62 颜色 / 50 旋转 / 41 宽度比例 / 72 73 对正
  3. ;;  其中62颜色的组码比较特殊:缺失=随层
  4. ;;  by  yxp  安徽芜湖   2009-8-14

  5. (defun err (msg / errold)
  6. (if msg (progn  (setvar "cmdecho" 1)(unload_dialog vdcl_id)
  7.   (setq Tvv-62 Nil tvv-8 Nil tvv-1 Nil  tvv-7 Nil  tvv-72 Nil tvv-40 Nil
  8.     tvv-50 Nil  tvv-41 Nil ss1 Nil ss2 Nil txt-72s nil txt-73s nil)
  9.   (redraw vv_en 4)(setq *error* errold errold nil)))
  10. (princ)
  11. )

  12. (defun c:vv (/ vv_en vv_dd txtc dq72-s1 dq72-s2 dq73-s1 dq73-s2 vdcl_id);
  13. (setq errold *error* *error* err)
  14. (setvar "cmdecho" 0)
  15. (if (= vv-1 Nil)(setq vv-1 "1"))
  16. (if (= vv-8 Nil)(setq vv-8 "0"))
  17. (if (= vv-7 Nil)(setq vv-7 "0"))
  18. (if (= vv-40 Nil)(setq vv-40 "0"))
  19. (if (= vv-62 Nil)(setq vv-62 "0"))
  20. (if (= vv-50 Nil)(setq vv-50 "0"))
  21. (if (= vv-41 Nil)(setq vv-41 "0"))
  22. (if (= vv-72 Nil)(setq vv-72 "0"))
  23.   
  24.   (if (= Nil (findfile "textvv.dcl"))(vv-ydcl))
  25.   (setq vdcl_id (load_dialog "textvv.dcl")
  26.         txt-72s (list '(0 "左" ) '(1 "中") '(2 "右") '(3 "对齐") '(4 "中间") '(5 "调整"))
  27.         txt-73s (list '(0 "") '(1 "下") '(2 "中") '(3 "上"))
  28.         txt-sy (list '("左" "L") '("对齐" "A") '("调整" "F") '("中" "C") '("中间" "M")
  29.                      '("左上" "TL") '("中上" "TC") '("右上" "TR") '("左中" "ML") '("右" "R")
  30.                      '("正中" "MC") '("右中" "MR") '("左下" "BL") '("中下" "BC") '("右下" "BR")))
  31.   (command "undo" "be")
  32.   (setq ss1 (xentsel2 "\n 选择源文字 <退出>:" "TEXT"))
  33.   (if ss1 (if (vv-layer-locked (entget (car ss1))) (princ " 源文字所在的图层被锁定")
  34.      (progn (setq vv_en(car ss1))(redraw vv_en 3)
  35.             (setq txtc (cdr (assoc 62 (entget vv_en))))
  36.             (vv-hdzt)
  37. (while (setq ss2 (xentsel "\n 拾取目标文字 [设置参数(S)/退出(Q)]: " "TEXT"))
  38.    (setq vv_dd (car ss2))
  39.    (if (vv-layer-locked (entget vv_dd)) (princ " 目标文字所在的图层被锁定")
  40.    (progn
  41.      (if (= vv-72 "1")
  42.          (progn (setq dq72-s1 (cdr (assoc 72 (entget (car ss1)))) dq73-s1 (cdr (assoc 73 (entget (car ss1))))
  43.                       dq92-s2 (cdr (assoc 72 (entget (car ss2)))) dq73-s2 (cdr (assoc 73 (entget (car ss2)))))
  44.          (command "justifytext" ss2 "" (cadr (assoc (vv-dq-ys ss1) txt-sy)))))
  45.      (if (= vv-1 "1") (Herg 1 vv_en vv_dd))
  46.      (if (= vv-8 "1") (Herg 8 vv_en vv_dd))
  47.      (if (= vv-7 "1") (Herg 7 vv_en vv_dd))
  48.      (if (= vv-40 "1") (Herg 40 vv_en vv_dd))
  49.      (if (= vv-50 "1") (Herg 50 vv_en vv_dd))
  50.      (if (= vv-41 "1") (Herg 50 vv_en vv_dd))
  51.      (if (= vv-62 "1") (if txtc (command ".change" ss2 "" "p" "c" txtc "")
  52.                                 (command ".change" ss2 "" "p" "c" "bylayer" "")))
  53.     )) ;;end if
  54. ) ;;end while
  55.   (command "undo" "e")
  56.   (redraw vv_en 4))
  57. ))
  58.    (unload_dialog vdcl_id)  (setvar "cmdecho" 0)
  59.    
  60.   ;;全局变量无法清空,只好出此下策
  61.   (setq Tvv-62 Nil tvv-8 Nil tvv-1 Nil  tvv-7 Nil  tvv-72 Nil tvv-40 Nil txt-sy Nil
  62.         tvv-50 Nil  tvv-41 Nil ss1 Nil ss2 Nil txt-72s nil txt-73s nil errold Nil )
  63.    (princ)
  64. )
  65. ;;返回ss文字对象的对正样式
  66. (defun vv-dq-ys(ss)
  67.   (strcat (cadr (assoc (cdr (assoc 72 (entget (car ss)))) txt-72s))
  68.           (cadr (assoc (cdr (assoc 73 (entget (car ss)))) txt-73s)))
  69. )

  70. ;;返回entss的图层锁定状态
  71. (defun vv-layer-locked(entss)
  72. (= (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 entss))))) 4)
  73. )
  74. ;;获取当前字体的活动设置
  75. (defun vv-hdzt()
  76.   (princ "\n 当前活动设置:  ") (if (= vv-62 "1") (princ "颜色 "))(if (= vv-8 "1") (princ "图层 "))
  77.   (if (= vv-1 "1") (princ "内容 "))(if (= vv-7 "1") (princ "样式 "))(if (= vv-72 "1") (princ "对正 "))
  78.   (if (= vv-40 "1") (princ "高度 "))(if (= vv-50 "1") (princ "旋转 "))(if (= vv-41 "1") (princ "宽度比例"))
  79.   (if (and (= vv-8 "0")(= vv-62 "0")(= vv-1 "0")(= vv-7 "0")(= vv-72 "0")(= vv-40 "0")(= vv-50 "0")(= vv-40 "0"))
  80.       (princ "Nothing! What are you doing? "))
  81. )
  82. ;;罗里啰嗦的DCL主控制
  83. (defun vv-szkk( / clo-62)
  84. (if (not (new_dialog "textvv" vdcl_id))(exit))
  85. (set_tile "vv11" (if (setq clo-62 (assoc 62 (entget (car ss1)))) (itoa (cdr clo-62)) "随层"))
  86. (set_tile "vv12" (cdr (assoc 8 (entget (car ss1)))))
  87. (set_tile "vv13" (cdr (assoc 1 (entget (car ss1)))))
  88. (set_tile "vv14" (cdr (assoc 7 (entget (car ss1)))))
  89. (set_tile "vv15" (vv-dq-ys ss1))
  90. (set_tile "vv16" (rtos (cdr (assoc 40 (entget (car ss1)))) 2))
  91. (set_tile "vv17" (rtos (/ (* 180 (cdr (assoc 50 (entget (car ss1))))) pi) 2))
  92. (set_tile "vv18" (rtos (cdr (assoc 41 (entget (car ss1)))) 2))

  93.   (set_tile "vv01" vv-62)
  94.   (set_tile "vv02" vv-8)
  95.   (set_tile "vv03" vv-1)
  96.   (set_tile "vv04" vv-7)
  97.   (set_tile "vv05" vv-72)
  98.   (set_tile "vv06" vv-40)
  99.   (set_tile "vv07" vv-50)
  100.   (set_tile "vv08" vv-41)
  101.   (set_tile "vv09" "0")
  102.   
  103.   (setq tvv-62 (get_tile "vv01")
  104.         tvv-8 (get_tile "vv02")
  105.         tvv-1 (get_tile "vv03")
  106.         tvv-7 (get_tile "vv04")
  107.         tvv-72 (get_tile "vv05")
  108.         tvv-40 (get_tile "vv06")
  109.         tvv-50 (get_tile "vv07")
  110.         tvv-41 (get_tile "vv08"))
  111.   
  112.    (action_tile "vv01" "(setq tvv-62 $value)")
  113.    (action_tile "vv02" "(setq tvv-8 $value)")
  114.    (action_tile "vv03" "(setq tvv-1 $value)")
  115.    (action_tile "vv04" "(setq tvv-7 $value)")  
  116.    (action_tile "vv05" "(setq tvv-72 $value)")   
  117.    (action_tile "vv06" "(setq tvv-40 $value)")
  118.    (action_tile "vv07" "(setq tvv-50 $value)")
  119.    (action_tile "vv08" "(setq tvv-41 $value)")   
  120.    (action_tile "vv09" "(qc-qx $value)")
  121.    (action_tile "vv23" "(vv-gy)")
  122.    
  123. (start_dialog)
  124. )
  125. ;;确定 按钮控制
  126. (defun  vv-sz(fh)
  127.   (if (= fh 1)
  128.     (setq vv-62 tvv-62
  129.           vv-8 tvv-8
  130.           vv-1 tvv-1
  131.           vv-7 tvv-7
  132.           vv-72 tvv-72
  133.           vv-40 tvv-40
  134.           vv-50 tvv-50
  135.           vv-41 tvv-41
  136.      )
  137.   )(vv-hdzt)
  138. )
  139. ;;全选/清除 按钮控制
  140. (defun qc-qx(a)
  141. (set_tile "vv01" a)
  142. (set_tile "vv02" a)
  143. (set_tile "vv03" a)
  144. (set_tile "vv04" a)
  145. (set_tile "vv05" a)
  146. (set_tile "vv06" a)
  147. (set_tile "vv07" a)
  148. (set_tile "vv08" a)
  149.   (setq tvv-62 (get_tile "vv01")
  150.         tvv-8 (get_tile "vv02")
  151.         tvv-1 (get_tile "vv03")
  152.         tvv-7 (get_tile "vv04")
  153.         tvv-72 (get_tile "vv05")
  154.         tvv-40 (get_tile "vv06")
  155.         tvv-50 (get_tile "vv07")
  156.         tvv-41 (get_tile "vv08"))
  157. )
  158. ;;关于
  159. (defun vv-gy()
  160. (if (not (new_dialog "textvv1" vdcl_id))(exit))
  161.   (start_list "vv30")
  162.   (add_list "")
  163.   (add_list "       .-. __ _ .-.         ")
  164.   (add_list "       |  `  / \\  |        ")
  165.   (add_list "      /      '.()--\\       ")  
  166.   (add_list "     |         '._/         ")
  167.   (add_list "    _| O   _   O |_         ")
  168.   (add_list "    =\\    '-'    /=                .-._       ")
  169.   (add_list "      '-._____.-'                 {_}^ )o      ")
  170.   (add_list "      /`/\\___/\\`\\       ~{\\________//~`    ")
  171.   (add_list "     /\\/o     o\\/\\        (         )       ")
  172.   (add_list "    (_|         |_)       /||~~~~~||\\         ")
  173.   (add_list "      |____,____|        |_\\\\_    \\\\_\\_   ")
  174.   (add_list "      (____|____)        \"' \"\"'    \"\"'\"' ")
  175.   (add_list "")
  176.   (add_list "程序设计中得到明经通道caoyin的指点,在此表示感谢")
  177.   (add_list "    yxpxa@163.com QQ:9034598   芜湖 2009.8.17")  
  178.   (end_list)
  179. (start_dialog)
  180. )

  181. (defun Herg(n e d)
  182. (entmod (subst (assoc n (entget e))(assoc n (entget d))(entget d)))
  183. )

  184. ;;源文字选取
  185. (defun xentsel (msg filter / el)
  186. (setq end T)
  187. (while (progn
  188.    (initget "Set Quit  ")
  189.    (setq el (entsel msg))
  190.    (cond
  191.     ((= el Nil) (setq end T))
  192.     ((= el "Set")  (progn (vv-sz (vv-szkk)) (setq end T el Nil)))
  193.     ((= el "")    (setq end Nil el Nil))
  194.     ((= el "Quit")(setq end Nil el Nil))
  195.     ((= (type el) 'list) (setq end (not (= (cdr (assoc 0 (entget (car el)))) filter))))
  196.     (T Nil)
  197.     )  end)
  198. )
  199. el)

  200. ;;initget设置接收空输入,左键点空返回nil,右键确认返回""
  201. ;;怎样才能实现单点更新、可以多选又能过滤的对象输入?
  202. ;;类似MATCHPROP命令对目标的刷新
  203. (defun xentsel2 (msg filter / el)
  204. (while (progn
  205.   (initget " ")
  206.   (setq el (entsel msg))
  207.   (if (= el "")(setq aa el el Nil)
  208.      (if (= el Nil) T
  209.        (if (= (cdr (assoc 0 (entget (car el)))) filter) Nil el)))
  210. ))el)

  211. ;;生成DCL
  212. (defun vv-ydcl()
  213. (setq f_dcl (open (strcat (cadr (pa_thb)) "\\textvv.dcl") "w"))
  214. (write-line "textvv: dialog {" f_dcl)
  215. (write-line "label=\"特性设置\";spacer_1;" f_dcl)
  216. (write-line ":row{:boxed_column { label = \"文字的主要特性\";" f_dcl)
  217. (write-line ":row{:column{" f_dcl)
  218. (write-line ":toggle{label=\"颜色(&C)\"; key=\"vv01\";}" f_dcl)
  219. (write-line ":toggle{label=\"图层(&L)\"; key=\"vv02\";}" f_dcl)
  220. (write-line ":toggle{label=\"内容(&T)\"; key=\"vv03\";}" f_dcl)
  221. (write-line ":toggle{label=\"样式(&S)\"; key=\"vv04\";}" f_dcl)
  222. (write-line ":toggle{label=\"对正(&Q)\"; key=\"vv05\";}" f_dcl)
  223. (write-line ":toggle{label=\"高度(&H)\"; key=\"vv06\";}" f_dcl)
  224. (write-line ":toggle{label=\"旋转(&R)\"; key=\"vv07\";}" f_dcl)
  225. (write-line ":toggle{label=\"宽度比例(&B)\"; key=\"vv08\";}" f_dcl)
  226. (write-line ":toggle{label=\"清除/全选(&A)\"; key=\"vv09\";}}" f_dcl)
  227. (write-line ":column{" f_dcl)
  228. (write-line ":text{key=\"vv11\";width=20;}" f_dcl)
  229. (write-line ":text{key=\"vv12\";width=20;}" f_dcl)
  230. (write-line ":text{key=\"vv13\";width=20;}" f_dcl)
  231. (write-line ":text{key=\"vv14\";width=20;}" f_dcl)
  232. (write-line ":text{key=\"vv15\";width=20;}" f_dcl)
  233. (write-line ":text{key=\"vv16\";width=20;}" f_dcl)
  234. (write-line ":text{key=\"vv17\";width=20;}" f_dcl)
  235. (write-line ":text{key=\"vv18\";width=20;}" f_dcl)
  236. (write-line ":text{key=\"vv19\";width=20;}}}}" f_dcl)
  237. (write-line ":column{spacer_1;" f_dcl)
  238. (write-line ":button{label=\"确定\";key=\"vv21\";width=12;is_default=true;}" f_dcl)
  239. (write-line ":button{label=\"取消\";key=\"vv22\";width=12;is_cancel= true;}" f_dcl)
  240. (write-line ":button{label=\"关于\";key=\"vv23\";width=12;}" f_dcl)
  241. (write-line "spacer_1;spacer_1;spacer_1;spacer_1;spacer_1;" f_dcl)
  242. (write-line "}}spacer_1;}" f_dcl)
  243. (write-line "textvv1: dialog {" f_dcl)
  244. (write-line "label=\" 关于   超级文字刷  -- XMT1.1\";" f_dcl)
  245. (write-line ":list_box{key=\"vv30\"; height=17; width =50;} :row{spacer_0;" f_dcl)
  246. (write-line ":button{label=\"确定\";key=\"vv31\";width=10;is_default=true;}spacer_0;}}" f_dcl)
  247. (close f_dcl)(princ)
  248. )
  249. ;;返回支持路径
  250. (defun pa_thb(/ ss k kk sstl)
  251. (setq ss (getenv "ACAD") k 1 kk 1)
  252. (while (<= (progn (if (= (substr ss k 1) ";") (progn (setq st (substr ss kk (- k kk))
  253.   kk (+ k 1) sstl (append sstl (list st)))))(setq k (1+ k))) (strlen ss))) sstl
  254. )
  255. (princ)
回复 支持 1 反对 0

使用道具 举报

发表于 2018-9-13 23:21 | 显示全部楼层
要是能支持块内文字,属性文字,标注文字那就完美了
发表于 2009-8-17 08:30 | 显示全部楼层

下载的人不少,留言的去没有啊,嘿嘿!

 楼主| 发表于 2009-8-17 09:11 | 显示全部楼层
5061220发表于2009-8-17 8:30:00下载的人不少,留言的去没有啊,嘿嘿!

111个点击,11个下载,1个回复,嘿嘿。

数据统计:回帖的占点击的1%,下载占点击的10%,其他都是看热闹的。

发表于 2009-8-17 12:52 | 显示全部楼层
下载来看看!
发表于 2009-8-17 13:43 | 显示全部楼层

支持一下楼主,

对象包容盒用 vla-getboundingbox,

文字对正可以使用justifytext命令

文字、属性包容盒还是用 textbox 比较好,多行文字直接通过dxf组码就能得到。

发表于 2009-8-18 06:13 | 显示全部楼层
谢谢楼主分享!下载学习。
发表于 2009-8-18 10:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-8-18 12:01 | 显示全部楼层

遗憾!不能框选!!

发表于 2009-8-18 15:54 | 显示全部楼层
本帖最后由 作者 于 2009-8-18 16:17:26 编辑

liminnet发表于2009-8-18 10:36:00这个程序中的每一个选项,我都有一个函数,可以实现所以只要写一个DCL选项返回的值与否就可以组成上面楼主的程序啦,不是很难,最重要的是,这个程序在实现在画图中每一个选项一般都用命令直接

学习一下,liminnet真牛啊,有那么多函数吗?你的源码呢?

caoyin大侠:  错误: no function definition: VLA-GETBOUNDINGB

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

本版积分规则

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

GMT+8, 2024-4-26 22:02 , Processed in 0.462098 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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