明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: HQ_2003

[求助]用lisp或vba编程实现:怎样通过由三点组成的平面(线框面)外一点做此面的垂

  [复制链接]
发表于 2003-1-9 08:32:00 | 显示全部楼层

補leeyeafu說的具体程序编...

(defun C:EE (/ PT1 PT2 PT3 PT4 WW)
  (command "_.ucs" "w")
  (setq PT1 (getpoint "\n第一点: "))
  (setq PT2 (getpoint PT1 "\n第二点: "))
  (grdraw PT1 PT2 3 1)
  (setq PT3 (getpoint PT2 "\n第三点: "))
  (grdraw PT2 PT3 3 1)
  (grdraw PT3 PT1 3 1)
  (setq PT4 (getpoint "\n面外点: "))
  (command "_.regen")
  (command "_.ucs" 3 PT1 PT2 PT3)
  (setq WW (list (car (trans PT4 0 1)) (cadr (trans PT4 0 1))))
  (setq WW (trans WW 1 0))
  (command "_.ucs" "p")
  (grdraw PT4 WW 3 1)
  (command "_.ucs" "p")
  (princ "\n垂点(世界坐标): ")
  (princ WW)
  (princ)
)
发表于 2003-1-10 10:20:00 | 显示全部楼层

VBA编程实现,但......

Private Sub AcadDocument_BeginDoubleClick(ByVal PickPoint As Variant)
  Dim pt1, pt2, pt3, pt4 As Variant
  Dim objUCS, currUCS As AcadUCS
  pt1 = ThisDrawing.Utility.GetPoint(, "输入基准面第一点:")
  pt2 = ThisDrawing.Utility.GetPoint(, "第二点:")
  pt3 = ThisDrawing.Utility.GetPoint(, "第三点:")
  pt4 = ThisDrawing.Utility.GetPoint(, "面外点:")
  Set currUCS = ThisDrawing.ActiveUCS  '保存当前坐标系,用于处理完成后恢复坐标
  Set objUCS = ThisDrawing.UserCoordinateSystems.Add(pt1, pt2, pt3, "NewUCS")  '新建坐标系。程序在这容易出问题,若线pt1->pt2与线pt1->pt3不垂直,会发生Add方法错误,当然不是不可以改进,但若使用SendKeys方法或SendCommand方法,好象还不如直接使用龙兄的LISP实现。若用户输入三个点后,进行计算转换以保证垂直,又显得太麻烦,不知各位有无好办法?
  Dim N_pt4 As Variant
  ThisDrawing.ActiveUCS = objUCS
  N_pt4 = ThisDrawing.Utility.TranslateCoordinates(pt4, acWorld, acUCS, False)  '坐标变换,从世界坐标系到objUCS
  N_pt4(2) = 0  'Z坐标置零
  Dim ch As Variant
  ch = ThisDrawing.Utility.TranslateCoordinates(N_pt4, acUCS, acWorld, False)
  ThisDrawing.Utility.Prompt "垂足点:" & ch(0) & "  " & ch(1) & "  " & ch(2)
  ThisDrawing.ActiveUCS = currUCS
End Sub
发表于 2004-2-6 20:02:00 | 显示全部楼层
我觉得在(command "_.ucs" "p")
后加上(command "point" ww) (command "_.regen") 可能直观些.....
发表于 2004-2-7 02:35:00 | 显示全部楼层
发现一个有意思的东东我改了一下lucas的程序
  1. (defun C:EE0 (/ PT1 PT2 PT3 PT4 WW)
  2.    (command "_.ucs" "w")
  3.    (setq PT1 (getpoint "\n第一点: "))
  4.    (setq PT2 (getpoint PT1 "\n第二点: "))
  5.    (grdraw PT1 PT2 3 1)
  6.    (setq PT3 (getpoint PT2 "\n第三点: "))
  7.    (grdraw PT2 PT3 3 1)
  8.    (grdraw PT3 PT1 3 1)
  9.    (command "_.ucs" 3 PT1 PT2 PT3)
  10.    (setq PT4 (getpoint "\n面外点: "))
  11.    (setq WW (list (car PT4) (cadr PT4) 0.0))
  12.    (grdraw PT4 WW 3 1)
  13.    (setq ww (trans ww 1 0))
  14.    (command "_.ucs" "p" "_.ucs" "p")
  15.    (princ "\n垂点(世界坐标): ")(princ ww)
  16.    (princ)
  17. )
测试结果:Command: ee
第一点:
第二点:
第三点:
面外点: mid of
垂点(世界坐标): (19950.3 12875.0 3.63798e-012)Command: ee0
第一点: 'osnap
当前对象捕捉模式: 端点,中点,圆心,交点,垂足
>>Enter list of object snap modes: int,end,mid,cen
第一点:
第二点:
第三点:
面外点:
垂点(世界坐标): (19950.3 12875.0 5.45697e-012)Command: id Specify point:   X = 19950.33452         Y = 12875.03564         Z = 0.00000ee是lucas原程序,ee0是我改的。 id命令查的是wcs下测试点的坐标。其中,ee和ee0返回的z值在不同测试环境/实体下,都不一样(也有等于0的)。我想是不是 x.xxe-0xx 被当成近似误差(cad bug),其实就是0。
发表于 2004-2-11 22:33:00 | 显示全部楼层
如果只是求垂足,可先将已知面设为当前UCS,再从面上任一点开始[PLINE],下一点捕捉面外的那一点,PLINE的第二点即垂足。


如果不设及UCS,我想可从面外一点向面内任一直线AB做垂线,得垂足D;在面上过垂足D做AB的垂线CD;由面外点向CD所做垂线的垂足即所求点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 02:29 , Processed in 0.133378 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表