比如果一个块中有几个圆;如何获取到这几个圆的圆心的全局坐标 不是块内坐标 就是这个点相对于整个图纸的坐标 网上说用VLA-TRANSFORMCOORDINATES这个函数 查到的信息是vla-TransformCoordinates 的功能是将块内圆的圆心从块的局部坐标系转换为全局坐标 但是我放到lisp中总是不识别这个函数 难道lisp代码不认这个函数吗 还请老师帮我解答下疑惑
网友答: 本帖最后由 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)
)网友答: 本帖最后由 你有种再说一遍 于 2025-9-1 11:23 编辑
组块:
选中的部分克隆一份图元们到内存中,把它们从插入点移动到原点(0,0),
根据鼠标坐标系进行三维旋转到世界坐标系,
加入块表记录.
插入:上面步骤的逆向.
新建块参照,id指向为块表记录,插入到原点,三维旋转,平移到插入点.
块参照会储存一个块矩阵,记录仿射变换的元素,也就是:缩放+三维旋转+平移...
而你的问题:块内坐标就是原点(0,0)附近的.
可以: 块内点 * 块参照矩阵 => 块外点. (这个*是矩阵乘法)
这种就是大名鼎鼎的基变换.
至于Lisp怎么敲?看其他人表现了,嘻嘻.网友答:
属性定义(ATTDEF)是套嵌图元,即是块参照的子图元。而属性(ATTRIB)是和块参照是同级图元。只不过ATTRIB是附着在块参照对象上。所以,ATTDEF和ATTRIB有关系,但没有必然关系。
即便ATTDEF是锁定的,ATTRIB也是不一定在同一位置。甚至没有ATTDEF,但可以有ATTRIB。
当然你一定强调这样可不可以实现,可以。但方法极端。
网友答: 用块的基点坐标加块内圆心的坐标 就是圆心的全局坐标网友答:
AcDbBlockReference::blockTransform,呵呵网友答:
Lisp这个东东不知道在哪里,毕竟我学时候只是vla-copy...网友答:
我也不知有没有网友答: 看看高飞鸟版主的帖子
http://bbs.mjtd.com/forum.php?mo ... peid%26typeid%3D108
块的变换矩阵网友答:
这个厉害了 直接降维打击了 感谢网友答:
我就是没法获取全局坐标啊 块基点和块内坐标岂不是一样的道理 获取的块基点都是0 没什么用网友答: 最简单的方法:一炸解千愁!
网友答: 本帖最后由 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)
)网友答: 本帖最后由 你有种再说一遍 于 2025-9-1 11:23 编辑
组块:
选中的部分克隆一份图元们到内存中,把它们从插入点移动到原点(0,0),
根据鼠标坐标系进行三维旋转到世界坐标系,
加入块表记录.
插入:上面步骤的逆向.
新建块参照,id指向为块表记录,插入到原点,三维旋转,平移到插入点.
块参照会储存一个块矩阵,记录仿射变换的元素,也就是:缩放+三维旋转+平移...
而你的问题:块内坐标就是原点(0,0)附近的.
可以: 块内点 * 块参照矩阵 => 块外点. (这个*是矩阵乘法)
这种就是大名鼎鼎的基变换.
至于Lisp怎么敲?看其他人表现了,嘻嘻.网友答:
kozmosovia 发表于 2025-9-1 11:34
属性是可以lockpoisiton的
属性定义(ATTDEF)是套嵌图元,即是块参照的子图元。而属性(ATTRIB)是和块参照是同级图元。只不过ATTRIB是附着在块参照对象上。所以,ATTDEF和ATTRIB有关系,但没有必然关系。
即便ATTDEF是锁定的,ATTRIB也是不一定在同一位置。甚至没有ATTDEF,但可以有ATTRIB。
当然你一定强调这样可不可以实现,可以。但方法极端。
网友答: 用块的基点坐标加块内圆心的坐标 就是圆心的全局坐标网友答:
你有种再说一遍 发表于 2025-8-31 23:00
组块:
克隆一份图元到内存中,从插入点移动到原点(0,0),
根据鼠标坐标系进行三维旋转到世界坐标系,
AcDbBlockReference::blockTransform,呵呵网友答:
bskidtf 发表于 2025-8-31 23:16
AcDbBlockReference::blockTransform,呵呵
Lisp这个东东不知道在哪里,毕竟我学时候只是vla-copy...网友答:
你有种再说一遍 发表于 2025-8-31 23:22
Lisp这个东东不知道在哪里,毕竟我学时候只是vla-copy...
我也不知有没有网友答: 看看高飞鸟版主的帖子
http://bbs.mjtd.com/forum.php?mo ... peid%26typeid%3D108
块的变换矩阵网友答:
夏生生 发表于 2025-9-1 08:25
看看高飞鸟版主的帖子
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=99926&extra=page%3D1%26filter ...
这个厉害了 直接降维打击了 感谢网友答:
飞雪神光 发表于 2025-8-31 22:40
用块的基点坐标加块内圆心的坐标 就是圆心的全局坐标
我就是没法获取全局坐标啊 块基点和块内坐标岂不是一样的道理 获取的块基点都是0 没什么用网友答: 最简单的方法:一炸解千愁!