选择端点
如果我想检查用户是否选择了一个点,我将具有以下代码;
(setq Pt1 (getpoint "\n pick point"))
(if Pt1
(progn
;do some stuff
)
(alert "Nothing Picked.")
)
但是,我如何检查用户是否选择了线或pline的“端点”?
谢谢 一种方法是:
(if (and (setq Pt1 (getpoint "\n pick point"))
(setq Pt1 (osnap Pt1 "_ENDP"))
)
(alert (vl-princ-to-string Pt1))
;; else
(alert "Ooops")
)
[已添加]
这实际上并不检查所选点是否为端点(您需要为此编写显式代码)。。选择初始点时,它会将点值强制到选择选取框下图元的最近端点。 很容易,你选择线入口,然后比较拾取点和结束点和开始点之间的距离。较短的距离就是你想要的结束。
这是答案
(setq tp1 (entsel "\nSelect left side inner wall near end : "))
(setq tpp1 (entget (car tp1)))
(setq pt1 (cdr (assoc 10 tpp1)))
(setq pt2 (cdr (assoc 11 tpp1)))
(setq pt3 (cadr tp1))
(setq d1 (distance pt1 pt3))
(setq d2 (distance pt2 pt3))
(if (> d1 d2)
(progn
(setq temp pt1)
(setq pt1 pt2)
(setq pt2 temp)
)
)
好东西是你可以把其他的东西,以及图层颜色等 这是另一个可以得到一行终点的代码,几乎和比格尔的代码一样。。。
(vl-load-com)
(if (setq Lin (ssget "_+.:S" '((0 . "LINE"))))
(progn
(setq Ent (ssname Lin 0)
Obj (vlax-ename->vla-object Ent)
End (vlax-get obj 'endpoint)
)
)
(alert "Nothing's Picked")
)
塔瓦特 我的版本
(Defun Get_End_Point (/ oldosmod flag point)
(vl-load-com)
(setq oldosmod (getvar 'OSMODE)
flag T
)
(vl-catch-all-apply
(function
(lambda ()
(setvar 'OSMODE 1)
(while flag
(setq point (getpoint "\nSelect an Endpoint <Exit>:")
)
(cond
((not point)
(setq flag nil
point nil
)
)
((ssget point) (setq flag nil))
(t (princ "\n Miss"))
)
)
)
)
)
(setvar 'OSMODE oldosmod)
point
)
有几件事:
1) 在您的样本中,PROGN是冗余的(不是必需的)。
2) 您假设用户将选择“线的端点…”。。。在您的代码中,无论实际选择的端点是什么,都会返回“端点”。
你测试代码了吗??
你好,克里。
你对(progn)函数的看法是对的,实际上在该函数之后的其他代码是(setq….和(setq….等等)
忘记将其移除。
我对代码进行了很好的测试,正如你们所知,它会给出所选直线终点的坐标。这不是为了检查
用户已选择提问者要求的点。
我同意你的观点。
谢谢你的关注。
塔瓦特 在我看来,OP试图选择一条曲线并捕捉到最近的端点。曲线有一个起点和终点,但它至少有两个端点捕捉可以拾取到的点。
这个怎么样?
(defun foo (/ e)
(if (setq e (entsel))
(osnap (cadr e) "_ENDP")
)
) 为了好玩。。。
(defun AT:ClosestPoint (ep / _next _dist ep el lst)
;; Return closest point to selected entity
;; ep - entity and point list
;; Alan J. Thompson, 09.14.10
(defun _next (e / p)
(if (and (setq e (entnext e)) (setq p (cdr (assoc 10 (entget e)))))
(cons p (_next e))
)
)
(defun _dist (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
(if
(and (vl-consp ep)
(eq (type (car ep)) 'ENAME)
(or (eq 1 (getvar 'worlducs)) (setq ep (list (car ep) (trans (cadr ep) 1 0))))
(cond
((vl-position (cdr (assoc 0 (setq el (entget (car ep))))) '("ARC" "LINE" "SPLINE"))
(setq lst (list (vlax-curve-getStartPoint (car ep)) (vlax-curve-getEndPoint (car ep))))
)
((eq (cdr (assoc 0 el)) "LWPOLYLINE")
(foreach p el (and (eq (car p) 10) (setq lst (cons (cdr p) lst))))
lst
)
((eq (cdr (assoc 0 el)) "POLYLINE") (setq lst (_next (car ep))))
)
)
(car (vl-sort lst (function (lambda (a b) (< (_dist a (cadr ep)) (_dist b (cadr ep)))))))
)
)eg。
(defun c:Test (/ p)
(if (setq p (AT:ClosestPoint (entsel "\nSelect curve: ")))
(entmake (list '(0 . "CIRCLE") (cons 10 p) '(40 . 10.)))
)
(princ)
) 哇,有多少种方法可以找到端点!
只要对我的代码进行一个快速的解释,就可以用于房屋实际指定从一端到另一个门窗的距离,并且知道你在墙的哪一部分,只要得到端点,就可能在错误的墙上画出一扇门,记住墙也是由多个元素组成的,该代码在vla和autocad architect之前大约有10年的历史。
页:
[1]
2