明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 230|回复: 6

[讨论] 请教老师,如何获取嵌套块的插入点坐标数据?

[复制链接]
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 mice6672 于 2024-10-26 21:45 编辑

图框是块,图框里面的标题栏是嵌套块,请教各位老师,如何获取嵌套块的插入点坐标数据?请指教,谢谢。


  1. (setq ss (ssget (list '(0 . "INSERT") '(2 . "ECTK_*") (cons 8 "Y-云图图框"))))
  2. (setq n (sslength ss))(setq name (ssname ss 0))
  3. (setq dxf (entget name))
  4. (setq tmx (car(RefGeom (ssname ss 0))));返回值((100.0 0.0 0.0) (0.0 100.0 0.0) (0.0 0.0 100.0))
  5. (setq sname (cdr (Assoc 2 dxf)))
  6. (setq e(tblobjname "block" sname))
  7. (while
  8.       e
  9.       (setq e(entnext e))
  10.       (setq dxf(entget e))
  11.       (wcmatch(cdr(assoc 0 dxf)) "INSERT")
  12.       (setq blk2(cdr(assoc 2 dxf)))
  13.       (if (= "SJY_标题栏" blk2)(progn(setq btl_p0 (cdr (assoc 10 dxf)) e nil)));返回值btl_p0=(584.0 10.0 0.0)
  14. )
  15. (setq btl_p1 (MCS2WCS tmx btl_p0));;此处出错,没有值

以下为 highflybir 老师 http://bbs.mjtd.com/forum.php?mo ... 3216&fromuid=288402

;;; 矢量的点积                                                         
;;; 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 (function (lambda (r) (vxv r v))) m))
;;; 点到矩阵的变换
(defun mxp (m p)(reverse (cdr (reverse (mxv m (append p '(1.0)))))))
;;; 矩阵相乘                                                            
;;; MXM Multiply two matrices -Vladimir Nesterovsky-                    
(defun mxm (m q)(mapcar (function (lambda (r) (mxv (trp q) r))) m))
;; TransNested (gile)
;; Translates a point coordinates from WCS or UCS to RCS -coordinates system of a
;; reference (xref or block) whatever its nested level-
;; Arguments
;; pt : the point to translate
;; rlst : the parents entities list from the deepest nested to the one inserted in
;;        current space -same as (last (nentsel)) or (last (nentselp))
;; from to : as with trans function: 0 for WCS, 1 for current UCS, 2 for RCS
(defun TransNested (pt rlst from to / geom)
  (and (= 1 from) (setq pt (trans pt 1 0)))
  (and (= 2 to) (setq rlst (reverse rlst)))
  (and (or (= 2 from) (= 2 to))
       (while rlst
        (setq geom (if        (= 2 to)
                      (RevRefGeom (car rlst))
                      (RefGeom (car rlst))
                    )
               rlst (cdr rlst)
               pt   (mapcar '+ (mxv (car geom) pt) (cadr geom))
        )
       )
  )
  (if (= 1 to)
    (trans pt 0 1)
    pt
  )
)
;; 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 mat u v w A B)
  (setq        elst (entget ename)
        ang  (cdr (assoc 50 elst))
        norm (cdr (assoc 210 elst))
  )
  (setq u (cdr (assoc 41 elst)))
  (setq v (cdr (assoc 42 elst)))
  (setq w (cdr (assoc 43 elst)))
  (setq A (cos ang))
  (setq B (sin ang))
  (list
    (setq mat
           (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))
             )
             (list (list (* u A) (- (* v B)) 0.0)
                   (list (* u B) (* v A) 0.0)
                   (list 0.0 0.0 w)
             )
           )
    )
    (mapcar
      '-
      (trans (cdr (assoc 10 elst)) norm 0)
      (mxv mat
           (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
      )
    )
  )
)

;; RevRefGeom (gile)
;; RefGeom inverse function

(defun RevRefGeom (ename / entData ang norm mat)
  (setq        entData        (entget ename)
        ang        (- (cdr (assoc 50 entData)))
        norm        (cdr (assoc 210 entData))
  )
  (list
    (setq mat
           (mxm
             (list (list (/ 1 (cdr (assoc 41 entData))) 0.0 0.0)
                   (list 0.0 (/ 1 (cdr (assoc 42 entData))) 0.0)
                   (list 0.0 0.0 (/ 1 (cdr (assoc 43 entData))))
             )
             (mxm
               (list (list (cos ang) (- (sin ang)) 0.0)
                     (list (sin ang) (cos ang) 0.0)
                     '(0.0 0.0 1.0)
               )
               (mapcar (function (lambda (v) (trans v norm 0 T)))
                       '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
               )
             )
           )
    )
    (mapcar '-
            (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 entData)))))
            (mxv mat (trans (cdr (assoc 10 entData)) norm 0))
    )
  )
)

