小万LISP 发表于 2020-6-29 21:16:49

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

本帖最后由 小万LISP 于 2020-6-29 22:35 编辑


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

東洺Nile 发表于 2020-7-2 14:25:54

整理资讯
如start4444 ' 原地踏步 所说,目前无法利用块名,直接得块的长跟宽
只能通过先插入块,得块的长跟宽

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

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


;;参数 pt = 点 blockname = 块名
(defun getinertBypt(pt BlockName / h p1ss 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
      )
      )
      )
    )
)

gaics 发表于 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)
)
)

jun353835273 发表于 2020-6-30 21:49:48

小万LISP 发表于 2020-6-30 20:56
就是1:1的。

(setq BLK (tblsearch "block" "TEST"))
(SETQ ENNAME (CDR (LAST BLK)))
(SETQ OBJ (Vlax-Ename->Vla-Object ENNAME))
(Vlax-Invoke-Method OBJ 'GetBoundingBox 'P1 'P2)
(setq minp (vlax-safearray->list P1)
      maxp (vlax-safearray->list P2)
)



这样就实现了,不用插入块

東洺Nile 发表于 2020-6-29 23:58:27

我也想知道,跪求大神解惑,帮推

start4444 发表于 2020-6-30 00:22:35

就算是同块名如果插入的比例变了大小就不一样了,如果比例没变就随便插入一个再提取外框就行了

原地踏步 发表于 2020-6-30 08:22:48

要想纯粹通过name来获得块的外围和高度还是有难度的,简单的处理办法是先插入图块,然后用 vla-getBoundingBox 得到两个角点,再将图块删除。

jun353835273 发表于 2020-6-30 08:40:44

1比1的尺寸是可以实现的

小万LISP 发表于 2020-6-30 20:56:27

jun353835273 发表于 2020-6-30 08:40
1比1的尺寸是可以实现的

就是1:1的。

小万LISP 发表于 2020-6-30 22:18:11

jun353835273 发表于 2020-6-30 21:49
这样就实现了,不用插入块

厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、高 ,与 实际块的 尺寸 相差很大,是什么原因呢?

jun353835273 发表于 2020-6-30 23:10:53

小万LISP 发表于 2020-6-30 22:18
厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、 ...

块的比例不一样吧,这个是原始的,创建块时候的尺寸

gaics 发表于 2020-7-2 08:31:21

小万LISP 发表于 2020-6-30 22:18
厉害。 测试 能求出 块的 最小坐标 和 最大坐标, 但是 我用 大坐标 - 小坐标 ,得出的 宽、 ...

(tblsearch "block" "TEST")返回的图元名是块中第一个图元,因此得出的坐标是这个图元的,而不是整个块的坐标。
页: [1] 2
查看完整版本: 如何通过块名称获取图块的外围宽度和高度?