DGRL 发表于 2022-7-5 15:26:38

通过插入点选择对象

Hi编码器
 
 
想知道是否可以使用visual lisp从仅包含插入点的列表中选择多个对象
 
所以这个列表包含了需要逐个选择的不同对象的多个插入点,如果在我的例程中实现,请对其进行处理

Grrr 发表于 2022-7-5 15:34:33

是-如果对象是块/文本,则遍历所有对象并检查其insertionpoint属性。
否则,如果对象不支持此类属性,则使用“扩展圆”方法选择给定模糊值上最近的对象。

rlx 发表于 2022-7-5 15:34:43

就寝前快点
 
https://www.cadtutor.net/forum/attachment.php?attachmentid=63592&cid=1&stc=1
 

; near point - written for DGRL - rlx 25-3-2018
; pl is point list '((x y)(x y)...) , fz is fuzz factor
(defun c:tst ( / pl fz ss)
(setq pl '((10 50)(20 50)(30 50)(40 50)(50 50)) fz 1 ss (ssget '((0 . "INSERT"))))
(if ss (mapcar '(lambda (x) (princ "\n")(princ (getip x))) (chk (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))))
(princ)
)

(defun chk (%ss / l) (mapcar '(lambda (x) (if (near-member (getip x) pl fz) (setq l (cons x l)))) %ss) l)

(defun near-member (l1 l2 tol) (vl-some (function (lambda (l3) (vl-every '(lambda (n1 n2)(equal n1 n2 tol)) l1 l3))) l2))
(defun getip (e) (list (cadr (assoc 10 (entget e)))(caddr (assoc 10 (entget e)))))

(vl-load-com)

;(near-member '(20 50) '((10 50) (20 50) (30 50) (40 50)(50 50)) 0.1) -> T
;(near-member '(20 51) '((10 50) (20 50) (30 50) (40 50)(50 50)) 0.1) -> nil

gr.Rlx

DGRL 发表于 2022-7-5 15:40:56

@rlx公司
 
 
谢谢你的例子
感谢:-D

Lee Mac 发表于 2022-7-5 15:45:38

请注意,可以直接从ssget筛选器列表中筛选此类组

hanhphuc 发表于 2022-7-5 15:47:50

 
FWIW,我更喜欢关系测试
优点:简单、可靠、高效
缺点:没有模糊
 

(setq pl '((10. 50.)(20. 50.)(30. 50.)(40. 50.)(50. 50.)); point list
ss
(ssget
(append (vl-list* '(0 . "CIRCLE,TEXT,INSERT"); filter
          '(-4 . "<OR")
          (apply 'append (mapcar ''((x) (list '(-4 . "=,=,*") (cons 10 x))) pl ))
          )
'((-4 . "OR>"))
)
   )
)
)

hanhphuc 发表于 2022-7-5 15:51:22

 
哦在提交帖子之前,李击败了我

rlx 发表于 2022-7-5 15:56:32

 
昨晚,我的近会员功能来找我,说他想要一份工作,因为他很无聊。。。所以我给了他一个。。。

rlx 发表于 2022-7-5 15:59:14

 
我之所以使用fuzz,是因为我使用了一个函数将整个数组或字符串、行和列的“表”从一个集合复制到另一个集合,并且存在混合对齐问题。因此,一列使用了左中,另一列使用了中中等。然后“很快”发现,第10组和第11组都不总是可信的。所以决定使用模糊因子,我的大部分或所有问题都解决了。如果坐标确实可靠,那么你是对的,一个“简单”的ssget过滤器就足够了。
 
gr.Rlx

Lee Mac 发表于 2022-7-5 16:06:17

 
在这种情况下,模糊因素仍然是可能的,例如:
(defun ssget-by-pointlist ( lst fuz )
   (ssget "_X"
       (append
          '(
               (0 . "ARC,CIRCLE,ELLIPSE,INSERT,TEXT,MTEXT,POINT") ;; Objects for which DXF 10 is meaningful
               (-4 . "<OR")
         )
         (apply 'append
               (mapcar
                  '(lambda ( x )
                     (list
                        '(-4 . "<AND")
                        '(-4 . ">=,>=,>=")
                           (cons 10 (mapcar '- x (list fuz fuz fuz)))
                        '(-4 . "<=,<=,<=")
                           (cons 10 (mapcar '+ x (list fuz fuz fuz)))
                        '(-4 . "AND>")
                     )
                   )
                   lst
               )
         )
          '(
               (-4 . "OR>")
         )
       )
   )
)
 
我猜这是你的另一个老功能。
页: [1] 2
查看完整版本: 通过插入点选择对象