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"方式进行选择;


szx025 发表于 2023-7-27 09:41:00

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


谢谢院长的出手,但问题依旧,看来不是ZOOM到问题,
页: 1 [2]
查看完整版本: 选择集问题