MSasu 发表于 2022-7-6 06:23:31

检索选择时拾取的边

我正在寻找一种可靠的解决方案来检索用户为选择3DFace实体而拾取的边缘。我试图检查从拾取点(由SSNAMEX函数返回)到所述3DFace实体的每条边的距离,并保留最短的一条。不幸的是,在三维视图中进行选择时,拾取点可能离实体很远,并且从实体到拾取边的距离不一定是最短的距离。
解决方法是在当前视图上投影所有点(拾取一个和3DFace的顶点),并比较上述距离;到目前为止,这个解决方案似乎是可靠的。
 
我想知道是否有更有效的解决方案?任何建议或解决方案都将不胜感激。感谢您的关注!

BIGAL 发表于 2022-7-6 06:36:12

可能有帮助3dface由4个点组成最后=第一个为3个点
 
因此,如果你将你的拾取点的角度与壁橱pt和2pt之间的线的角度进行比较,应该相差很小,希望这有意义

MSasu 发表于 2022-7-6 06:43:18

比格尔,谢谢你的建议,但我不确定我是否听懂了。你能贴张草图吗?

David Bethel 发表于 2022-7-6 06:51:33

我认为你无法通过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)))


 
-大卫

David Bethel 发表于 2022-7-6 07:00:01


(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))

MSasu 发表于 2022-7-6 07:04:44

大卫,也谢谢你的建议。基本上,ENTSEL也返回一个任意点,唯一的区别是它位于XoY平面。
但是,您使用OSNAP功能的解决方案很有魅力!再次感谢!

MSasu 发表于 2022-7-6 07:11:42

对于其他可能有相同问题的人,下面是一个示例,说明在等轴测视图中选择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)

David Bethel 发表于 2022-7-6 07:20:43

我认为如果在调用(ssnamex)之前更改视图,则可能会失败。Entsel将强制使用当前视图
 

(setq ss (ssget))
(command "_.VPOINT" '(1 1 1))
(ssnamex ss 0)

 
-大卫

MSasu 发表于 2022-7-6 07:28:14

这是一个很好的观察,谢谢!
页: [1]
查看完整版本: 检索选择时拾取的边