乐筑天下

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

[编程交流] 实体相交和someth

[复制链接]

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:20:13 | 显示全部楼层 |阅读模式
您好,我想寻求一些帮助,如果有一种方法可以更快地实现与下面的LISP相同的结果,我需要的是在圆柱体对象停止与基础对象相交时获得其尖端的Z坐标(可以有任何形式)。它将精确到用户选择的分辨率(res)。
我已经减少了代码,把它贴在这里,但基本上这需要在几个X,Y坐标重复。获取坐标很容易,但不确定是否有更好的方法获取交点。我也不需要显示圆柱体,正如我所说,我只需要坐标。一、 e:我还试图生成两个实体的STL,并获得一个浊点来寻找交点,但似乎很复杂
 
谢谢你的帮助。
 
  1. (defun c:test1 ( / )
  2. (vl-load-com)
  3. (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object)))
  4. ; This makes the Undo command erase only what's drawn in this lisp
  5. (vla-StartUndoMark thisdrawing)
  6. ; This makes the Undo command erase only what's drawn in this lisp
  7. (setq cmdsave (getvar "cmdecho"))
  8. (setvar "cmdecho" 0)
  9. (setq objsnap (getvar "osmode"))
  10. (setvar "osmode" 0)
  11. (setq res 0.001)  ;Final resolution to test for interference, will be user selected
  12. (setq init_res 1.0)  ;Initial resolution to speed up movement on z-axis
  13. (command "cylinder" "0,0,0" 6 40)
  14. (setq cyl (entlast))
  15. (setq pt2 (list 0 0 6))
  16. (command "move" cyl "" "0,0,0" pt2)
  17. (command "sphere" "0,0,0" 6)
  18. (setq sph (entlast))
  19. (command "move" sph "" "0,0,0" pt2)
  20. (command "union" sph cyl "")
  21. (setq tool (entlast))
  22. (command "sphere" "0,10,0" 25) ;This could be any solid of any shape
  23. (setq 3dent (entlast))
  24. (vinter)
  25. (setq temp_res init_res)
  26. (setq pt1 (list 0 0 0))
  27. (setq pt2 (list 0 0 ptz))
  28. (command "move" tool "" pt1 pt2)
  29. (setq pt1 pt2)(vinter)
  30. (while (and (= interferes "f") (>= temp_res res))
  31.    (setq pt2 (list 0 0 ptz))
  32.    (command "move" tool "" pt1 pt2)
  33.    (vinter)
  34.    (if    (= interferes "t")
  35.      (progn
  36.    (command "move" tool "" pt2 pt1)
  37.    (setq temp_res (* temp_res 0.1))
  38.    (vinter)
  39.        (setq ptz (- (caddr pt1) temp_res))
  40.      ) ;_ end of progn
  41.      (progn
  42.    (setq pt1 pt2)
  43.    (setq ptz (- ptz temp_res))
  44.      ) ;_ end of progn
  45.    ) ;_ end of if
  46. ) ;_ end of while
  47. (setvar "cmdecho" cmdsave)
  48. (setvar "osmode" objsnap)
  49. (vla-EndUndoMark thisdrawing)
  50. (princ)
  51. ) ;_ end of defun
  52. ;This will return "t" if the solids intersect
  53. (defun vinter (/ rest key vlaobject2)
  54. (setq key t)
  55. (setq
  56.    rest (vla-CheckInterference
  57.       (vlax-ename->vla-object tool)
  58.       (vlax-ename->vla-object 3dent)
  59.       key
  60.     ) ;_ end of vla-CheckInterference
  61. ) ;_ end of setq
  62. ; Curiously, if on last line I put 3dent before tool, intesect fails when it tests a tool against
  63. ; a flat box. The same happens if done by hand in AutoCAD, try it.
  64. (if rest
  65.    (progn
  66.      (setq interferes "t")
  67.      (setq vlaobject2 (vlax-ename->vla-object (entlast)))
  68.      (vla-GetBoundingBox vlaobject2 'minb 'maxb)
  69.      (setq maxb (vlax-safearray->list maxb))
  70.      (setq ptz (caddr maxb))
  71.    ) ;_ end of progn
  72.    (setq interferes "f")
  73. ) ;_ end of if
  74. (if (= interferes "t")
  75.    (entdel (entlast))
  76. ) ;_ end of if
  77. ) ;_ end of defun
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 22:29:40 | 显示全部楼层
我不确定geomcal。arx,但我只是认为ILP接近您的解决方案,但它可能是错误的,只是我的0.02
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:33:54 | 显示全部楼层
嗨,谢谢你的回答。
 
作为一名“自学”的LISP用户/程序员,我在AutoCAD帮助文件中快速搜索了“cal”函数,但找不到3dsolids的任何内容。我确实发现了一些有用的东西,以防我使用“浊点”方法。出于同样的原因,不是一个程序员本身,我不确定ILP首字母缩略词代表什么,你能详细解释一下吗?
 
再次感谢你的帮助
 
