szx025 发表于 2023-7-24 08:40:39

选择集问题

(setq en (car (entsel "\n选择踏步直线:"))
      pt1 (cdr (assoc 10 (entget en)))
      pt2 (cdr (assoc 11 (entget en)))
      ku1 (angle pt1 pt2)
      Id (mapcar '(lambda (x y) (* (+ x y) 0.5)) pt1 pt2)
      I2 (polar Id (+ ku1 (* pi 0.5)) 410)
      ss(ssget "f" (list Id I2) '((8 . "楼梯" )))
      )
这个获取选择集代码执行100次90多次都正常,但有时ss(ssget "f" (list Id I2) '((8 . "楼梯" )))这个SS就选不到东西,ss=nil,有人遇到过这种问题吗,难道这也是LISP的陷阱

llsheng_73 发表于 2023-7-26 15:48:29

本帖最后由 llsheng_73 于 2023-7-26 16:39 编辑

ssget"F"可能存在问题,给定的栏选坐标没有与要选择的目标相连,虽然肉眼看上去应该是相连的,比如在直线段起止点之间取两个点,理论上这两个点都是过直线的,但实际上由于实数精度问题,它们有可能并不在直线段上,当然,这个问题也不是绝对的,所以有时就可能抽疯。。。。
比如选定一条直线等分成10000份,以过等分点与已知直线的垂线作为栏选线进行选择,按说每次都应该能选到那个直线(因为栏选所用的点有一个是直线上的等分点),但实际上肯定会经常选不到目标,
下边一段测试代码选择直线后,在直线上取10000个等分点,计算栏选线来对直线进行栏选,分别记录选择成功与失败次数,不管直线怎么画,最后的结果总是接近一半一半


(defun c:tt(/ e d i j p dis ang)
(if(setq e(ssget":E:S"'((0 . "line"))))
    (progn(setq e(ssname e 0)d(*(vlax-curve-getendparam e)0.0001)dis 0 i 0 j 0
                ang(+(angle(vlax-curve-getstartpoint e)(vlax-curve-getendpoint e))(* pi 0.5)))
      (while(setq dis(+ dis d)p(vlax-curve-getpointatparam e dis))
        (if(ssget"F"(List p(polar p ang 1))'((0 . "line")))
          (setq j(+ 1 j))
           (setq i(+ i 1))))))
(List j i))

对于与栏选线相交的情况,需要保证被选择对象与栏选线不在虚部相交;
对于栏选线端点与被选对象似接触,建议适当延伸栏选线端点,在可控范围内变成与被选对象相交;
对于被选对象端点与栏选线似接触的情况就比较麻烦,建议对栏选线进行双向微距偏移把栏选线变成选择范围,用"CP"方式进行选择;


xyp1964 发表于 2023-7-25 22:46:32

(if (and (setq en (car (entsel "\n选择踏步直线: ")))
       (setq p1 (cdr (assoc 10 (entget en))))
       (setq p2 (cdr (assoc 11 (entget en))))
    )
(progn
    (setq ra (angle p1 p2)
          p3 (mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2)
          p4 (polar p3 (+ ra (* pi 0.5)) 410)
    )
    (command "zoom" "w" p3 p4)
    (setq ss (ssget "f" (list p3 p4) '((8 . "楼梯"))))
    (command "zoom" "p")
   (if ss (sssetfirst nil ss))
)
)

liuhe 发表于 2023-7-24 08:56:22

选择不到对象是因为,这个这个选择集获取跟图像在屏幕上的显示大小相关。简单来说,你需要利用zoom相关函数,把图形以选取的中心点进行放大,才能准确以某个中心点进行对象自动选取,选取后恢复原来的视角。
原理和手动选取一样,图形越大,越能在密密麻麻的图像中精准的选取的对象
ZOOM相关函数研究一下。

ssyfeng 发表于 2023-7-24 08:46:55

这个应该就是没选到对象,好好检查一下是哪几个坐标栏选不了对象就知道了。

szx025 发表于 2023-7-24 09:11:49

应该不是上面说的问题,因为我画一个简单图形程序执行正常,我把这个图原位旋转一个角度,再执行这个程序,ss=nil,再把这个图旋转一下,程序又正常了

liuhe 发表于 2023-7-24 09:33:06

szx025 发表于 2023-7-24 09:11
应该不是上面说的问题,因为我画一个简单图形程序执行正常,我把这个图原位旋转一个角度,再执行这个程序, ...

:lol相信你的判断,等你找到10次为啥不正常的答案,记得再来发帖额,我想学习一下

loveu515 发表于 2023-7-24 10:56:02

学习学习,期待解决

szx025 发表于 2023-7-24 11:35:12

我刚开始以为是坐标点是三维点造成的,全部转换成二维点后,还是有这个问题,为啥不正常的答案还有请高人出场

jiman 发表于 2023-7-24 13:24:11

选择集最多只能新建128个,需要及时删除不用的选择集。是不是这个原因?

飞雪神光 发表于 2023-7-25 10:03:01

本帖最后由 飞雪神光 于 2023-7-25 10:08 编辑

上图哇 瞅瞅 从代码上看是在直线一侧搜索 如果搜不到就是没图形或者出视口 或者视口显示范围过大 都容易选不到
页: [1] 2
查看完整版本: 选择集问题