hubeiwdlue 发表于 2023-9-1 09:41:46

entsel选择后,如何让被选择的对象区别于别的对象

最近写了全图查找2个以上不同文字,并全选它们的代码,但是发现选择的时候,cad中,选择的文字没有反应,虽然对最后的执行结果没有影响,但总感觉少了点什么。请教各位大佬,这个问题,一般怎么解决?

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

;;主函数
(defun c:dxz()
(setq olderr *error*
                *error* err1)
(princ "\n请选择要查找的文字:")
(setq a (car (entsel)))
(setq tt (W:wz a))
(setq loop t)
(while loop
    (princ "\n请选择要查找的文字:")
    (setq b (car (entsel)))
    (if (not (= b nil))
      (progn
      (setq ss (W:wz b))
      (setq n (sslength ss))
      (setq i 0)
      (repeat n
       (ssadd (ssname ss i) tt)
       (setq i (1+ i))
      ))
      (setq loop nil)
      )
)
(sssetfirst nil tt)   
(princ)
)

hubeiwdlue 发表于 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个括号,我也不知道有什么函数可以把这些点对重新组成一个表。既然您说不需要那个循环,那应该是有办法解决的吧。
(defun c:dxz()
        (setq olderr *error*
                *error* err1)
        (princ "\n请选择要查找的文字:")
       (if (setq ss (ssget ":E" '((0 . "*TEXT"))))
    (progn
      (setq n (sslength ss))
                  (setq i 0)
                        (setq ent nil)
                        (repeat n
                          (setq en (ssname ss i))
                                (setq ent (append ent (list en)))
                          (setq i (1+ i))
                  ))
    (princ "\n未选中文字!")
)
        (setq filter (mapcar '(lambda (x) (cons 1 (cdr(assoc 1 (entget x)))))ent))
       
        (setq tt (ssget "_X" (list(cons 0 "*text")(-4 . "<or") filter (-4 . "or>"))))
        (sssetfirst nil tt)               
        (princ)       
)

bonny 发表于 2023-9-3 19:58:38

本帖最后由 bonny 于 2023-9-3 20:03 编辑

hubeiwdlue 发表于 2023-9-1 14:03
一顿乱试,试出问题了。现已经解决,谢谢各位大神的指导。
(defun c:tt (/ s)
      (if (and (setq s (ssget ":E:S" '((0 . "*TEXT"))))
                        (setq s (ssname s 0))
                              (setq s (cons 1 (strcat "*" (cdr (assoc 1 (entget s))) "*")))
                              (setq s (ssget "A" (list '(0 . "*TEXT") s)))
                        )
                (sssetfirst nil s)
      )
      (princ)
)
;;===========================================

(defun c:tt (/ s ss)
(if (and (setq s (ssget ":E:S" '((0 . "*TEXT"))))
      (setq s (ssname s 0))
      (setq ss (cons 1 (strcat "*" (cdr (assoc 1 (entget s))) "*")))
      (setq ss (ssget "A" (list '(0 . "*TEXT") ss)))
      )
    (sssetfirst nil (ssdel s ss))
)
(princ)
)


hubeiwdlue 发表于 2023-9-1 14:03:42

一顿乱试,试出问题了。现已经解决,谢谢各位大神的指导。(defun c:dxz(/ ss n i ent en filter tt)
        (princ "\n请选择要查找的文字:")
       (if (setq ss (ssget ":E" '((0 . "*TEXT"))))
    (progn
      (setq n (sslength ss))
                  (setq i 0)
                        (setq ent nil)
                        (repeat n
                          (setq en (ssname ss i))
                                (setq ent (append ent (list en)))
                          (setq i (1+ i))
                  ))
    (princ "\n未选中文字!")
)
        (setq filter (mapcar '(lambda (x) (cons 1 (cdr(assoc 1 (entget x)))))ent))
        (setq filter (append (list (cons 0 "*text")) '((-4 . "<or")) filter '((-4 . "or>"))))       
        (setq tt (ssget "_X" filter))
        (sssetfirst nil tt)               
        (princ)       
)

ssyfeng 发表于 2023-9-1 10:12:42

那个循环没啥用

;;根据文本*text图元名a创建一个选择集,该选择集包含全图中所有相同文字的文本
(defun W:wz (a / b pd tt)
(setq b (entget a))
(setq tt (ssget "_X" (list (cons 0 "*text")(cons 1 (cdr(assoc 1 b))))))
tt
)
;;错误函数
(defun err1 (sss)
(if sss
    (progn
      (princ "\n错误,仅能选择文字,请重新选择:")
      (setq *error* olderr)
    )
)
)
;;主函数
(defun c:dxz()
(setq olderr *error*
    *error* err1
)
(princ "\n请选择要查找的文字:")
(if (setq ss (ssget ":s" '((0 . "*TEXT"))))
    (progn
      (setq a (ssname ss 0))
      (setq tt (W:wz a))
      (sssetfirst nil tt)
    )
    (princ "\n未选中文字!")
)
(princ)
)

hubeiwdlue 发表于 2023-9-1 10:38:39

ssyfeng 发表于 2023-9-1 10:12
那个循环没啥用

谢谢您的指导,扩宽思路。我在重新写一个。

664571221 发表于 2023-9-1 11:36:47

hubeiwdlue 发表于 2023-9-1 10:38
谢谢您的指导,扩宽思路。我在重新写一个。

大神你重新写的能否上传一下

hubeiwdlue 发表于 2023-9-1 11:50:30

664571221 发表于 2023-9-1 11:36
大神你重新写的能否上传一下

我是新手,刚开始学,遇到问题就来论坛上问一下。:lol

664571221 发表于 2023-9-1 13:16:17

hubeiwdlue 发表于 2023-9-1 11:50
我是新手,刚开始学,遇到问题就来论坛上问一下。

重写的代码麻烦上传一下

xyp1964 发表于 2023-9-3 22:38:57

(defun c:tt ()
(princ "\n请选择要查找的文字: ")
(if (setq ss (ssget'((0 . "*TEXT"))))
    (sssetfirst nil ss)
)
(princ)
)
页: [1] 2
查看完整版本: entsel选择后,如何让被选择的对象区别于别的对象