明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 635|回复: 9

[源码] 向块内添加多段线

[复制链接]
发表于 2024-8-17 14:01:35 | 显示全部楼层 |阅读模式
  1. (defun $block-add-pline$ (ent pts lst / $kuai-wai-pt->kuai-nei-pt$ blk name obj points)
  2.           ;向块内添加多段线;($block-add-pline$(car(entsel))(list (getpoint "请绘制直线起点准备添加到块中")(getpoint "请绘制终点"))nil)
  3.   (defun $kuai-wai-pt->kuai-nei-pt$ (ent   pts
  4.              /     dxf
  5.              enum:blk   lst
  6.              nestref   revnest
  7.              zx:disptomatrix
  8.              zx:mxm   zx:mxp
  9.              zx:mxv   zx:refgeom
  10.              zx:revrefgeom
  11.              zx:trp   pts-new
  12.             )
  13.           ;块外坐标转换为块内坐标,返回的是三维坐标
  14.     (defun zx:mxm (m q)
  15.           ; 矩阵相乘
  16.       (mapcar (function (lambda (r) (zx:mxv (zx:trp q) r))) m)
  17.     )
  18.     (defun zx:mxv (m v)
  19.           ; 向量或点的矩阵变换(向量乘矩阵)
  20.       (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
  21.         m
  22.       )
  23.     )
  24.     (defun zx:trp (m)
  25.           ; 矩阵转置
  26.       (apply 'mapcar (cons 'list m))
  27.     )
  28.     (defun zx:DispToMatrix (mat disp)
  29.           ; 把位移矢量添加到矩阵中
  30.       (reverse
  31.   (cons '(0. 0. 0. 1.)
  32.         (reverse
  33.     (mapcar  (function (lambda (a b)
  34.             (reverse (cons b (reverse a)))
  35.           )
  36.       )
  37.       mat
  38.       disp
  39.     )
  40.         )
  41.   )
  42.       )
  43.     )
  44.     (defun zx:mxp (m p)
  45.           ; 点的矩阵(4x4 matrix) 变换
  46.       (reverse
  47.   (cdr
  48.     (reverse (zx:mxv m (reverse (cons '1.0 (reverse p)))))
  49.   )
  50.       )
  51.     )
  52.     ;; 功能:图块的变换矩阵
  53.     (defun zx:RefGeom (ename / DXF ang nrm mat DISP sx sy sz sa ca)
  54.       (setq DXF  (entget ename)
  55.       ang  (cdr (assoc 50 DXF))
  56.       nrm  (cdr (assoc 210 DXF))
  57.       sx  (cdr (assoc 41 DXF))
  58.       sy  (cdr (assoc 42 DXF))
  59.       sz  (cdr (assoc 43 DXF))
  60.       sa  (sin ang)
  61.       ca  (cos ang)
  62.       )
  63.       (list
  64.   (setq mat
  65.          (ZX:mxm
  66.      (mapcar (function (lambda (v) (trans v 0 nrm T)))
  67.        '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  68.      )
  69.      (list
  70.        (list (* ca sx) (- (* sa sy)) 0.0)
  71.        (list (* sa sx) (* ca sy) 0.0)
  72.        (list 0 0 sz)
  73.      )
  74.          )
  75.   )
  76.   (setq disp
  77.          (mapcar
  78.      '-
  79.      (trans (cdr (assoc 10 DXF)) nrm 0)
  80.      (ZX:mxv
  81.        mat
  82.        (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 DXF)))))
  83.      )
  84.          )
  85.   )
  86.       )
  87.       (append
  88.   (mapcar 'append mat (mapcar 'list disp))
  89.   '((0. 0. 0. 1.))
  90.       )
  91.     )
  92.     ;; 功能:图块的变换矩阵的逆矩阵,输入:块参照的图元名,输出:块参照的变换矩阵的逆矩阵
  93.     (defun zx:RevRefGeom (ename / dxf ang nrm mat disp)
  94.       (setq dxf (entget ename))
  95.       (setq ang (- (cdr (assoc 50 dxf))))
  96.       (setq nrm (cdr (assoc 210 dxf)))
  97.       (setq mat
  98.        (zx:mxm
  99.          (list (list (/ 1 (cdr (assoc 41 dxf))) 0.0 0.0)
  100.          (list 0.0 (/ 1 (cdr (assoc 42 dxf))) 0.0)
  101.          (list 0.0 0.0 (/ 1 (cdr (assoc 43 dxf))))
  102.          )
  103.          (zx:mxm
  104.      (list (list (cos ang) (- (sin ang)) 0.0)
  105.            (list (sin ang) (cos ang) 0.0)
  106.            '(0.0 0.0 1.0)
  107.      )
  108.      (mapcar (function (lambda (v) (trans v nrm 0 T)))
  109.        '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  110.      )
  111.          )
  112.        )
  113.       )
  114.       (setq disp
  115.        (mapcar
  116.          '-
  117.          (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 dxf)))))
  118.          (zx:mxv mat (trans (cdr (assoc 10 dxf)) nrm 0))
  119.        )
  120.       )
  121.       (append
  122.   (mapcar 'append mat (mapcar 'list disp))
  123.   '((0. 0. 0. 1.))
  124.       )
  125.     )
  126.     ;;块外边的点坐标(WCS)转为块内坐标。
  127.     (defun RevNest (ename pts / BLK DXF LST MAT PENT PT)
  128.           ;转换到块内坐标
  129.       (setq mat (zx:RevRefGeom ename))
  130.       (mapcar (function (lambda (p) (zx:mxp mat p))) pts)
  131.     )
  132.     (if  (and pts (= (type pts) 'list))
  133.       (progn
  134.   (setq pts (mapcar (function (lambda (a)
  135.               (list (car a) (cadr a) 0)
  136.             )
  137.         )
  138.         pts
  139.       )
  140.   )        ;保证三维坐标
  141.   (setq pts-new (RevNest ent pts))
  142.       )
  143.     )
  144.     (if  pts-new
  145.       pts-new
  146.       pts
  147.     )
  148.   )
  149.   (and ent
  150.        pts
  151.        (= (CDR (ASSOC 0 (ENTGET ENT))) "INSERT")
  152.        (setq pts (vl-remove nil pts))
  153.        (> (length pts) 1)
  154.        (progn
  155.    (SETQ OBJ (vl-catch-all-apply 'vlax-ename->vla-object (list ent)))
  156.    (and
  157.      (setq name (vl-catch-all-apply
  158.       'vla-get-effectivename
  159.       (list obj)
  160.           )
  161.      )
  162.      (setq
  163.        blk
  164.         (vl-catch-all-apply
  165.     'vla-item
  166.     (list (vla-get-blocks
  167.       (vla-get-activeDocument (vlax-get-acad-object))
  168.           )
  169.           name
  170.     )
  171.         )
  172.      )        ;(vlax-dump-object blk t);查看属性块支持哪些方法
  173.    )
  174.    (setq
  175.      pts (mapcar (function (lambda (a) (list (car a) (cadr a) 0)))
  176.            pts
  177.          )
  178.    )        ;保证是三维坐标
  179.    (and (setq pts ($kuai-wai-pt->kuai-nei-pt$ ent pts))
  180.           ;块外坐标转换为块内坐标
  181.         (setq pts (apply 'append pts))
  182.         (setq points (vlax-make-safearray
  183.            vlax-vbDouble
  184.            (cons 0 (- (length pts) 1))
  185.          )
  186.         )
  187.         (vl-catch-all-apply 'vlax-safearray-fill (list points pts))
  188.         (progn
  189.     (vl-catch-all-apply
  190.       'vlax-invoke-method
  191.       (list blk 'AddPolyline points)
  192.     )
  193.     (vl-cmdf "_.attsync" "n" name) ;返回同步结果给and
  194.         )
  195.    )
  196.        )
  197.   )
  198. )

评分

参与人数 2明经币 +2 金钱 +10 收起 理由
USER2128 + 1 赞一个!
tigcat + 1 + 10 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-8-17 15:33:07 | 显示全部楼层
感谢分享源码,先收藏备用
发表于 2024-8-17 15:54:31 | 显示全部楼层
xxyyzzlg 发表于 2024-8-17 15:33
感谢分享源码,先收藏备用

居然被你占了沙发
发表于 2024-8-17 16:01:37 | 显示全部楼层
向快内添加和移除任意实体有木有

点评

Leemac网站上有  发表于 2024-8-17 16:19
发表于 2024-8-17 16:14:50 | 显示全部楼层

论坛被攻击,我捡了个漏
发表于 2024-8-19 10:08:08 | 显示全部楼层
感谢分享感谢分享感谢分享
发表于 2024-8-19 10:43:11 | 显示全部楼层
感谢大佬分享
发表于 2024-9-17 10:04:13 | 显示全部楼层
谢谢大佬,收藏学习。
发表于 2024-9-29 16:41:25 | 显示全部楼层
怎么添加不了 有 成功的吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 06:52 , Processed in 0.169685 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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