乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 33|回复: 7

[编程交流] 测量两个pl之间的角度

[复制链接]

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 08:27:42 | 显示全部楼层 |阅读模式
大家好!
在我的工作中,很多时候我需要找到位于不同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。
我将感谢任何帮助编写此代码或任何其他选项。
谢谢
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 08:43:43 | 显示全部楼层
佩特科夫斯基,
这是一个遵循您的方法的程序。它非常粗糙,代码也很难看,但它是有效的。(全世界真正的程序员都在窃笑)。它需要错误捕捉、输出格式化和其他清理。我希望你能使用它。如果时间允许,我会继续努力。谢谢你的程序。我想要这样的东西已经有一段时间了,只需要你提供的方法。
 
  1. (defun c:apl (/ osave p1 p2 p3 p4 p5 p6 px py pz pperp p2perp)
  2. (setq osave (getvar "OSMODE"))
  3. (command ".UCS" "")
  4. (setq p1 (getpoint "\n Get first point on first plane"))
  5. (setq p2 (getpoint "\n Get second point"))
  6. (setq p3 (getpoint "\n Get third point"))
  7. (setq p4 (getpoint "\n Get first point on second plane"))
  8. (setq p5 (getpoint "\n Get second point"))
  9. (setq p6 (getpoint "\n Get third point"))
  10. (setvar "CMDECHO" 0)
  11. (setvar "OSMODE" 0)
  12. (setq p1w p1)
  13. (command ".UCS" 3 p1 p2 p3)
  14. (setq p1 (trans p1 0 1))
  15. (command ".UCS" "O" p1)
  16. (setq px (car p1))
  17. (setq py (cadr p1))
  18. (setq pz (caddr p1))
  19. (setq pperp (list px py (+ pz 1.0)))
  20. (command "line" (list 0 0 0) pperp "")
  21. (setq fline (entlast))
  22. (command ".UCS" "")
  23. (command ".UCS" 3 p4 p5 p6)
  24. (setq p4 (trans p4 0 1))
  25. (command ".UCS" "O" p4)
  26. (setq px (car p4))
  27. (setq py (cadr p4))
  28. (setq pz (caddr p4))
  29. (setq p2perp (list px py (+ pz 1.0)))
  30. (command "line" (list 0 0 0) p2perp "")
  31. (setq p1w (trans p1w 0 1))
  32. (command ".MOVE" (entlast) "" (list 0 0 0) p1w)
  33. (setq fn (entget fline))
  34. (setq f1 (cdr (assoc 10 fn)))
  35. (setq f2 (cdr (assoc 11 fn)))
  36. (setq ln (entget (entlast)))
  37. (setq f4 (cdr (assoc 11 ln)))
  38. (command ".UCS" "")
  39. (command ".UCS" 3 f1 f2 f4)
  40. (setq f1 (trans f1 0 1))
  41. (setq f2 (trans f2 0 1))
  42. (setq f4 (trans f4 0 1))
  43. (setq ang1 (angle f1 f2))
  44. (setq ang2 (angle f1 f4))
  45. (princ "\nang1 = ")(princ ang1)
  46. (princ "\nang2 = ")(princ ang2)
  47. (setvar "OSMODE" osave)
  48. (setvar "CMDECHO" 1)
  49. (princ)
  50. )
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 08:46:49 | 显示全部楼层
你好
 
假设两个平面之间的角度等于这些平面法向量之间的三维角度,我认为这应该是一种更容易处理的方法。
 
