乐筑天下

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

[编程交流] 选择端点

[复制链接]

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 10:28:11 | 显示全部楼层 |阅读模式
如果我想检查用户是否选择了一个点,我
将具有以下代码;
 
  1. (setq Pt1 (getpoint "\n pick point"))
  2.    (if Pt1  
  3.          (progn
  4.                     ;do some stuff
  5.           )        
  6.         (alert "Nothing Picked.")  
  7.        )

 
但是,我如何检查用户是否选择了线或pline的“端点”?
谢谢
回复

使用道具 举报

0

主题

127

帖子

130

银币

限制会员

铜币
-2
发表于 2022-7-6 10:38:38 | 显示全部楼层
一种方法是:
  1. (if (and (setq Pt1 (getpoint "\n pick point"))
  2.         (setq Pt1 (osnap Pt1 "_ENDP"))
  3.    )
  4. (alert (vl-princ-to-string Pt1))
  5. ;; else
  6. (alert "Ooops")
  7. )

 
[已添加]
这实际上并不检查所选点是否为端点(您需要为此编写显式代码)。。选择初始点时,它会将点值强制到选择选取框下图元的最近端点。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 10:40:32 | 显示全部楼层
很容易,你选择线入口,然后比较拾取点和结束点和开始点之间的距离。较短的距离就是你想要的结束。
 
这是答案
 
  1. (setq tp1 (entsel "\nSelect left side inner wall near end : "))
  2. (setq tpp1 (entget (car tp1)))
  3. (setq pt1 (cdr (assoc 10 tpp1)))      
  4. (setq pt2 (cdr (assoc 11 tpp1)))      
  5. (setq pt3 (cadr tp1))
  6. (setq d1 (distance pt1 pt3))
  7. (setq d2 (distance pt2 pt3))
  8. (if (> d1 d2)
  9. (progn
  10.   (setq temp pt1)
  11.   (setq pt1 pt2)
  12.   (setq pt2 temp)
  13. )
  14. )

 
好东西是你可以把其他的东西,以及图层颜色等
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 10:50:22 | 显示全部楼层
这是另一个可以得到一行终点的代码,几乎和比格尔的代码一样。。。
 
  1. (vl-load-com)
  2. (if (setq Lin (ssget "_+.:S" '((0 . "LINE"))))
  3. (progn
  4.    (setq Ent (ssname Lin 0)
  5.   Obj (vlax-ename->vla-object Ent)
  6.   End (vlax-get obj 'endpoint)
  7.   )
  8.    )
  9. (alert "Nothing's Picked")
  10. )

 
塔瓦特
回复

使用道具 举报

2

主题

74

帖子

72

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 10:52:53 | 显示全部楼层
我的版本
  1. (Defun Get_End_Point (/ oldosmod flag point)
  2. (vl-load-com)
  3. (setq        oldosmod (getvar 'OSMODE)
  4. flag         T
  5. )
  6. (vl-catch-all-apply
  7.    (function
  8.      (lambda ()
  9. (setvar 'OSMODE 1)
  10. (while flag
  11.   (setq        point (getpoint "\nSelect an Endpoint <Exit>:")
  12.   )
  13.   (cond
  14.     ((not point)
  15.      (setq flag        nil
  16.            point nil
  17.      )
  18.     )
  19.     ((ssget point) (setq flag nil))
  20.     (t (princ "\n Miss"))
  21.   )
  22. )
  23.      )
  24.    )
  25. )
  26. (setvar 'OSMODE oldosmod)
  27. point
  28. )
回复

使用道具 举报

0

主题

127

帖子

130

银币

限制会员

铜币
-2
发表于 2022-7-6 11:01:06 | 显示全部楼层
 
有几件事:
1) 在您的样本中,PROGN是冗余的(不是必需的)。
2) 您假设用户将选择“线的端点…”。。。在您的代码中,无论实际选择的端点是什么,都会返回“端点”。
你测试代码了吗??
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 11:04:30 | 显示全部楼层
 
你好,克里。
 
你对(progn)函数的看法是对的,实际上在该函数之后的其他代码是(setq….和(setq….等等)
忘记将其移除。
 
我对代码进行了很好的测试,正如你们所知,它会给出所选直线终点的坐标。这不是为了检查
用户已选择提问者要求的点。
 
我同意你的观点。
 
谢谢你的关注。
 
塔瓦特
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 11:15:59 | 显示全部楼层
在我看来,OP试图选择一条曲线并捕捉到最近的端点。曲线有一个起点和终点,但它至少有两个端点捕捉可以拾取到的点。
 
这个怎么样?
  1. (defun foo (/ e)
  2. (if (setq e (entsel))
  3.    (osnap (cadr e) "_ENDP")
  4. )
  5. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 11:18:56 | 显示全部楼层
为了好玩。。。
 
  1. (defun AT:ClosestPoint (ep / _next _dist ep el lst)
  2. ;; Return closest point to selected entity
  3. ;; ep - entity and point list
  4. ;; Alan J. Thompson, 09.14.10
  5. (defun _next (e / p)
  6.    (if (and (setq e (entnext e)) (setq p (cdr (assoc 10 (entget e)))))
  7.      (cons p (_next e))
  8.    )
  9. )
  10. (defun _dist (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
  11. (if
  12.    (and (vl-consp ep)
  13.         (eq (type (car ep)) 'ENAME)
  14.         (or (eq 1 (getvar 'worlducs)) (setq ep (list (car ep) (trans (cadr ep) 1 0))))
  15.         (cond
  16.           ((vl-position (cdr (assoc 0 (setq el (entget (car ep))))) '("ARC" "LINE" "SPLINE"))
  17.            (setq lst (list (vlax-curve-getStartPoint (car ep)) (vlax-curve-getEndPoint (car ep))))
  18.           )
  19.           ((eq (cdr (assoc 0 el)) "LWPOLYLINE")
  20.            (foreach p el (and (eq (car p) 10) (setq lst (cons (cdr p) lst))))
  21.            lst
  22.           )
  23.           ((eq (cdr (assoc 0 el)) "POLYLINE") (setq lst (_next (car ep))))
  24.         )
  25.    )
  26.     (car (vl-sort lst (function (lambda (a b) (< (_dist a (cadr ep)) (_dist b (cadr ep)))))))
  27. )
  28. )
eg。
  1. (defun c:Test (/ p)
  2. (if (setq p (AT:ClosestPoint (entsel "\nSelect curve: ")))
  3.    (entmake (list '(0 . "CIRCLE") (cons 10 p) '(40 . 10.)))
  4. )
  5. (princ)
  6. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 11:23:11 | 显示全部楼层
哇,有多少种方法可以找到端点!
 
只要对我的代码进行一个快速的解释,就可以用于房屋实际指定从一端到另一个门窗的距离,并且知道你在墙的哪一部分,只要得到端点,就可能在错误的墙上画出一扇门,记住墙也是由多个元素组成的,该代码在vla和autocad architect之前大约有10年的历史。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 17:38 , Processed in 0.382062 second(s), 72 queries .

© 2020-2025 乐筑天下

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