明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1586|回复: 11

[提问] entsel选择后,如何让被选择的对象区别于别的对象

[复制链接]
发表于 2023-9-1 09:41:46 | 显示全部楼层 |阅读模式
最近写了全图查找2个以上不同文字,并全选它们的代码,但是发现选择的时候,cad中,选择的文字没有反应,虽然对最后的执行结果没有影响,但总感觉少了点什么。请教各位大佬,这个问题,一般怎么解决?

  1. ;;根据文本*text图元名a创建一个选择集,该选择集包含全图中所有相同文字的文本
  2. (defun W:wz(a / b pd tt)
  3.   (setq b (entget a))
  4.   (setq tt (ssget "_X" (list(cons 0 "*text")(cons 1 (cdr(assoc 1 b))))))
  5.   tt
  6. )
  7. ;;错误函数
  8. (defun err1 (sss)
  9.     (if sss
  10.       (progn
  11.        (princ "\n错误,仅能选择文字,请重新选择:")
  12.        (setq *error* olderr)
  13.       )
  14.     )
  15.   )

  16. ;;主函数
  17. (defun c:dxz()
  18.   (setq olderr *error*
  19.                 *error* err1)
  20.   (princ "\n请选择要查找的文字:")
  21.   (setq a (car (entsel)))
  22.   (setq tt (W:wz a))  
  23.   (setq loop t)
  24.   (while loop
  25.     (princ "\n请选择要查找的文字:")
  26.     (setq b (car (entsel)))
  27.     (if (not (= b nil))
  28.       (progn
  29.       (setq ss (W:wz b))
  30.       (setq n (sslength ss))
  31.       (setq i 0)
  32.       (repeat n
  33.        (ssadd (ssname ss i) tt)
  34.        (setq i (1+ i))
  35.       ))
  36.       (setq loop nil)  
  37.       )
  38.   )
  39.   (sssetfirst nil tt)   
  40.   (princ)  
  41. )

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2023-9-1 13:37:42 | 显示全部楼层
ssyfeng 发表于 2023-9-1 10:12
那个循环没啥用