谢天谢地,我有足够的时间和愿望为自己学习,只需要朝着正确的方向努力
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 22:40:32 | 显示全部楼层
ILP的首字母缩写代表(线和平面的相交)。。。您可以使用(cal“ilp(p1、p2、t1、t2、t3)”,在此之前,您必须为较新的CAD版本加载“geomcal.arx”或“geomcal.crx”,但您也有此函数的lisp版本。。。它可以在页面底部的这个链接上找到。。。
 
虽然我不确定它如何帮助你解决你的问题。。。
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/to-get-intersection-between-a-line-and-a-3dface/m-p/5243795#M325627
 
M、 R。
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:48:07 | 显示全部楼层
谢谢hanhphuc和Marko!
 
出于某种原因,我认为ILP是一种编程技术
 
如果我使用生成点云选项,我相信geomcal中的“ilp”选项可以帮助我,但这将涉及导出到STL格式、读取创建的文件以生成巨大的顶点列表、查找直线和STL平面之间的交点等漫长过程。。。我相信这比我上面发布的方法需要更长的时间来处理,所以在深入研究之前,我会继续寻找其他选择
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 22:57:49 | 显示全部楼层
到目前为止,这是我能使其运行的最快速度,在这种情况下,沿着x轴移动,如果您熟悉cnc,您将了解我试图实现的目标:
 
*编辑时,我添加了一个非常基本的计时器来跟踪性能,它在程序退出时将秒数打印到命令行
 
  1. (defun c:test2 (/)
  2. (vl-load-com)
  3. (setq stopwatch (float (getvar "millisecs")))
  4. (setq thisdrawing (vla-get-activedocument (vlax-get-acad-object)))
  5. ; This makes the Undo command erase only what's drawn in this lisp
  6. (vla-StartUndoMark thisdrawing)
  7. ; This makes the Undo command erase only what's drawn in this lisp
  8. (setq cmdsave (getvar "cmdecho"))
  9. (setvar "cmdecho" 0)
  10. (setq objsnap (getvar "osmode"))
  11. (setvar "osmode" 0)
  12. (setq res 0.005) ; 0.005 lasts about 6 secs, 0.001 7 secs and 0.0001 8 secs, at least in my machine
  13. ;Resolution for each move along roughing path or each height test in finishing
  14. (setq init_res 1.0) ;starting with 5 instead of 1 makes almost no difference
  15. ;Initial resolution to speed up movement along path or height
  16. (command "_.cylinder" "0,0,0" 6 40)
  17. (setq cyl (entlast))
  18. (setq pt2 (list 0 0 6))
  19. (command "_.move" cyl "" "0,0,0" pt2)
  20. (command "_.sphere" "0,0,0" 6)
  21. (setq sph (entlast))
  22. (command "_.move" sph "" "0,0,0" pt2)
  23. (command "_.union" sph cyl "")
  24. (setq tool (entlast))
  25. ;;;  (setq mylist (append mylist (list tool)))
  26. (setq move_dist 0)
  27. (command "_.sphere" "24,24,0" 24)
  28. ;This could be any solid of any shape, will be user selected
  29. (setq 3dent (entlast))
  30. (repeat 48
  31.    (setq pt2 (list 0 0 0))
  32.    (vinter)
  33.    (if (= interferes "t")
  34.      (progn
  35.        (setq temp_res init_res)
  36.        (setq pt1 (list 0 0 0))
  37.        (setq pt2 (list 0 0 ptz))
  38.        (command "_.move" tool "" pt1 pt2)
  39.        (setq pt1 pt2)
  40.        (vinter)
  41.        (while (and (= interferes "f") (>= temp_res res))
  42.          (setq pt2 (list 0 0 ptz))
  43.          (command "_.move" tool "" pt1 pt2)
  44.          (vinter)
  45.          (if (= interferes "t")
  46.            (progn
  47.              (command "_.move" tool "" pt2 pt1)
  48.              (setq temp_res (* temp_res 0.1)) ;using 0.1 is faster than 0.5 by about 20%
  49.              (vinter)
  50.              (setq ptz (- (caddr pt1) temp_res))
  51.            ) ;_ end of progn
  52.            (progn
  53.              (setq pt1 pt2)
  54.              (setq ptz (- ptz temp_res))
  55.            ) ;_ end of progn
  56.          ) ;_ end of if
  57.        ) ;_ end of while
  58.      ) ;_ end of progn
  59.    ) ;_ end of if
  60.    (command "_.move" tool "" "0,0,0" "1,0,0")
  61.    (command "_.move" tool "" pt2 (list (car pt2) (cadr pt2) 0.0))
  62. ) ;_ end of repeat
  63. (setvar "cmdecho" cmdsave)
  64. (setvar "osmode" objsnap)
  65. (vla-EndUndoMark thisdrawing)
  66. (princ)
  67. (setq stopwatch (/ (- (float (getvar "millisecs")) stopwatch) 1000))
  68. ) ;_ end of defun
  69. ;This will return "t" if the solids intersect
  70. (defun vinter (/ rest key vlaobject2)
  71. (setq key t)
  72. (setq
  73.    rest (vla-CheckInterference (vlax-ename->vla-object tool) (vlax-ename->vla-object 3dent) key)
  74. ) ;_ end of setq
  75. ; Curiously, if on last line I put 3dent before tool, intesect fails when it tests a tool
  76. ; against a flat box. The same happens if done by hand in AutoCAD, try it.
  77. (if rest
  78.    (progn
  79.      (setq interferes "t")
  80.      (setq vlaobject2 (vlax-ename->vla-object (entlast)))
  81.      (vla-GetBoundingBox vlaobject2 'minb 'maxb)
  82.      (setq maxb (vlax-safearray->list maxb))
  83.      (setq ptz (caddr maxb))
  84.    ) ;_ end of progn
  85.    (setq interferes "f")
  86. ) ;_ end of if
  87. (if (= interferes "t")
  88.    (entdel (entlast))
  89. ) ;_ end of if
  90. ) ;_ end of defun
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:05:53 | 显示全部楼层
很明显,我没有看到:
 
用vla取代了命令调用,时间减少了20%!!
例子:
  1. (vla-move (vlax-ename->vla-object tool) (vlax-3d-point pt1)(vlax-3d-point pt2))
而不是:
  1. (command "move" tool "" pt1 pt2)

  1. (vla-addline mspace (vlax-3d-point pt1)(vlax-3d-point pt2))
而不是:
  1. (command "_line" pt1 pt2 "")

 
谢谢大家的帮助,希望这能帮助其他想要改善日常生活的人
 
欢迎提出任何其他建议
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 23:11:35 | 显示全部楼层
感谢Marko的分享,arx的ILP之前已经过测试,测试速度最慢。
自定义LISP的ILP很好
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 23:15:18 | 显示全部楼层
 
谢谢,韩。。。对于类似ILP的简单CAL函数,不需要检查交点是否在三角形t1、t2、t3。。。这就是ILP真正应该如何运作。。。顺便说一句,我不知道LISP版本是否更快,但它可能有一些用处,因为不需要检查共面性和其他关系。。。
 
  1. (defun _ilpp ( p1 p2 t1 t2 t3 / v^v unit _ilp nor o )
  2. (defun v^v ( u v )
  3.    (list
  4.      (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  5.      (- (* (car  v) (caddr u)) (* (car  u) (caddr v)))
  6.      (- (* (car  u) (cadr  v)) (* (car  v) (cadr  u)))
  7.    )
  8. )
  9. (defun unit ( v )
  10.    (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  11. )
  12. (defun _ilp ( p1 p2 o nor / p1p p2p op tp pp p )
  13.    (if (not (equal (v^v nor (unit (mapcar '- p2 p1))) '(0.0 0.0 0.0) 1e-7))
  14.      (progn
  15.        (setq p1p (trans p1 0 (v^v nor (unit (mapcar '- p2 p1))))
  16.              p2p (trans p2 0 (v^v nor (unit (mapcar '- p2 p1))))
  17.              op  (trans o 0 (v^v nor (unit (mapcar '- p2 p1))))
  18.              op  (list (car op) (cadr op) (caddr p1p))
  19.              tp  (polar op (+ (* 0.5 pi) (angle '(0.0 0.0 0.0) (trans nor 0 (v^v nor (unit (mapcar '- p2 p1)))))) 1.0)
  20.        )
  21.        (if (inters p1p p2p op tp nil)
  22.          (progn
  23.            (setq p (trans (inters p1p p2p op tp nil) (v^v nor (unit (mapcar '- p2 p1))) 0))
  24.            p
  25.          )
  26.          nil
  27.        )
  28.      )
  29.      (progn
  30.        (setq pp (list (car (trans p1 0 nor)) (cadr (trans p1 0 nor)) (caddr (trans o 0 nor))))
  31.        (setq p (trans pp nor 0))
  32.        p
  33.      )
  34.    )
  35. )
  36. (setq nor (unit (v^v (mapcar '- t3 t1) (mapcar '- t2 t1))))
  37. (setq o t1)
  38. (if (_ilp p1 p2 o nor)
  39.    (_ilp p1 p2 o nor)
  40.    nil
  41. )
  42. )

 
P、 若你们想得到“获得直线和三角形的交点”的代码,就像引用的那个样——若直线穿过三角形,你们可以在这里找到代码。。。
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/to-get-intersection-between-a-line-and-a-3dface/m-p/5338005/highlight/true#M326785
 
M、 R。
回复

使用道具 举报

10

主题

39

帖子

29

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-5 23:24:41 | 显示全部楼层
再次感谢各位!
 
使用visual lisp方法与autocad命令相比,该例程现在只需2分钟即可运行,而不是12分钟!!我不敢相信这会有多大的不同:哦
 
我将尝试使用line-plane接口例程测试一种方法,看看它是否适用于我的目的
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 06:09 , Processed in 0.729735 second(s), 72 queries .

© 2020-2025 乐筑天下

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