乐筑天下

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

[编程交流] 关于“GetClosestPo”的问题

[复制链接]

59

主题

327

帖子

268

银币

后起之秀

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

铜币
295
发表于 2022-7-6 11:50:18 | 显示全部楼层 |阅读模式
你好
 
这是我的brew(信贷->在Asmi网站的帮助下):
 
  1. (defun c:getClosestPoint (/ obj pt1 pt2)
  2. ; Make variables local
  3. (vl-load-com)
  4. ; Loads the extended AutoLISP functions
  5. (setq
  6. obj (car (entsel))
  7. ; Select an object / curve
  8. pt1 (getpoint "\nGrab yourself a point:  ")
  9. ; As it says...
  10. pt2 (vlax-curve-getClosestPointTo obj pt1)
  11. ; The actual "determination" of the closest point
  12. ); end of setq
  13. (command "_.line" pt1 pt2 "")
  14. ; draw line between the 2 points
  15. (princ)
  16. ; clean running
  17. ); end of defun
  18. (princ)
  19. ;clean loading

 
是否可以以不必选择对象的方式修改此代码?我想一定有办法“得到离给定点最近的物体”。之后,AutoCad需要查找对象本身。
 
当有很多物体时,我知道很难精确,但这不是重点。我只想知道这是否可能,以及如何做到。
 
顺便说一句,像我想的那样,确定最近的点要容易得多。我希望我的问题的答案也是。
 
