本帖最后由 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"方式进行选择;
|