测量两个pl之间的角度
大家好!在我的工作中,很多时候我需要找到位于不同UCS中的两个平面之间的角度。从数学上讲,我能够计算,但我正在寻找任何可以直接从图纸上测量的函数。
如果有人能帮忙,这是我对程序的想法。谢谢
命令:_3DAngle(以度为单位测量两个平面之间的角度)输入:pt1、pt2、pt3、pt4、pt5、pt6、pt7、pt8、pt9
提示:选择第一个平面的3个点:
选择第一个点并指定like(pt1)
选择第二个点并指定like(pt2)
选择第三个点并指定like(pt3)
将UCS设置为已选择的3个点
**静默命令,在后台工作
命令行:起点为(pt4),终点为(pt5)
第一点(pt4)=(pt1)和(pt2)的中点
坐标X=0、Y=0、Z=100(或任意尺寸,不受限制)的终点(pt5)(其中Z为终点)
提示:选择第二个平面的3个点:
选择第一个点并指定like(pt6)
选择第二个点并指定like(pt7)
选择第三个点并指定like(pt8)
将UCS设置为已选择的3个点
**静默命令,在后台工作
命令行:起点为(pt4),终点为(pt9)
第一点(pt4)=(pt1)和(pt2)的中点(已在第一个平面中指定)
坐标X=0、Y=0、Z=100(或任意尺寸,不受限制)的终点(pt9)(其中Z为终点)
**静默命令在回传中工作
命令\u ucs
第三个平面的点(我们将在其中测量角度):
第一点是(pt4)
第二点是(pt5)
第三点是(pt9)
将UCS设置为这3个点
**静默命令,在后台工作
_双角度
选择第一个向量,即点之间的直线(pt4-pt5)
选择secod vector,line,它位于点之间(pt4-pt9)
以度获得结果
减法(180-结果)=角度
获取角度文本并在图形中插入一个插入点。
将ucs返回到“世界”状态
我知道如何得到结果,但我不太会写lisps。
我将感谢任何帮助编写此代码或任何其他选项。
谢谢 佩特科夫斯基,
这是一个遵循您的方法的程序。它非常粗糙,代码也很难看,但它是有效的。(全世界真正的程序员都在窃笑)。它需要错误捕捉、输出格式化和其他清理。我希望你能使用它。如果时间允许,我会继续努力。谢谢你的程序。我想要这样的东西已经有一段时间了,只需要你提供的方法。
(defun c:apl (/ osave p1 p2 p3 p4 p5 p6 px py pz pperp p2perp)
(setq osave (getvar "OSMODE"))
(command ".UCS" "")
(setq p1 (getpoint "\n Get first point on first plane"))
(setq p2 (getpoint "\n Get second point"))
(setq p3 (getpoint "\n Get third point"))
(setq p4 (getpoint "\n Get first point on second plane"))
(setq p5 (getpoint "\n Get second point"))
(setq p6 (getpoint "\n Get third point"))
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
(setq p1w p1)
(command ".UCS" 3 p1 p2 p3)
(setq p1 (trans p1 0 1))
(command ".UCS" "O" p1)
(setq px (car p1))
(setq py (cadr p1))
(setq pz (caddr p1))
(setq pperp (list px py (+ pz 1.0)))
(command "line" (list 0 0 0) pperp "")
(setq fline (entlast))
(command ".UCS" "")
(command ".UCS" 3 p4 p5 p6)
(setq p4 (trans p4 0 1))
(command ".UCS" "O" p4)
(setq px (car p4))
(setq py (cadr p4))
(setq pz (caddr p4))
(setq p2perp (list px py (+ pz 1.0)))
(command "line" (list 0 0 0) p2perp "")
(setq p1w (trans p1w 0 1))
(command ".MOVE" (entlast) "" (list 0 0 0) p1w)
(setq fn (entget fline))
(setq f1 (cdr (assoc 10 fn)))
(setq f2 (cdr (assoc 11 fn)))
(setq ln (entget (entlast)))
(setq f4 (cdr (assoc 11 ln)))
(command ".UCS" "")
(command ".UCS" 3 f1 f2 f4)
(setq f1 (trans f1 0 1))
(setq f2 (trans f2 0 1))
(setq f4 (trans f4 0 1))
(setq ang1 (angle f1 f2))
(setq ang2 (angle f1 f4))
(princ "\nang1 = ")(princ ang1)
(princ "\nang2 = ")(princ ang2)
(setvar "OSMODE" osave)
(setvar "CMDECHO" 1)
(princ)
) 你好
假设两个平面之间的角度等于这些平面法向量之间的三维角度,我认为这应该是一种更容易处理的方法。
以下是“AnglePlanePlane”例程使用的一些几何例程(可能有用),该例程需要每个平面的单个单位法向量作为参数。
;; AnglePlanePlane
;; Returns the angle (radians) between two planes (using Al Kashi theorem)
;; the returned angle is always between 0 and pi radians
;;
;; Arguments: the single unit normal vectors of the planes
(defun AnglePlanePlane (nor1 nor2)
((lambda (d)
(acos (/ (- 2 (* d d)) 2))
)
(distance nor1 nor2)
)
)
;;; Acos
;;; Returns the Arc Cosine of number
;;;
;;; Argument: a number between -1 and 1
(defun acos (num)
(cond
((equal num 1 1e-9) 0.0)
((equal num -1 1e-9) pi)
((< -1 num 1)
(atan (sqrt (- 1 (expt num 2))) num)
)
)
)
;; CrossProduct
;; Returns the cross product (vector) of two vectors
;;
;; Arguments: two vectors
(defun CrossProduct (v1 v2)
(list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
(- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
(- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
)
)
;; Normalize
;; Returns the single unit vector of a vector
;;
;; Argument : un vecteur
(defun Normalize (v)
((lambda (l)
(if (/= 0 l)
(mapcar (function (lambda (x) (/ x l))) v)
)
)
(distance '(0 0 0) v)
)
)
;; Norm_3Points
;; Returns the single unit normal vector of a plane definedby 3 points
;;
;; Arguments: three points
(defun norm_3pts (p0 p1 p2)
(Normalize (CrossProduct (mapcar '- p1 p0) (mapcar '- p2 p0)))
)
这是一个测试命令,提示用户在每个平面上指定3个点,并在命令行上以当前角度单位返回结果。
(defun c:test (/ a)
(if (vl-catch-all-error-p
(setq a
(vl-catch-all-apply
'(lambda (/ p1 p2 p3 p4 p5 p6)
(setq p1 (getpoint "\nFirst point on first plane: ")
p2 (getpoint p1 "\nSecond point on first plane: ")
p3 (getpoint p1 "\nThird point on first plane: ")
p4 (getpoint "\nFirst point on second plane: ")
p5 (getpoint p4 "\nSecond point on second plane: ")
p6 (getpoint p4 "\nThird point on second plane: ")
)
(princ
(strcat
"\nAngle beween planes = "
(angtos
(AnglePlanePlane (norm_3pts p1 p2 p3) (norm_3pts p4 p5 p6))
)
)
)
)
)
)
)
(princ (strcat "\nerror: " (vl-catch-all-error-message a)))
)
(princ)
) 多亏了这两个回放。
对每个平面法线之间的角度实际上是平面之间的角度,这是我在程序中试图解释的。
我现在将测试这两个代码。 Calcad,
代码正在运行,正如您所说,需要一些清理。
在我的解释中,使用表达式“silence command”或“working In backround”,我的意思是不在窗口中绘制法线(绘制),该过程被隐藏,以及该代码发生的情况。
输出以弧度为单位,稳定度。
UCS在最后选择的平面上“冻结”,需要在命令完成后返回到“世界状态”。
第二个代码,感谢Gile,正如我所期望的那样工作。
只是一些小评论:
在这两个代码中,缺少的是在带有插入点的图形中插入类似结果的文本的命令。
无论如何,我很满意,谢谢你们的努力。 你好
我将自由,并要求作者或其他人在第二个代码中添加一个命令,以插入结果在绘图一样的文字与插入点。
Thx提前 你好
替换:
(princ
(strcat
"\nAngle beween planes = "
(angtos
(AnglePlanePlane (norm_3pts p1 p2 p3) (norm_3pts p4 p5 p6))
)
)
)
具有
(command "_.text"
pause
""
""
(angtos
(AnglePlanePlane (norm_3pts p1 p2 p3)
(norm_3pts p4 p5 p6)
)
)
)
文字是使用当前设置(大小、样式等)在当前UCS平面上的指定点创建的。 你好
我会寻求帮助,我的答案来自代码的作者是最好的解决方案。
当我交换部分代码以在图形中插入文本时,我得到了一个错误。
执行命令文本:
“命令:_0.3DAngle
第一个平面上的第一个点:
第一个平面上的第二个点:
第一个平面上的第三点:
第二个平面上的第一个点:
第二个平面上的第二个点:
第二个平面上的第三点:_。文本
当前文字样式:“标准”文字高度:250.00
指定文本或[对齐/样式]的起点:
指定文字的旋转角度:
输入文本:
命令:179.79未知命令“179.79”。按F1键获取帮助。"
也许我做错了什么?
另一个问题:enywhere在代码中控制十进制精度吗?
提前感谢您的重播。
3D角度。lsp
页:
[1]