谢谢你帮我!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:53:55 | 显示全部楼层
也许是这样的,但我不想对成千上万的物体这样做。。。。
 
  1. (defun c:test (/ i ss pt ent lst Nrst)
  2. (if (and (setq i -1 ss (ssget "_X" '((0 . "*LINE,CIRCLE,ELLIPSE,ARC"))))
  3.           (setq pt (getpoint "\nSelect a Point: ")))
  4.    (progn
  5.    
  6.      (while (setq ent (ssname ss (setq i (1+ i))))
  7.        (setq lst
  8.          (cons
  9.            (cons ent (vlax-curve-getClosestPointto ent pt)) lst)))
  10.      (setq Nrst (car (vl-sort lst
  11.                        (function
  12.                          (lambda (a b)
  13.                            (< (distance (cdr a) pt)
  14.                               (distance (cdr b) pt)))))))
  15.      (entmakex (list (cons 0 "LINE")
  16.                      (cons 10 pt)
  17.                      (cons 11 (cdr Nrst))))))
  18. (princ))
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

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

铜币
295
发表于 2022-7-6 11:59:38 | 显示全部楼层
嗨,李,
 
这正是我需要知道的。非常感谢。
 
但是现在,对于学习部分。。。我弄不懂,那是因为我仍然缺乏知识。但是,我一直在进步。
 
如果你可以/想要的话,也许你可以再给我解释一下。
我很乐意。
 
干杯
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:01:09 | 显示全部楼层
 
当然,伙计:
 
  1. [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] i ss pt ent lst Nrst[b][color=RED])[/color][/b]
  2. [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=#009900]-1[/color][/b] [i][color=#990099];; Initiate Counter[/color][/i]
  3.                 ss [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=#a52a2a]"_X"[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#a52a2a]"*LINE,CIRCLE,ELLIPSE,ARC"[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  4.           [i][color=#990099];; Get A SelectionSet of all CurveObjects to iterate through[/color][/i]
  5.          
  6.           [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] pt [b][color=RED]([/color][/b][b][color=BLUE]getpoint[/color][/b] [b][color=#a52a2a]"\nSelect a Point: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [i][color=#990099];; Get Point from User[/color][/i]
  7.          
  8.      [b][color=RED])[/color][/b] [i][color=#990099]; end AND[/color][/i]
  9.    
  10.    [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b] [i][color=#990099];; Open Wrapper for 'then' statement[/color][/i]
  11.    
  12.      [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]ssname[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] i[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  13.        [i][color=#990099];; While we can get an entity name in the SelectionSet[/color][/i]
  14.       
  15.        [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] lst
  16.          [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]
  17.            [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]vlax-curve-getClosestPointto[/color][/b] ent pt[b][color=RED])[/color][/b][b][color=RED])[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  18.        [i][color=#990099];; Make a list of entities and closest Points (in case we need the object also)[/color][/i]
  19.        [i][color=#990099];; List looks like this:[/color][/i]
  20.        [i][color=#990099];; ((<Entity name: 7ef038c0> . (-23.3336 30.6639 0.0))[/color][/i]
  21.        [i][color=#990099];;  (<Entity name: 7ef038c8> . (-46.4083 3.42278 0.0)) ...)[/color][/i]
  22.       
  23.      [b][color=RED])[/color][/b] [i][color=#990099]; end WHILE[/color][/i]
  24.      [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Nrst [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b]  [i][color=#990099];; Get the First item of the Sorted List[/color][/i]
  25.                     [b][color=RED]([/color][/b][b][color=BLUE]vl-sort[/color][/b] lst
  26.                        [b][color=RED]([/color][/b][b][color=BLUE]function[/color][/b]
  27.                          [b][color=RED]([/color][/b][b][color=BLUE]lambda[/color][/b] [b][color=RED]([/color][/b]a b[b][color=RED])[/color][/b]
  28.                            [b][color=RED]([/color][/b][b][color=BLUE]<[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]distance[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] a[b][color=RED])[/color][/b] pt[b][color=RED])[/color][/b]
  29.                               [b][color=RED]([/color][/b][b][color=BLUE]distance[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] b[b][color=RED])[/color][/b] pt[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  30.      [i][color=#990099];; Sort the list by distance from the original selected point[/color][/i]
  31.      [b][color=RED]([/color][/b][b][color=BLUE]entmakex[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]0[/color][/b] [b][color=#a52a2a]"LINE"[/color][/b][b][color=RED])[/color][/b]
  32.                      [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]10[/color][/b] pt[b][color=RED])[/color][/b]
  33.                      [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=#009900]11[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] Nrst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
  34.      [i][color=#990099];; Create a line from the user selected point to the nearest point[/color][/i]
  35. [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b] [i][color=#990099];; Exit Cleanly[/color][/i]

 
两个缺点意味着:把一个新的项目放在列表中,作为第一个项目?
 
哦。。。这很难,但需要学习。
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

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

铜币
295
发表于 2022-7-6 12:06:26 | 显示全部楼层
当与两个原子一起使用时,cons会形成一个点对,或者,当与一个原子/列表和另一个列表一起使用时,它会将原子/列表添加到列表的开头。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:08:09 | 显示全部楼层
嗨,李,我想知道你Lisp程序的样子。
 
你能解释一下ENTMAKE和ENMAKEX之间的区别吗?
 
谢谢
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

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

铜币
295
发表于 2022-7-6 12:12:33 | 显示全部楼层
我倾向于在entmake上使用entmakex,因为它返回新创建实体的实体名,这可能很有用。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:15:35 | 显示全部楼层
 
 
所以有点像
 
 
(entmake(列表(cons 0“行”)
(cons 10 pt)
(cons 11(cdr NrstϨϨϨ)Ϩ)
(setq线(entlast))
回复

使用道具 举报

32

主题

430

帖子

423

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
150
发表于 2022-7-6 12:17:39 | 显示全部楼层
这将得到相同的结果:
 
  1. (setq ent1 (ssname sset 0))   ; Gets the name of the first entity in sset.
  1. (setq line (entmakex (list (cons 0 "LINE")
  2.                           (cons 10 p1)
  3.                           (cons 11 p2))))

 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:23:19 | 显示全部楼层
谢谢李。
你现在不迟到吗?
这里是晚上8:30
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 10:16 , Processed in 0.599640 second(s), 72 queries .

© 2020-2025 乐筑天下

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