乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 19|回复: 19

[编程交流] 如何获得最近的端点o

[复制链接]

21

主题

80

帖子

59

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-6 11:23:37 | 显示全部楼层 |阅读模式
大家好。
我需要一个函数的组合,可以获得一条线的最近端点,通过点击它或穿过窗口进行选择。
请引导我。。。。
谢谢
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:29:00 | 显示全部楼层
我已经用过几次了。
 
  1. ;;; Retrieve closest end point on object
  2. ;;; #EntPnt - List with object and point
  3. ;;; Alan J. Thompson, 11.10.09
  4. (defun AT:ClosestEndPoint (#EntPnt)
  5.    (if (vl-consp #EntPnt)
  6.      (car (vl-sort
  7.             (list (vlax-curve-getstartpoint (car #EntPnt))
  8.                   (vlax-curve-getendpoint (car #EntPnt))
  9.             ) ;_ list
  10.             (function
  11.               (lambda (a b)
  12.                 (< (distance (trans (cadr #EntPnt) 1 0) a) (distance (trans (cadr #EntPnt) 1 0) b))
  13.               ) ;_ lambda
  14.             ) ;_ function
  15.           ) ;_ vl-sort
  16.      ) ;_ car
  17.    ) ;_ if
  18. ) ;_ defun
回复

使用道具 举报

4

主题

327

帖子

324

银币

初来乍到

Rank: 1

铜币
19
发表于 2022-7-6 11:31:09 | 显示全部楼层
我确信有几种方法可以实现这一点,但一种方法是使用(entsel)函数。这将返回实体名称和拾取点的坐标。
使用(entget)函数首先验证它是一条线,然后获取起点和终点。
如果用户未拾取任何内容或对象不是直线,则可能需要使用while循环来捕捉错误。
然后使用(距离)功能检查从拾取点到直线起点的距离,然后检查拾取点到直线终点的距离。
然后使用(min)函数查找最短距离。
使用交叉窗口是可以实现的,但它需要更多的代码,并且仍然会出现错误的情况,例如:如果用户使用windows 2行怎么办?
你怎么知道该在哪一行上运行程序。因此,最好坚持使用“在线上拾取点”选项。
如果您有任何问题或需要帮助,请开始编码并发布
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:35:04 | 显示全部楼层
另一个,与艾伦的没有什么不同
 
  1. (defun GetClosestEndInSS (ss pt / GetPoints)
  2. (vl-load-com) ;; Lee Mac  ~  11.04.10
  3. (setq pt (trans pt 1 0))
  4. (defun GetPoints (ss / i ent lst)
  5.    (setq i -1)
  6.    (while (setq ent (ssname ss (setq i (1+ i))))
  7.      (setq lst (cons (vlax-curve-getStartPoint ent)
  8.                      (cons (vlax-curve-getEndPoint ent) lst))))
  9.    lst)
  10. (car (vl-sort (GetPoints ss) (function (lambda (a b) (< (distance pt a)
  11.                                                          (distance pt b)))))))
  12. (defun c:test (/ ss pt)
  13. (if (and (setq ss (ssget))
  14.           (setq pt (getpoint "\nPoint to Test: ")))
  15.    (entmake (list (cons 0 "POINT") (cons 10 (GetClosestEndInSS ss pt)))))
  16. (princ))
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:38:00 | 显示全部楼层
将我的应用到选择集的好方法。但是,您忘记了选择点上的trans。
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:39:47 | 显示全部楼层
 
谢谢Alan,但我不确定是否错过了trans…:眨眼:
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:44:26 | 显示全部楼层
呼呼,你说得对,奇怪。我收回了。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:48:44 | 显示全部楼层
 
别担心
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:50:49 | 显示全部楼层
好了,现在我知道为什么我这么困惑了,我有了它。当我最初编写上述sub时,我首先使用entsel中的点来提取vlax曲线getClosetPointOnCurve,因此我必须平移该点以获得正确的closestpoint,但我在不久前对其进行了修改以删除它(意识到它是无意义的),我从未考虑过删除trans。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:53:55 | 显示全部楼层
 
但是由于ENTSEL返回(),仍然需要TRANS?
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 02:34 , Processed in 0.630458 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表