明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 607|回复: 24

[提问] 如何获取块内某点的全局坐标

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
比如果一个块中有几个圆;如何获取到这几个圆的圆心的全局坐标 不是块内坐标 就是这个点相对于整个图纸的坐标 网上说用VLA-TRANSFORMCOORDINATES这个函数  查到的信息是vla-TransformCoordinates 的功能是将块内圆的圆心从块的局部坐标系转换为全局坐标  但是我放到lisp中总是不识别这个函数 难道lisp代码不认这个函数吗 还请老师帮我解答下疑惑
回复

使用道具 举报

发表于 前天 11:12 | 显示全部楼层
本帖最后由 caoyin 于 2025-9-3 00:38 编辑

;;p1是块定义内的点,P2是块参照所在空间的点

(setq en  (car (entsel "\n选择块参照: "))
      mat (RefGeom en)
      p2  (mapcar '+ (mxv (car mat) p1) (cadr mat))
)


;; RefGeom (gile)
;; returns a list which first item is a 3x3 transformation matrix (rotation,
;; scales, normal) and second item the object insertion point in its parent
;; (xref, bloc or space)
;;
;; Argument : an ename
(defun RefGeom (ename / elst ang norm)
  (setq elst (entget ename)
        ang  (cdr (assoc 50 elst))        
        norm (cdr (assoc 210 elst))
  )
  (list
    (mxm
      (mapcar (function (lambda (v) (trans v 0 norm T)))
          '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
      )
      (mxm
        (list (list (cos ang) (- (sin ang)) 0.0)
              (list (sin ang) (cos ang) 0.0)
              '(0.0 0.0 1.0)
        )
        (list (list (cdr (assoc 41 elst)) 0.0 0.0)
              (list 0.0 (cdr (assoc 42 elst)) 0.0)
              (list 0.0 0.0 (cdr (assoc 43 elst)))
        )
      )
    )
    (trans (cdr (assoc 10 elst)) norm 0)
  )
)

;;; VXV Returns the dot product of 2 vectors
(defun vxv (v1 v2)
  (apply '+ (mapcar '* v1 v2))
)
;; TRP Transpose a matrix -Doug Wilson-
(defun trp (m)
  (apply 'mapcar (cons 'list m))
)
;; MXV Apply a transformation matrix to a vector -Vladimir Nesterovsky-
(defun mxv (m v)
  (mapcar '(lambda (r) (vxv r v)) m)
)
;; MXM Multiply two matrices -Vladimir Nesterovsky-
(defun mxm (m q)
  (mapcar '(lambda (r) (mxv (trp q) r)) m)
)

评分

参与人数 1明经币 +1 收起 理由
aihuyujian + 1 测试可行,还是有现成的代码好啊,矩阵早忘.

查看全部评分

回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-9-1 11:23 编辑

组块:
选中的部分克隆一份图元们到内存中,把它们从插入点移动到原点(0,0),
根据鼠标坐标系进行三维旋转到世界坐标系,
加入块表记录.

插入:上面步骤的逆向.
新建块参照,id指向为块表记录,插入到原点,三维旋转,平移到插入点.
块参照会储存一个块矩阵,记录仿射变换的元素,也就是:缩放+三维旋转+平移...

而你的问题:块内坐标就是原点(0,0)附近的.
可以: 块内点 * 块参照矩阵 => 块外点. (这个*是矩阵乘法)

这种就是大名鼎鼎的基变换.
至于Lisp怎么敲?看其他人表现了,嘻嘻.
回复 支持 反对

使用道具 举报

发表于 前天 11:47 | 显示全部楼层
kozmosovia 发表于 2025-9-1 11:34
属性是可以lockpoisiton的

属性定义(ATTDEF)是套嵌图元,即是块参照的子图元。而属性(ATTRIB)是和块参照是同级图元。只不过ATTRIB是附着在块参照对象上。所以,ATTDEF和ATTRIB有关系,但没有必然关系。
即便ATTDEF是锁定的,ATTRIB也是不一定在同一位置。甚至没有ATTDEF,但可以有ATTRIB。
当然你一定强调这样可不可以实现,可以。但方法极端。
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
用块的基点坐标加块内圆心的坐标 就是圆心的全局坐标

点评

需要考虑图块比例  发表于 前天 09:04
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
你有种再说一遍 发表于 2025-8-31 23:00
组块:
克隆一份图元到内存中,从插入点移动到原点(0,0),
根据鼠标坐标系进行三维旋转到世界坐标系,

AcDbBlockReference::blockTransform,呵呵
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
bskidtf 发表于 2025-8-31 23:16
AcDbBlockReference::blockTransform,呵呵

Lisp这个东东不知道在哪里,毕竟我学时候只是vla-copy...
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
你有种再说一遍 发表于 2025-8-31 23:22
Lisp这个东东不知道在哪里,毕竟我学时候只是vla-copy...

我也不知有没有
回复 支持 反对

使用道具 举报

发表于 前天 08:25 | 显示全部楼层
看看高飞鸟版主的帖子
http://bbs.mjtd.com/forum.php?mo ... peid%26typeid%3D108
块的变换矩阵
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 08:59 | 显示全部楼层
夏生生 发表于 2025-9-1 08:25
看看高飞鸟版主的帖子
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99926&extra=page%3D1%26filter ...

这个厉害了 直接降维打击了 感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 09:02 | 显示全部楼层
飞雪神光 发表于 2025-8-31 22:40
用块的基点坐标加块内圆心的坐标 就是圆心的全局坐标

我就是没法获取全局坐标啊 块基点和块内坐标岂不是一样的道理 获取的块基点都是0  没什么用
回复 支持 反对

使用道具 举报

发表于 前天 09:11 | 显示全部楼层
最简单的方法:一炸解千愁!
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-9-3 07:35 , Processed in 0.162521 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表