您好,我重新写了一遍,但是有一段总是出错,(setq tt (ssget "_X" (list(cons 0 "*text")(-4 . "<or") filter (-4 . "or>")))),filter套了2个括号,我也不知道有什么函数可以把这些点对重新组成一个表。既然您说不需要那个循环,那应该是有办法解决的吧。
  1. (defun c:dxz()
  2.         (setq olderr *error*
  3.                 *error* err1)
  4.         (princ "\n请选择要查找的文字:")
  5.          (if (setq ss (ssget ":E" '((0 . "*TEXT"))))
  6.     (progn
  7.       (setq n (sslength ss))
  8.                   (setq i 0)
  9.                         (setq ent nil)
  10.                         (repeat n
  11.                           (setq en (ssname ss i))
  12.                                 (setq ent (append ent (list en)))
  13.                           (setq i (1+ i))
  14.                   ))
  15.     (princ "\n未选中文字!")
  16.   )
  17.         (setq filter (mapcar '(lambda (x) (cons 1 (cdr(assoc 1 (entget x)))))ent))
  18.        
  19.         (setq tt (ssget "_X" (list(cons 0 "*text")(-4 . "<or") filter (-4 . "or>"))))
  20.         (sssetfirst nil tt)               
  21.         (princ)       
  22. )
发表于 2023-9-3 19:58:38 | 显示全部楼层
本帖最后由 bonny 于 2023-9-3 20:03 编辑
hubeiwdlue 发表于 2023-9-1 14:03
一顿乱试,试出问题了。现已经解决,谢谢各位大神的指导。
  1. (defun c:tt (/ s)
  2.         (if (and (setq s (ssget ":E:S" '((0 . "*TEXT"))))
  3.                           (setq s (ssname s 0))
  4.                                 (setq s (cons 1 (strcat "*" (cdr (assoc 1 (entget s))) "*")))
  5.                                 (setq s (ssget "A" (list '(0 . "*TEXT") s)))
  6.                         )
  7.                 (sssetfirst nil s)
  8.         )
  9.         (princ)
  10. )
  11. ;;===========================================

  12. (defun c:tt (/ s ss)
  13.   (if (and (setq s (ssget ":E:S" '((0 . "*TEXT"))))
  14.         (setq s (ssname s 0))
  15.         (setq ss (cons 1 (strcat "*" (cdr (assoc 1 (entget s))) "*")))
  16.         (setq ss (ssget "A" (list '(0 . "*TEXT") ss)))
  17.       )
  18.     (sssetfirst nil (ssdel s ss))
  19.   )
  20.   (princ)
  21. )



 楼主| 发表于 2023-9-1 14:03:42 | 显示全部楼层
一顿乱试,试出问题了。现已经解决,谢谢各位大神的指导。
  1. (defun c:dxz(/ ss n i ent en filter tt)
  2.         (princ "\n请选择要查找的文字:")
  3.          (if (setq ss (ssget ":E" '((0 . "*TEXT"))))
  4.     (progn
  5.       (setq n (sslength ss))
  6.                   (setq i 0)
  7.                         (setq ent nil)
  8.                         (repeat n
  9.                           (setq en (ssname ss i))
  10.                                 (setq ent (append ent (list en)))
  11.                           (setq i (1+ i))
  12.                   ))
  13.     (princ "\n未选中文字!")
  14.   )
  15.         (setq filter (mapcar '(lambda (x) (cons 1 (cdr(assoc 1 (entget x)))))ent))
  16.         (setq filter (append (list (cons 0 "*text")) '((-4 . "<or")) filter '((-4 . "or>"))))       
  17.         (setq tt (ssget "_X" filter))
  18.         (sssetfirst nil tt)               
  19.         (princ)       
  20. )

发表于 2023-9-1 10:12:42 | 显示全部楼层
那个循环没啥用

  1. ;;根据文本*text图元名a创建一个选择集,该选择集包含全图中所有相同文字的文本
  2. (defun W:wz (a / b pd tt)
  3.   (setq b (entget a))
  4.   (setq tt (ssget "_X" (list (cons 0 "*text")(cons 1 (cdr(assoc 1 b))))))
  5.   tt
  6. )
  7. ;;错误函数
  8. (defun err1 (sss)
  9.   (if sss
  10.     (progn
  11.       (princ "\n错误,仅能选择文字,请重新选择:")
  12.       (setq *error* olderr)
  13.     )
  14.   )
  15. )
  16. ;;主函数
  17. (defun c:dxz()
  18.   (setq olderr *error*
  19.     *error* err1
  20.   )
  21.   (princ "\n请选择要查找的文字:")
  22.   (if (setq ss (ssget ":s" '((0 . "*TEXT"))))
  23.     (progn
  24.       (setq a (ssname ss 0))
  25.       (setq tt (W:wz a))  
  26.       (sssetfirst nil tt)
  27.     )
  28.     (princ "\n未选中文字!")
  29.   )
  30.   (princ)
  31. )

 楼主| 发表于 2023-9-1 10:38:39 | 显示全部楼层
ssyfeng 发表于 2023-9-1 10:12
那个循环没啥用

谢谢您的指导,扩宽思路。我在重新写一个。
发表于 2023-9-1 11:36:47 | 显示全部楼层
hubeiwdlue 发表于 2023-9-1 10:38
谢谢您的指导,扩宽思路。我在重新写一个。

大神你重新写的能否上传一下
 楼主| 发表于 2023-9-1 11:50:30 | 显示全部楼层
664571221 发表于 2023-9-1 11:36
大神你重新写的能否上传一下

我是新手,刚开始学,遇到问题就来论坛上问一下。
发表于 2023-9-1 13:16:17 | 显示全部楼层
hubeiwdlue 发表于 2023-9-1 11:50
我是新手,刚开始学,遇到问题就来论坛上问一下。

重写的代码麻烦上传一下
发表于 2023-9-3 22:38:57 | 显示全部楼层
(defun c:tt ()
  (princ "\n请选择要查找的文字: ")
  (if (setq ss (ssget  '((0 . "*TEXT"))))
    (sssetfirst nil ss)
  )
  (princ)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-17 04:59 , Processed in 0.195360 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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