以下是“AnglePlanePlane”例程使用的一些几何例程(可能有用),该例程需要每个平面的单个单位法向量作为参数。
 
  1. ;; AnglePlanePlane
  2. ;; Returns the angle (radians) between two planes (using Al Kashi theorem)
  3. ;; the returned angle is always between 0 and pi radians
  4. ;;
  5. ;; Arguments: the single unit normal vectors of the planes
  6. (defun AnglePlanePlane (nor1 nor2)
  7. ((lambda (d)
  8.     (acos (/ (- 2 (* d d)) 2))
  9.   )
  10.    (distance nor1 nor2)
  11. )
  12. )
  13. ;;; Acos
  14. ;;; Returns the Arc Cosine of number
  15. ;;;
  16. ;;; Argument: a number between -1 and 1
  17. (defun acos (num)
  18. (cond
  19.    ((equal num 1 1e-9) 0.0)
  20.    ((equal num -1 1e-9) pi)
  21.    ((< -1 num 1)
  22.     (atan (sqrt (- 1 (expt num 2))) num)
  23.    )
  24. )
  25. )
  26. ;; CrossProduct
  27. ;; Returns the cross product (vector) of two vectors
  28. ;;
  29. ;; Arguments: two vectors
  30. (defun CrossProduct (v1 v2)
  31. (list    (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2)))
  32.    (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2)))
  33.    (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2)))
  34. )
  35. )
  36. ;; Normalize
  37. ;; Returns the single unit vector of a vector
  38. ;;
  39. ;; Argument : un vecteur
  40. (defun Normalize (v)
  41. ((lambda (l)
  42.     (if (/= 0 l)
  43.       (mapcar (function (lambda (x) (/ x l))) v)
  44.     )
  45.   )
  46.    (distance '(0 0 0) v)
  47. )
  48. )
  49. ;; Norm_3Points
  50. ;; Returns the single unit normal vector of a plane definedby 3 points
  51. ;;
  52. ;; Arguments: three points
  53. (defun norm_3pts (p0 p1 p2)
  54. (Normalize (CrossProduct (mapcar '- p1 p0) (mapcar '- p2 p0)))
  55. )

 
这是一个测试命令,提示用户在每个平面上指定3个点,并在命令行上以当前角度单位返回结果。
 
  1. (defun c:test (/ a)
  2. (if (vl-catch-all-error-p
  3.        (setq a
  4.               (vl-catch-all-apply
  5.                 '(lambda (/ p1 p2 p3 p4 p5 p6)
  6.                    (setq p1 (getpoint "\nFirst point on first plane: ")
  7.                          p2 (getpoint p1 "\nSecond point on first plane: ")
  8.                          p3 (getpoint p1 "\nThird point on first plane: ")
  9.                          p4 (getpoint "\nFirst point on second plane: ")
  10.                          p5 (getpoint p4 "\nSecond point on second plane: ")
  11.                          p6 (getpoint p4 "\nThird point on second plane: ")
  12.                    )
  13.                    (princ
  14.                      (strcat
  15.                        "\nAngle beween planes = "
  16.                        (angtos
  17.                          (AnglePlanePlane (norm_3pts p1 p2 p3) (norm_3pts p4 p5 p6))
  18.                        )
  19.                      )
  20.                    )
  21.                  )
  22.               )
  23.        )
  24.      )
  25.    (princ (strcat "\nerror: " (vl-catch-all-error-message a)))
  26. )
  27. (princ)
  28. )
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 08:54:41 | 显示全部楼层
多亏了这两个回放。
对每个平面法线之间的角度实际上是平面之间的角度,这是我在程序中试图解释的。
我现在将测试这两个代码。
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 09:05:08 | 显示全部楼层
Calcad,
代码正在运行,正如您所说,需要一些清理。
在我的解释中,使用表达式“silence command”或“working In backround”,我的意思是不在窗口中绘制法线(绘制),该过程被隐藏,以及该代码发生的情况。
输出以弧度为单位,稳定度。
UCS在最后选择的平面上“冻结”,需要在命令完成后返回到“世界状态”。
第二个代码,感谢Gile,正如我所期望的那样工作。
只是一些小评论:
在这两个代码中,缺少的是在带有插入点的图形中插入类似结果的文本的命令。
无论如何,我很满意,谢谢你们的努力。
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 09:11:28 | 显示全部楼层
你好
我将自由,并要求作者或其他人在第二个代码中添加一个命令,以插入结果在绘图一样的文字与插入点。
Thx提前
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2022-7-6 09:25:56 | 显示全部楼层
你好
 
替换:
  1. (princ
  2.                      (strcat
  3.                        "\nAngle beween planes = "
  4.                        (angtos
  5.                          (AnglePlanePlane (norm_3pts p1 p2 p3) (norm_3pts p4 p5 p6))
  6.                        )
  7.                      )
  8.                    )

 
具有
  1. (command "_.text"
  2.                             pause
  3.                             ""
  4.                             ""
  5.                             (angtos
  6.                               (AnglePlanePlane (norm_3pts p1 p2 p3)
  7.                                                (norm_3pts p4 p5 p6)
  8.                               )
  9.                             )
  10.                    )

 
文字是使用当前设置(大小、样式等)在当前UCS平面上的指定点创建的。
回复

使用道具 举报

3

主题

10

帖子

7

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 09:29:03 | 显示全部楼层
你好
我会寻求帮助,我的答案来自代码的作者是最好的解决方案。
当我交换部分代码以在图形中插入文本时,我得到了一个错误。
执行命令文本:
“命令:_0.3DAngle
第一个平面上的第一个点:
第一个平面上的第二个点:
第一个平面上的第三点:
第二个平面上的第一个点:
第二个平面上的第二个点:
第二个平面上的第三点:_。文本
当前文字样式:“标准”文字高度:250.00
指定文本或[对齐/样式]的起点:
指定文字的旋转角度:
输入文本:
命令:179.79未知命令“179.79”。按F1键获取帮助。"
也许我做错了什么?
另一个问题:enywhere在代码中控制十进制精度吗?
提前感谢您的重播。
3D角度。lsp
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 08:53 , Processed in 0.376979 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表