明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1281|回复: 13

[提问] 选择集问题

[复制链接]
发表于 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的陷阱

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2023-7-26 15:48:29 | 显示全部楼层
本帖最后由 llsheng_73 于 2023-7-26 16:39 编辑

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

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

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


发表于 2023-7-25 22:46:32 | 显示全部楼层
  1. (if (and (setq en (car (entsel "\n选择踏步直线: ")))
  2.          (setq p1 (cdr (assoc 10 (entget en))))
  3.          (setq p2 (cdr (assoc 11 (entget en))))
  4.     )
  5.   (progn
  6.     (setq ra (angle p1 p2)
  7.           p3 (mapcar '(lambda (x y) (* (+ x y) 0.5)) p1 p2)
  8.           p4 (polar p3 (+ ra (* pi 0.5)) 410)
  9.     )
  10.     (command "zoom" "w" p3 p4)
  11.     (setq ss (ssget "f" (list p3 p4) '((8 . "楼梯"))))
  12.     (command "zoom" "p")
  13.    (if ss (sssetfirst nil ss))
  14.   )
  15. )
发表于 2023-7-24 08:56:22 | 显示全部楼层
选择不到对象是因为,这个这个选择集获取跟图像在屏幕上的显示大小相关。简单来说,你需要利用zoom相关函数,把图形以选取的中心点进行放大,才能准确以某个中心点进行对象自动选取,选取后恢复原来的视角。
原理和手动选取一样,图形越大,越能在密密麻麻的图像中精准的选取的对象
ZOOM相关函数研究一下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

正解。好多函数都与像素有关。  发表于 2023-7-24 09:07
发表于 2023-7-24 08:46:55 | 显示全部楼层
这个应该就是没选到对象,好好检查一下是哪几个坐标栏选不了对象就知道了。
 楼主| 发表于 2023-7-24 09:11:49 | 显示全部楼层
应该不是上面说的问题,因为我画一个简单图形程序执行正常,我把这个图原位旋转一个角度,再执行这个程序,ss=nil,  再把这个图旋转一下,程序又正常了
发表于 2023-7-24 09:33:06 | 显示全部楼层
szx025 发表于 2023-7-24 09:11
应该不是上面说的问题,因为我画一个简单图形程序执行正常,我把这个图原位旋转一个角度,再执行这个程序, ...

  相信你的判断,等你找到10次为啥不正常的答案,记得再来发帖额,我想学习一下
发表于 2023-7-24 10:56:02 | 显示全部楼层
学习学习,期待解决
 楼主| 发表于 2023-7-24 11:35:12 | 显示全部楼层
我刚开始以为是坐标点是三维点造成的,全部转换成二维点后,还是有这个问题,为啥不正常的答案还有请高人出场
发表于 2023-7-24 13:24:11 | 显示全部楼层
选择集最多只能新建128个,需要及时删除不用的选择集。是不是这个原因?
发表于 2023-7-25 10:03:01 | 显示全部楼层
本帖最后由 飞雪神光 于 2023-7-25 10:08 编辑

上图哇 瞅瞅 从代码上看是在直线一侧搜索 如果搜不到就是没图形或者出视口 或者视口显示范围过大 都容易选不到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 00:26 , Processed in 0.191496 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表