明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1597|回复: 13

[提问] 如何通过块名称获取图块的外围宽度和高度?

[复制链接]
发表于 2020-6-29 21:16:49 | 显示全部楼层 |阅读模式
本帖最后由 小万LISP 于 2020-6-29 22:35 编辑


在CAD图形中制作了一个块,取名为name,如上图。请问 如何用LISP通过name这个名称来获得这个块的外围宽度和高度呢?

本帖子中包含更多资源

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

x
发表于 2020-7-2 14:25:54 | 显示全部楼层
整理资讯
如  start4444 ' 原地踏步 所说,目前无法利用块名,直接得块的长跟宽
只能通过先插入块,得块的长跟宽

如程式本身是先输入得到块名与块座标点
插入第一个块后,得到长跟宽,再去插入第二个块

可以利用以下 Gu_xl 版主 的 函数


;;参数 pt = 点 blockname = 块名
(defun getinertBypt  (pt BlockName / h p1  ss sl en ll ur)
  (setq h (getvar 'viewsize)) ;_ 屏幕高
  (setq        p1 (list (car pt) (+ (cadr pt) (* 0.5 h)) 0))
  (setq        ss (ssget "F"
                  (list pt p1)
                  (list (cons 0 "insert") (cons 2 BlockName))))
  (if ss
    (progn
      (repeat (setq i (sslength ss))
        (setq sl (cons (ssname ss (setq i (1- i))) s))
        )
      (setq sl
             (vl-sort sl
                      '(lambda (a b)
                         (< (distance pt (cdr (assoc 10 (entget a))))
                            (distance pt (cdr (assoc 10 (entget b))))
                            )
                         )
                      )
            )
      ;;得到点位置处的块图元名
      (setq en (car sl))
      (vla-getboundingbox (vlax-ename->vla-object en) 'll 'ur)
      (setq ll (vlax-safearray->list ll)
            ur (vlax-safearray->list ur)  ;得到长跟宽
            )
      (if (<= (cadr ll) (cadr pt) (cadr ur))
        (progn
      (redraw en 3) ;_ 亮显
      ;;返回值
      en
      )
        )
      )
    )
  )

发表于 2020-7-3 09:28:31 | 显示全部楼层
(defun c:tt (/ blk enname minp maxp xlst ylst i)
  (setq blk (tblsearch "block" "test"))
  (setq enname (cdr (last blk)))
  (minpmaxp enname)
  (setq xlst (list (car minp) (car maxp)))
  (setq ylst (list (cadr minp) (cadr maxp)))
  (while (setq enname (entnext enname))
    (minpmaxp enname)
    (setq xlst (cons (car minp) xlst))
    (setq ylst (cons (cadr minp) ylst))
    (setq xlst (cons (car maxp) xlst))
    (setq ylst (cons (cadr maxp) ylst))
  )
  (princ (strcat "高:"(rtos(- (apply 'max ylst) (apply 'min ylst))2 2)))
  (princ (strcat "宽:"(rtos(- (apply 'max xlst) (apply 'min xlst))2 2)))
  (princ)
)
(defun minpmaxp        (ent / obj P1 P2)
  (setq obj (Vlax-Ename->Vla-Object ent))
  (Vlax-Invoke-Method obj 'GetBoundingBox 'P1 'P2)
  (setq        minp (vlax-safearray->list P1)
        maxp (vlax-safearray->list P2)
  )
)
发表于 2020-6-30 21:49:48 | 显示全部楼层
  1. (setq BLK (tblsearch "block" "TEST"))
  2. (SETQ ENNAME (CDR (LAST BLK)))
  3. (SETQ OBJ (Vlax-Ename->Vla-Object ENNAME))
  4. (Vlax-Invoke-Method OBJ 'GetBoundingBox 'P1 'P2)
  5. (setq minp (vlax-safearray->list P1)
  6.       maxp (vlax-safearray->list P2)
  7. )



这样就实现了,不用插入块
发表于 2020-6-29 23:58:27 来自手机 | 显示全部楼层
我也想知道,跪求大神解惑,帮推
发表于 2020-6-30 00:22:35 | 显示全部楼层
就算是同块名如果插入的比例变了大小就不一样了,如果比例没变就随便插入一个再提取外框就行了
发表于 2020-6-30 08:22:48 | 显示全部楼层
要想纯粹通过name来获得块的外围和高度还是有难度的,简单的处理办法是先插入图块,然后用 vla-getBoundingBox 得到两个角点,再将图块删除。
发表于 2020-6-30 08:40:44 | 显示全部楼层
1比1的尺寸是可以实现的
 楼主| 发表于 2020-6-30 20:56:27 | 显示全部楼层
jun353835273 发表于 2020-6-30 08:40
1比1的尺寸是可以实现的

就是1:1的。
 楼主| 发表于 2020-6-30 22:18:11 | 显示全部楼层
jun353835273 发表于 2020-6-30 21:49
这样就实现了,不用插入块

厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、高 ,与 实际块的 尺寸 相差很大,是什么原因呢?
发表于 2020-6-30 23:10:53 | 显示全部楼层
小万LISP 发表于 2020-6-30 22:18
厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、 ...


块的比例不一样吧,这个是原始的,创建块时候的尺寸
发表于 2020-7-2 08:31:21 | 显示全部楼层
小万LISP 发表于 2020-6-30 22:18
厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、 ...

(tblsearch "block" "TEST")返回的图元名是块中第一个图元,因此得出的坐标是这个图元的,而不是整个块的坐标。

点评

原来如此。您真博学。  发表于 2020-7-3 06:13
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 11:45 , Processed in 0.180913 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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