wanchr 发表于 2023-12-14 09:59:10

什么原因有些块选不中,懂的提教教我,谢谢。

你选择的一个原始对象信息:
((-1 . <图元名: 20d3310c4a0>) (0 . INSERT) (330 . <图元名: 20ddec4d990>) (5 . 4599A) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . XS-5#基础$1$pile) (62 . 6) (100 . AcDbBlockReference) (2 . XS-5#基础$1$pile2) (10 -403208.0 191167.0 0.0) (41 . -1.25) (42 . 1.25) (43 . 1.25) (50 . 4.71239) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
默认过滤条件:
((2 . XS-5#基础$1$pile2) (0 . INSERT) (100 . AcDbEntity) (8 . XS-5#基础$1$pile))
选择对象: 找到 0 个
我选择对象本身还是没选中。问题出在哪了

wanchr 发表于 2023-12-15 19:02:54

本帖最后由 wanchr 于 2023-12-15 19:54 编辑



(defun transsfilter (str / tf);就是你的函数啊。
(vl-list->string
    (apply 'append
      (mapcar
      (function (lambda (c)
          (if (or (> c 128) tf)
            (progn
            (if (not tf) (setq tf t) (setq tf nil))
            (list c))
            (progn
            (setq tf nil)
            (if (member c '(35 64 46 42 63 126 91 93 45 44))
                (list 96 c)
                (list c)))))) (vl-string->list str)))))
(defun get-entity-info()
(setq entity-info (entget entity)) ; 获取所选对象的信息
(princ (strcat "\n你选择的一个原始对象信息:\n" (vl-princ-to-string entity-info))) ; 显示所选对象的信息
(princ "\n")
(progn
    (setq aa (assoc 8 entity-info))
    (princ aa)
    (cons (car aa) (transsfilter (cdr aa)))
    (princ "\n")
    (princ aa)
    (princ "\n")
    )
(setq layer-name (cdr aa));就是用你的函数吗
;(setq layer-name (cdr (assoc 8 entity-info))) ; 获取所选对象的图层名
;(princ layer-name)
;(princ "\n")
;(setq nname (cdr (assoc 100 entity-info))) ; 获取所选对象的名称
;(setq entity-type (cdr (assoc 0 entity-info))) ; 获取所选对象的类型
;(setq bname (cdr (assoc 2 entity-info)))
)
(defun build-filter()
    (setq filter nil) ; 初始化过滤条件为空列表
(if layer-name
    (setq filter (cons (cons 8 layer-name) filter))) ; 如果图层名存在,则将图层名添加到过滤条件中
(if nname
    (setq filter (cons (cons 100 nname) filter))) ; 如果名称存在,则将名称添加到过滤条件中
(if entity-type
    (setq filter (cons (cons 0 entity-type) filter))) ; 如果类型存在,则将类型添加到过滤条件中
(if bname
   (setq filter (cons (cons 2 bname) filter)))
(princ (strcat "\n默认过滤条件:\n" (vl-princ-to-string filter))) ; 显示构建的过滤条件
)

wanchr 发表于 2023-12-15 09:39:22

wzg356 发表于 2023-12-14 11:02
通配符转义 ,来自晓东
;SSGET的一些字符串是统配符,比如. # , *等等
;如果要过滤的字符串中包括这些, ...

(defun get-entity-info()
(setq entity-info (entget entity)) ; 获取所选对象的信息
(princ (strcat "\n你选择的一个原始对象信息:\n" (vl-princ-to-string entity-info))) ; 显示所选对象的信息
(princ "\n")
(progn
    (setq aa (assoc 2 entity-info))
    (princ aa)
    (cons (car aa) (transsfilter (cdr aa)))
    (princ "\n")
    (princ aa)
    (princ "\n")
    )
(setq bname (cdr aa))
结果还是选不中自身,一个条件还是选不中他,哥再帮我看一眼,
你选择的一个原始对象信息:
((-1 . <图元名: 2a4aa923d40>) (0 . INSERT) (330 . <图元名: 2a49924e990>) (5 . 459A4) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . XS-5#基础$1$pile) (62 . 6) (100 . AcDbBlockReference) (2 . XS-5#基础$1$pile2) (10 -382938.0 247912.0 0.0) (41 . -1.25) (42 . 1.25) (43 . 1.25) (50 . 4.71239) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
(2 . XS-5#基础$1$pile2)
(2 . XS-5#基础$1$pile2)
默认过滤条件:
((2 . XS-5#基础$1$pile2))
选择对象: 找到 0 个
选择对象: 指定对角点: 找到 0 个,总计 0 个

wzg356 发表于 2023-12-14 11:02:25

本帖最后由 wzg356 于 2023-12-14 11:05 编辑

通配符转义 ,来自晓东
;SSGET的一些字符串是统配符,比如. # , *等等
;如果要过滤的字符串中包括这些,会过滤不到,用下面这个函数转义下就OK 了。
;(transsfilter "*s#s")
(defun transsfilter (str / tf)
      (vl-list->string (apply 'append(mapcar(function(lambda (c)
      (if (or (> c 128) tf)
            (progn(if (not tf)(setq tf t)(setq tf nil))(list c))
            (progn (setq tf nil)
                (if (member c '(35 64 46 42 63 126 91 93 45 44))(list 96 c)(list c))
            )
      )
    ))(vl-string->list str))))
)
处理好了把它贴到你0楼去


(if (member n '(2 8 6))(progn
      (setq aa(assoc n entity-info))
      (cons (car aa)(transsfilter (cdr aa)))
))

kozmosovia 发表于 2023-12-14 10:02:34

#和$是通配符,需要转写成`#和`$

wanchr 发表于 2023-12-14 10:24:22

本帖最后由 wanchr 于 2023-12-14 10:26 编辑

kozmosovia 发表于 2023-12-14 10:02
#和$是通配符,需要转写成`#和`$
是这个原因啊,可2,100, 0,8 是我用函数收集上面的图元信息,我要怎么改写程序呢。


(defun get-entity-info()
(setq entity-info (entget entity)) ; 获取所选对象的信息
(princ (strcat "\n你选择的一个原始对象信息:\n" (vl-princ-to-string entity-info))) ; 显示所选对象的信息
(setq layer-name (cdr (assoc 8 entity-info))) ; 获取所选对象的图层名
(setq nname (cdr (assoc 100 entity-info))) ; 获取所选对象的名称
(setq entity-type (cdr (assoc 0 entity-info))) ; 获取所选对象的类型
(setq bname

飞雪神光 发表于 2023-12-14 10:43:07

wanchr 发表于 2023-12-14 10:24
是这个原因啊,可2,100, 0,8 是我用函数收集上面的图元信息,我要怎么改写程序呢。




和这里没关系 改ssget的过滤条件里的通配符

wanchr 发表于 2023-12-15 13:29:07

(8 . XS-5#基础$1$pile) 把他改一下名是能选中的,看来就是他的问题。

wzg356 发表于 2023-12-15 17:13:41

wanchr 发表于 2023-12-15 09:39
(defun get-entity-info()
(setq entity-info (entget entity)) ; 获取所选对象的信息
(princ (str ...

与$无关-transsfilter没处理没包含
与#相关

试过,可以选中的
你的语句也没问题
用我的那个选择工具试一试-别编辑块名

Andyhon 发表于 2023-12-15 17:37:30

个人的实务经验是
Block &... 最好别用中文命名
花了很多时间才查出程序的卡点是它
也或许只是我不巧遇上踩雷而已

masterlong 发表于 2023-12-15 17:54:55

这么多回复
就没人提醒一下字符串还要加双引号的么?
页: [1] 2
查看完整版本: 什么原因有些块选不中,懂的提教教我,谢谢。