乐筑天下

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

[编程交流] 获取实体i的点

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 16:00:07 | 显示全部楼层 |阅读模式
我在一个块内有一个圆,这个块被插入到一个图形中。我想得到WCS中圆心的坐标。显然,圆心不是插入点。
 
我发现“nentselp”用trans进行转换。矩阵,但要求我给出一个我没有的点(用户输入是不可能的),所以我不为我工作。然而,块的所有其他数据是已知的。
 
我用下面这条线找到了圆心
 
  1. (setq ptz (cdr (assoc 10 (entget (cadr (getblkitems ent))))))

 
“getblkitems”返回列表中的所有实体名称(有人善意地在论坛中发布),我知道第二个实体(因此上面的cadr)是圆。
 
但现在的问题是,我没有trans。矩阵以获取WCS中的点。有没有关于如何将其转化的想法,或者有没有关于不同方法的想法?
 
非常感谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:09:10 | 显示全部楼层
下面是一个示例:
  1. (defun blockreferencecirclecenter ( ref / cen ent enx )
  2.    (setq ent (tblobjname "block" (cdr (assoc 2 (entget ref)))))
  3.    (while
  4.        (and
  5.            (null cen)
  6.            (setq ent (entnext ent))
  7.            (setq enx (entget  ent))
  8.        )
  9.        (if (= "CIRCLE" (cdr (assoc 0 enx)))
  10.            (setq cen (trans (cdr (assoc 10 enx)) (cdr (assoc 210 enx)) 0))
  11.        )
  12.    )
  13.    (if cen (apply '(lambda ( mat vec ) (mapcar '+ (mxv mat cen) vec)) (refgeom ref)))
  14. )
  15. ;; RefGeom (gile)
  16. ;; Returns a list whose first item is a 3x3 transformation matrix and
  17. ;; second item the object insertion point in its parent (xref, block or space)
  18. (defun refgeom ( ent / ang enx mat ocs )
  19.    (setq enx (entget ent)
  20.          ang (cdr (assoc 050 enx))
  21.          ocs (cdr (assoc 210 enx))
  22.    )
  23.    (list
  24.        (setq mat
  25.            (mxm
  26.                (mapcar '(lambda ( v ) (trans v 0 ocs t))
  27.                   '(
  28.                        (1.0 0.0 0.0)
  29.                        (0.0 1.0 0.0)
  30.                        (0.0 0.0 1.0)
  31.                    )
  32.                )
  33.                (mxm
  34.                    (list
  35.                        (list (cos ang) (- (sin ang)) 0.0)
  36.                        (list (sin ang) (cos ang)     0.0)
  37.                       '(0.0 0.0 1.0)
  38.                    )
  39.                    (list
  40.                        (list (cdr (assoc 41 enx)) 0.0 0.0)
  41.                        (list 0.0 (cdr (assoc 42 enx)) 0.0)
  42.                        (list 0.0 0.0 (cdr (assoc 43 enx)))
  43.                    )
  44.                )
  45.            )
  46.        )
  47.        (mapcar '- (trans (cdr (assoc 10 enx)) ocs 0)
  48.            (mxv mat (cdr (assoc 10 (tblsearch "block" (cdr (assoc 2 enx))))))
  49.        )
  50.    )
  51. )
  52. ;; Matrix Transpose  -  Doug Wilson
  53. ;; Args: m - nxn matrix
  54. (defun trp ( m )
  55.    (apply 'mapcar (cons 'list m))
  56. )
  57. ;; Matrix x Matrix  -  Vladimir Nesterovsky
  58. ;; Args: m,n - nxn matrices
  59. (defun mxm ( m n )
  60.    ((lambda ( a ) (mapcar '(lambda ( r ) (mxv a r)) m)) (trp n))
  61. )
  62. ;; Matrix x Vector  -  Vladimir Nesterovsky
  63. ;; Args: m - nxn matrix, v - vector in R^n
  64. (defun mxv ( m v )
  65.    (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  66. )
。。。和一个测试程序:
  1. (defun c:test ( / cen ent )
  2.    (if (setq ent (car (entsel)))
  3.        (if (= "INSERT" (cdr (assoc 0 (entget ent))))
  4.            (if (setq cen (blockreferencecirclecenter ent))
  5.                (entmake (list '(0 . "POINT") (cons 10 cen) (cons 210 (trans '(0 0 1) 1 0 t))))
  6.                (princ "\nNo circle found in block definition.")
  7.            )
  8.            (princ "\nObject is not a block.")
  9.        )
  10.        (princ "\nNo object selected.")
  11.    )
  12.    (princ)
  13. )
回复

使用道具 举报

lrm

1

主题

257

帖子

282

银币

限制会员

铜币
-13
发表于 2022-7-5 16:11:28 | 显示全部楼层
 
如果您知道块坐标系中点的坐标(以下示例中的POC),或者可以获得它们,则可以将点的齐次坐标乘以矩阵。我的矩阵乘法函数没有其他函数那么优雅,但它可以工作。
 
  1. (defun c:tt (/)
  2. (setq pOCS '(1.11 2.22 3.33))  ; coordinates in Object Cor. Sys
  3. (setq M (cadr (cdr (nentsel)) )) ; block 4 x 3 matrix
  4. (setq pWCS (transform pOCS M)) ; coordinates in WCS
  5. (princ pwcs)
  6. (princ)
  7. )
  8. (defun transform (a HTM / transpt)        ;Coordinate transformation via matrix multiplication
  9.                                 ; a = point (3 coordinates)
  10.                                 ; HTM = homogeneous transformation matrix (3 x 4)
  11. (setq aH (append a '(1.0)))                ; aH = homogeneous point in local coordinates (1 x 4)
  12. (setq        transpt
  13. (list
  14.    (+                                ; transpt = list of x, y, z coordinates
  15.      (* (nth 0 aH) (nth 0 (nth 0 HTM)))
  16.      (* (nth 1 aH) (nth 0 (nth 1 HTM)))
  17.      (* (nth 2 aH) (nth 0 (nth 2 HTM)))
  18.      (* (nth 3 aH) (nth 0 (nth 3 HTM)))
  19.    )
  20.    (+
  21.      (* (nth 0 aH) (nth 1 (nth 0 HTM)))
  22.      (* (nth 1 aH) (nth 1 (nth 1 HTM)))
  23.      (* (nth 2 aH) (nth 1 (nth 2 HTM)))
  24.      (* (nth 3 aH) (nth 1 (nth 3 HTM)))
  25.    )
  26.    (+
  27.      (* (nth 0 aH) (nth 2 (nth 0 HTM)))
  28.      (* (nth 1 aH) (nth 2 (nth 1 HTM)))
  29.      (* (nth 2 aH) (nth 2 (nth 2 HTM)))
  30.      (* (nth 3 aH) (nth 2 (nth 3 HTM)))
  31.    )
  32. )
  33. )
  34. (setq transpt (list (nth 0 transpt) (nth 1 transpt) (nth 2 transpt)))
  35. )                                        ;end transform

 
可能有一种方法可以使用trans函数来实现这一点。
 
LRM公司
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:14:10 | 显示全部楼层
@李。介意吹。
 
看起来很长。另一个灵感来源于李的另一件艺术作品。
  1. (defun c:test ( / ent sel lst)
  2.    (if (and (cdddr (setq sel (nentselp)))
  3.             (= "CIRCLE" (cdr (assoc 0 (setq lst (entget (car sel))))))
  4.             (setq ent (entmakex (list '(0 . "POINT") (cons 10 (trans (cdr (assoc 10 lst)) (cdr (assoc 210 lst)) 0)) (cons 210 (trans '(0 0 1) 1 0 t)))))
  5.        )
  6.        (progn
  7.            (vla-transformby (vlax-ename->vla-object ent) (vlax-tmatrix (caddr sel)))
  8.            (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acallviewports)
  9.        )
  10.    )
  11.    (princ)
  12. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:21:56 | 显示全部楼层
 
干杯,杰夫!
 
 
感谢分享,但正如OP所说:
 
 
...否则我也会建议使用nentsel(p)
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 16:23:55 | 显示全部楼层
啊!虽然在你的代码(c:测试)中,你可以用任何ename替换(car)(entsel),但我不能以任何方式将插入的ename馈送到我的替代方案中的(entselp)以删除用户输入,对吗?我懂了。
 
我正要在我的阿凡达上添加一些小轮子,我想我会推迟一段时间,让我的装备保持原样!
 
干杯
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:31:01 | 显示全部楼层
只是出于好奇:
是否可以获得块引用的矩阵,而不选择它(使用nentselp),而是使用ename/vla对象?
 
一、 e.编写一个函数来翻译依赖于块定义内部的提供点,并提供块引用(当然):
 
  1. (foo BlockReference PtInsideBlkDef) -> PtInWCS

 
甚至可以翻译整个点列表(这可能更有效):
 
  1. (foo BlockReference PtListInsideBlkDef) -> PtListInWCS

 
 
我有一个关于获取嵌套直线/多段线线段的端点的旧想法,即通过拾取嵌套直线/多段线线段来对齐两个块参照。
但我被这个transformby任务困住了。
 
当然,我的想法的概念可能会使用(nentselp)选项,但我的问题是我文章的第二行。
 
 
你甚至可以这样通过嵌套块参照进行翻译:
  1. (foo BlockReferenceA (foo BlockReferenceB (foo BlockReferenceC PtListInsideBlkDef)))

如果我的问题的答案是“是”。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:35:22 | 显示全部楼层
 
确切地
 
 
独轮车?
 
 
是的-请参阅此帖子。
 
 
你确实可以。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:37:18 | 显示全部楼层
谢谢李我想我会开始更仔细地研究这些代码。
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

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

铜币
243
发表于 2022-7-5 16:46:00 | 显示全部楼层
再次感谢李。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 13:08 , Processed in 2.395924 second(s), 73 queries .

© 2020-2025 乐筑天下

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