乐筑天下

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

[编程交流] 查找BBox';s关键点

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:39:54 | 显示全部楼层 |阅读模式
大家好,
我试图从对象的边界框中找到一些关键点(请参见代码中的图)。
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;
  3. ;  x - points to find:
  4. ;  TopLeft, MiddleLeft,
  5. ;  BottomLeft; TopCenter, MiddleCenter,
  6. ;  BottomCenter; TopRight, MiddleRight, BottomRight
  7. ;
  8. ;                   TC
  9. ;                  /
  10. ; TL-> x**********x**********x <- TR
  11. ;      *                     *
  12. ;      *                     *
  13. ;      *                     *
  14. ; ML-> x          * <- MC    x <- MR
  15. ;      *                     *
  16. ;      *                     *
  17. ;      *                     *
  18. ; BL-> x**********x**********x <- BR
  19. ;                /
  20. ;              BC
  21. ;
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23. (defun C:test (/ oldPDM ent vla-obj bbox mn mx)
  24. (if
  25.         (setq ent (car (entsel "\nPick an entity")))
  26.         (progn
  27.                 (setq oldPDM (getvar 'PDMODE))
  28.                 (setvar 'PDMODE 35)
  29.                 (setq vla-obj (vlax-ename->vla-object ent))
  30.                 (setq bbox (vla-getboundingbox vla-obj 'mn 'mx))
  31.                 ; (setq TL)
  32.                 ; (setq ML)
  33.                 (setq BL (trans (vlax-safearray->list mn) 0 1) )
  34.                 (setq TR (trans (vlax-safearray->list mx) 0 1) )
  35.                 ; (setq MR)
  36.                 ; (setq BR)
  37.                 ; (setq TC)
  38.                 ; (setq MC)
  39.                 ; (setq BC)
  40.                
  41.                 ; Perform Check:
  42.                 (point BL)
  43.                 (point TR)
  44.                
  45.                 (setvar 'PDMODE oldPDM)
  46.         );progn
  47. );if
  48. (princ)
  49. );defun       
  50. ; LM:
  51. (defun Point (pt)
  52. (entmakex
  53.         (list
  54.                 (cons 0 "POINT")
  55.                 (cons 10 pt)
  56.         )
  57. )
  58. )

知道对角线的角度和长度并使用正弦和余弦函数可能会使任务变得轻松,但我已经有一段时间没有练习数学了,当涉及到弧度时,我有点困惑。
 
编辑:
更好的主意:为什么不做这样的事?,并为您获得学分:
  1. ; Define Sub-function that returns assoc list
  2. ; input: entityname
  3. ; (ent / TL ML BL TC MC BC TR MR BR)
  4. ; return example:
  5. ; ((TL . ptx) (ML . ptx) (BL . ptx) (TC . ptx) (MC . ptx) (BC . ptx) (TR . ptx) (MR . ptx) (BR . ptx))
  6. ; ptx - coordinates of the point
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:57:36 | 显示全部楼层
我有点明白了:
  1. ; Define Sub-function that returns assoc list
  2. ; input: entityname
  3. ; (ent / TL ML BL TC MC BC TR MR BR)
  4. ; return example:
  5. ; ((TL . ptx) (ML . ptx) (BL . ptx) (TC . ptx) (MC . ptx) (BC . ptx) (TR . ptx) (MR . ptx) (BR . ptx))
  6. ; ptx - coordinates of the point
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. ;
  9. ;  x - points to find:
  10. ;  TopLeft, MiddleLeft,
  11. ;  BottomLeft; TopCenter, MiddleCenter,
  12. ;  BottomCenter; TopRight, MiddleRight, BottomRight
  13. ;
  14. ;                   TC
  15. ;                  /
  16. ; TL-> x**********x**********x <- TR
  17. ;      *                     *
  18. ;      *                     *
  19. ;      *                     *
  20. ; ML-> x          * <- MC    x <- MR
  21. ;      *                     *
  22. ;      *                     *
  23. ;      *                     *
  24. ; BL-> x**********x**********x <- BR
  25. ;                /
  26. ;              BC
  27. ;
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. (defun C:test (/ oldPDM ent vla-obj bbox mn mx TL BL ML TR BR MR TC BC MC BBoxJustificationsList)
  30. (if
  31.         (setq ent (car (entsel "\nPick an entity")))
  32.         (progn
  33.                 (setq oldPDM (getvar 'PDMODE))
  34.                 (setvar 'PDMODE 35)
  35.                 (setq vla-obj (vlax-ename->vla-object ent))
  36.                 (setq bbox (vla-getboundingbox vla-obj 'mn 'mx))
  37.                
  38.                 (setq TL (list (car (trans (vlax-safearray->list mn) 0 1) ) (cadr (trans (vlax-safearray->list mx) 0 1) ) (caddr (trans (vlax-safearray->list mx) 0 1) ) ) )
  39.                 (setq BL (trans (vlax-safearray->list mn) 0 1) )
  40.                 (setq ML (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) BL TL))
  41.                
  42.                 (setq TR (trans (vlax-safearray->list mx) 0 1) )
  43.                 (setq BR (list (car (trans (vlax-safearray->list mx) 0 1) ) (cadr (trans (vlax-safearray->list mn) 0 1) ) (caddr (trans (vlax-safearray->list mn) 0 1) ) ) )       
  44.                 (setq MR (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) BR TR))
  45.                
  46.                 (setq TC (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) TL TR))
  47.                 (setq BC (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) BL BR))
  48.                 (setq MC (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) BL TR))
  49.                
  50.                 ; Perform Check:
  51.                 ; (point TL)
  52.                 ; (point BL)
  53.                 ; (point ML)
  54.                
  55.                 ; (point TR)
  56.                 ; (point BR)
  57.                 ; (point MR)
  58.                
  59.                 ; (point TC)
  60.                 ; (point BC)
  61.                 ; (point MC)
  62.                
  63.                 (setq BBoxJustificationsList
  64.                         (list
  65.                                 (cons "TL" TL)
  66.                                 (cons "BL" BL)
  67.                                 (cons "ML" ML)
  68.                                 (cons "TR" TR)
  69.                                 (cons "BR" BR)
  70.                                 (cons "MR" MR)
  71.                                 (cons "TC" TC)
  72.                                 (cons "BC" BC)
  73.                                 (cons "MC" MC)
  74.                         )
  75.                 )
  76.                 (print BBoxJustificationsList)
  77.                 (foreach pt BBoxJustificationsList
  78.                         (point (cdr pt))
  79.                 );foreach
  80.                 ; (setvar 'PDMODE oldPDM)
  81.         );progn
  82. );if
  83. (princ)
  84. );defun       
  85. ; LM:
  86. (defun Point (pt)
  87. (entmakex
  88.         (list
  89.                 (cons 0 "POINT")
  90.                 (cons 10 pt)
  91.         )
  92. )
  93. )

非常感谢您的评论。
184000g8lsxsmd0dxsqqbu.jpg
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:04:33 | 显示全部楼层
你好,Grrr
您可以从使用的两个安全数组函数返回的两个坐标集的组合以及角度BL TR和BL TR之间的距离中获得所有这些点。
例如,要查找中间中心MC点,请执行以下操作:
  1. (setq ang (angle BL TR))
  2. (setq dist (distance BL TR))
  3. (setq MC (polar BL ang (* 0.5 dist))
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:13:59 | 显示全部楼层
谢谢Simon1976
我想知道它将如何与cos和sin函数一起工作(正如我为另一个想法所评论的)。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:22:29 | 显示全部楼层
你好
 
看一下以下代码,我确实按照您想要的列表订购了它们:
 
  1. (if (and (setq ent (car (entsel "\nPick an entity")))
  2.         (vlax-method-applicable-p (setq vla (vlax-ename->vla-object ent)) 'getboundingbox)
  3.         )
  4. (progn
  5.    ;; ((TL . ptx) (ML . ptx) (BL . ptx) (TC . ptx) (MC . ptx) (BC . ptx) (TR . ptx) (MR . ptx) (BR . ptx))
  6.    (vla-getboundingbox vla 'mn 'mx)
  7.    (setq cor1 (mapcar 'vlax-safearray->list (list mn mx))
  8.          cor2 (list (list (caar cor1) (cadadr cor1) 0.)
  9.                     (list (caar (cdr cor1)) (cadar cor1) 0.))
  10.          mids (mapcar '(lambda (j k)
  11.                          (mapcar '(lambda (j k) (* (+ j k) 0.5)) j k)
  12.                          )
  13.                 (append cor1 (list (car cor2) (car cor1) (car cor1)))
  14.                 (append cor2 (list (cadr cor1) (cadr cor2) (cadr cor1)))
  15.                 )
  16.          fnl  (list (car cor2)
  17.                     (car mids)
  18.                     (car cor1)
  19.                     (caddr mids)
  20.                     (last mids)
  21.                     (nth 3 mids)
  22.                     (cadr cor1)
  23.                     (cadr mids)
  24.                     (cadr cor2)
  25.                     )
  26.          )
  27.    )
  28. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:32:57 | 显示全部楼层
谢谢,塔瓦!
我必须承认,这个嵌套的mapcar lambda看起来真的很混乱。似乎您对X和Y坐标进行“排序”以找到每个角,然后使用mapcar lambda作为中点。
但你们如何对这样的程序进行检查呢?我的意思是,你在任何地方都创建了即使是日志监视也很难理解的列表:
  1. LOG Watch
  2. ...............
  3. MIDS = ((62908.7 47976.2 -5.0e-010) (63034.7 47976.2 5.0e-010) (62971.7 48021.2 5.0e-010) (62971.7 47931.2 -5.0e-010) (62971.7 47976.2 0.0))
  4. COR2 = ((62908.7 48021.2 0.0) (63034.7 47931.2 0.0))
  5. COR1 = ((62908.7 47931.2 -1.0e-009) (63034.7 48021.2 1.0e-009))
  6. FNL = ((62908.7 48021.2 0.0) (62908.7 47976.2 -5.0e-010) (62908.7 47931.2 -1.0e-009) (62971.7 48021.2 5.0e-010) (62971.7 47976.2 0.0) (62971.7 47931.2 -5.0e-010) (63034.7 48021.2 1.0e-009) (63034.7 47976.2 5.0e-010) (63034.7 47931.2 0.0))
  7. ...............

或者你会提出观点吗?或者你只是凭直觉编码?
 
编辑:嗯,我试过用一个100x100的正方形,在0,0,0上有一个角,得到了这个:
  1. ((0.0 100.0 0.0) (0.0 50.0 0.0) (0.0 0.0 0.0) (50.0 100.0 0.0) (50.0 50.0 0.0) (50.0 0.0 0.0) (100.0 100.0 0.0) (100.0 50.0 0.0) (100.0 0.0 0.0))

这看起来更清楚了,但仍然?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:42:16 | 显示全部楼层
你好
 
当您有嵌套的Mapcar时,这意味着代码在列表中实现处理列表。
 
变量细分:
“cor1”包含两个坐标点BL和TR。
“cor2”包含两个坐标TL和BR。
“mids包含所有中点,我在这里按顺序排列:ML、MR、TC、BC。
“fnl”根据您的要求保存点的排列顺序。
 
为我写代码意味着我需要理解每一段代码,知道代码将引导我去哪里,否则我会迷路,会想出不想要的代码,而致命的是,我需要一次又一次地开始,以达到我期待的目的地。
 
首先,我以非常缓慢的方式编写代码,专门用于需要一些复杂过程的任务,例如坐标、对象列表、排序。。。等等,当我正确获得列表后,我就在它们上执行我需要的任务,这样我就可以运行任何函数,而不需要注意任何错误,就像那样。
 
在所有这些之后,我可以用Vlide检查程序,如果有任何错误或任何不希望的结果,那么我会重新检查代码的主要部分并解决它。
 
当你知道你想要什么,你有正确的工具来完成一项任务,更重要的是,当你知道如何使用这些工具时,你就很容易成功地达到你的目标。
 
祝你好运,编码愉快。
 
塔瓦特
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:36 , Processed in 0.466466 second(s), 79 queries .

© 2020-2025 乐筑天下

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