检索选择时拾取的边
我正在寻找一种可靠的解决方案来检索用户为选择3DFace实体而拾取的边缘。我试图检查从拾取点(由SSNAMEX函数返回)到所述3DFace实体的每条边的距离,并保留最短的一条。不幸的是,在三维视图中进行选择时,拾取点可能离实体很远,并且从实体到拾取边的距离不一定是最短的距离。解决方法是在当前视图上投影所有点(拾取一个和3DFace的顶点),并比较上述距离;到目前为止,这个解决方案似乎是可靠的。
我想知道是否有更有效的解决方案?任何建议或解决方案都将不胜感激。感谢您的关注! 可能有帮助3dface由4个点组成最后=第一个为3个点
因此,如果你将你的拾取点的角度与壁橱pt和2pt之间的线的角度进行比较,应该相差很小,希望这有意义 比格尔,谢谢你的建议,但我不确定我是否听懂了。你能贴张草图吗? 我认为你无法通过ssnamex识别这些信息。我认为(恩塞尔)会是一个更好的选择。然后进行(is_point_on_line)测试并验证其是否为奇异解(不是蝶形面)
;;;++++++++++ 3D Is Point On Line ++++++++++++++++++++++++++++++++++++++
;;;ARG -> TestPt LinePt1 LinePt2 Fuzz
;;;RET T nil
(defun is_pt_online (pt l1 l2 fz)
(and (numberp fz)
(equal (distance l1 l2)
(+ (distance l1 pt)
(distance l2 pt)) fz)))
-大卫
(defun c:fedge (/ in en ed sp el)
(defun is_pt_online (pt l1 l2 fz)
(and (numberp fz)
(equal (distance l1 l2)
(+ (distance l1 pt)
(distance l2 pt)) fz)))
(while (or (not en)
(/= "3DFACE" (cdr (assoc 0 (entget en)))))
(setq in (entsel "\nSelect 1 3DFACE: "))
(setq en (car in)
sp (osnap (cadr in) "NEA")))
(setq ed (entget en))
(foreach e '((1 2) (2 3) (3 4) (4 1))
(if (is_pt_online sp (cdr (assoc (+ (car e) 9) ed))
(cdr (assoc (+ (cadr e) 9) ed))1e-8)
(setq el (cons (car e) el))))
(if el
(progn
(princ "\nPoint ")
(prin1 sp)
(princ " Resides on Edge(s) ")
(foreach p el
(prin1 p)
(princ " "))))
(prin1))
大卫,也谢谢你的建议。基本上,ENTSEL也返回一个任意点,唯一的区别是它位于XoY平面。
但是,您使用OSNAP功能的解决方案很有魅力!再次感谢! 对于其他可能有相同问题的人,下面是一个示例,说明在等轴测视图中选择3DFace项目时,如果没有David Bethel的解决方案,这两种方法将返回什么(第一个点是在接下来的步骤中拾取的边的中间;它将显示实体的位置):
(getpoint)
(6304.12 7135.41 1130.54)
(cadr (entsel))
(7434.68 8265.98 0.0)
(osnap (cadr (entsel)) "NEA")
(6304.12 7135.31 1130.54)
(cadr (cadddr (car (ssnamex (ssget "_:S") 0))))
(2201.07 3032.5 5233.57)
(osnap (cadr (cadddr (car (ssnamex (ssget "_:S") 0)))) "NEA")
(6304.12 7135.53 1130.54) 我认为如果在调用(ssnamex)之前更改视图,则可能会失败。Entsel将强制使用当前视图
(setq ss (ssget))
(command "_.VPOINT" '(1 1 1))
(ssnamex ss 0)
-大卫 这是一个很好的观察,谢谢!
页:
[1]