以下为 龙龙仔 老师
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=7496
This is pretty much straight from AutoLISP Programming... by Rawls & Hagen.
;;tmx: 4x4 transformation matrix from nentselp - (caddr (nentselp))
;;p: point to transform
(defun MCS2WCS (TMX P / WX WY WZ)
  (list
    (setq WX
           (+
             (* (car (nth 0 TMX)) (car P))
             (* (cadr (nth 0 TMX)) (cadr P))
             (* (caddr (nth 0 TMX)) (caddr P))
             (cadddr (nth 0 TMX))
           )
    )
    (setq WY
           (+
             (* (car (nth 1 TMX)) (car P))
             (* (cadr (nth 1 TMX)) (cadr P))
             (* (caddr (nth 1 TMX)) (caddr P))
             (cadddr (nth 1 TMX))
           )
    )
    (setq WZ
           (+
             (* (car (nth 2 TMX)) (car P))
             (* (cadr (nth 2 TMX)) (cadr P))
             (* (caddr (nth 2 TMX)) (caddr P))
             (cadddr (nth 2 TMX))
           )
    )
  )
)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 4 天前 | 显示全部楼层
没看到图呢 dwg呢
发表于 4 天前 | 显示全部楼层
没必要搞那么复杂,临时把图框图块炸掉,找到标题栏图块,获取坐标,然后UNDO
发表于 4 天前 | 显示全部楼层
  1. (vl-load-com)
  2. (setq ty (car (entsel)))
  3. (setq ent (entget ty))
  4. (setq blk_name (cdr (assoc 2 ent)))
  5. (setq pt1 (cdr (assoc 10 ent)))
  6. (setq bili (cdr (assoc 41 ent)))
  7. (vlax-for item (vlax-invoke-method (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) 'Item blk_name)
  8.         (if (and
  9.                                 (= (vla-get-ObjectName item) "AcDbBlockReference")
  10.                                 (= (vla-get-EffectiveName item) "SJY_标题栏")
  11.                         )
  12.                 (progn
  13.                         (setq pt2 (cdr (assoc 10 (entget (vlax-vla-object->ename item)))))
  14.                         (setq pt3 (mapcar '+ pt1 (mapcar '* pt2 (list bili bili 0))))
  15.                         (entmake (list '(0 . "CIRCLE")'(100 . "AcDbEntity")'(100 . "AcDbCircle")(cons 62 1)(cons 10 pt3)(cons 40 (* bili 3))))
  16.                 )
  17.         )
  18. )
发表于 4 天前 | 显示全部楼层
  1. (setq ty(car(entsel)))
  2. (setq dxf (entget ty))
  3. (setq sname (cdr (assoc 2 dxf)))
  4. (setq pt1 (cdr (assoc 10 dxf)))
  5. (setq bili (cdr (assoc 41 dxf)))
  6. (setq e(tblobjname "block" sname))
  7. (while e
  8.         (setq e(entnext e))
  9.         (setq dxf(entget e))
  10.         (setq blk2(cdr(assoc 2 dxf)))
  11.         (if (= "SJY_标题栏" blk2)
  12.                 (progn
  13.                         (setq btl_p0 (cdr (assoc 10 dxf)) e nil)
  14.                         (setq pt3 (mapcar '+ pt1 (mapcar '* btl_p0 (list bili bili 0))))
  15.                         (entmake (list '(0 . "CIRCLE")'(100 . "AcDbEntity")'(100 . "AcDbCircle")(cons 62 1)(cons 10 pt3)(cons 40 (* bili 3))))
  16.                 )
  17.         )
  18. )
  19. (princ)
 楼主| 发表于 3 天前 | 显示全部楼层

非常感谢。学习了
 楼主| 发表于 3 天前 | 显示全部楼层
kozmosovia 发表于 2024-10-26 21:57
没必要搞那么复杂,临时把图框图块炸掉,找到标题栏图块,获取坐标,然后UNDO

这也是一种思路,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-30 10:26 , Processed in 0.175077 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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