明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2310|回复: 16

[提问] 求程序-快速做快并拾取文字为块名

[复制链接]
发表于 2020-5-9 16:10:16 | 显示全部楼层 |阅读模式
10明经币
10币求个偷懒小程序,程序过程如下:
选取图元,输入命令,空格,拾取文字为块名,空格,选择基点同时完成块制作!

最佳答案

发表于 2020-5-9 16:10:17 | 显示全部楼层
cjjh8301 发表于 2020-5-12 11:17
有同名块没有提示就直接替换了,我是想,出现同名块,就提示下有同名块,然后有(N/Y)选择是否替换,默认 ...

  1. (defun c:tt (/ p ss str doins)
  2.   (setvar 'cmdecho 0)
  3.   (if (and (setq ss (ssget))
  4.            (setq str (car (entsel "选择块名文字对象:")))
  5.            (setq p (getpoint "指定基点:"))
  6.       )
  7.     (progn
  8.       (setq str          (cdr (assoc 1 (entget str)))
  9.             doins "Y"
  10.       )

  11.       (if (vl-catch-all-error-p
  12.             (vl-catch-all-apply
  13.               'vla-item
  14.               (list (vla-get-blocks
  15.                       (vla-get-activedocument (vlax-get-acad-object))
  16.                     )
  17.                     str
  18.               )
  19.             )
  20.           )
  21.         (command ".block" str p ss "")
  22.         (progn
  23.           (initget "Y N")
  24.           (setq doins (getkword "是否替换同名块[是(Y)/否(N)]:"))
  25.           (if (= "Y" doins)
  26.             (command ".block" str "Y" p ss "")
  27.           )
  28.         )
  29.       )
  30.       (if (= "Y" doins)
  31.         (command ".insert" str p 1. 1. 0.)
  32.       )
  33.     )
  34.   )
  35.   (setvar 'cmdecho 1)
  36. )
回复

使用道具 举报

发表于 2020-5-9 23:42:52 | 显示全部楼层
  1. (defun c:tt (/ p ss str)
  2.   (setvar 'cmdecho 0)
  3.   (if (and (setq ss (ssget))
  4.            (setq str (car (entsel "选择块名文字对象:")))
  5.            (setq p (getpoint "指定基点:"))
  6.       )
  7.     (progn
  8.       (setq str (cdr (assoc 1 (entget str))))
  9.       (command ".block" str p ss "")
  10.       (command ".insert" str p 1. 1. 0.)
  11.     )
  12.   )
  13.   (setvar 'cmdecho 1)
  14. )
回复

使用道具 举报

发表于 2020-5-10 09:44:52 | 显示全部楼层
(defun c:tt (/ p ss ssbox str)   ;已加入块基点
  (setvar 'cmdecho 0)
  (if (and
                             (setq ssbox (zg-GetSSBoundingbox (setq ss (ssget))))
           (setq str (car (entsel "\n选择块名文字对象:")))                       
                        (setq p (apply 'mapcar (cons (function (lambda (a b) (/ (+ a b) 2))) ssbox))))
    (progn
      (setq str (cdr (assoc 1 (entget str))))
      (command ".block" str p ss "")
      (command ".insert" str p 1. 1. 0.)))
  (setvar 'cmdecho 1))
;块基点为选择集中心点  原作者:namezg  
(defun zg-GetSSBoundingbox (ss / i ssn ll rr box ptlist ssbox)
                (if ss
                        (progn
                                (setq i -1)
                                (repeat (sslength ss)
                                        (setq ssn (ssname ss (setq i (1+ i))))
                                        (vla-GetBoundingBox (vlax-ename->vla-object ssn) 'll 'rr)  ;得到对象的包围盒
                                        (setq box (list (vlax-safearray->list ll) (vlax-safearray->list rr)))
                                        (setq ptlist (append box ptlist)))
                                (setq ssbox (mapcar '(lambda (x) (apply 'mapcar (cons x ptlist))) (list 'min 'max))))))


本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2020-5-10 22:44:30 | 显示全部楼层

可以用,但是我我忽略了一个问题,就是有同名块时,能否提示有同名块,然后可以选择N/Y,
N不替换程序结束;Y替换同名块,结束程序,(默认N)
回复

使用道具 举报

发表于 2020-5-11 17:22:58 | 显示全部楼层
cjjh8301 发表于 2020-5-10 22:44
可以用,但是我我忽略了一个问题,就是有同名块时,能否提示有同名块,然后可以选择N/Y,
N不替换程序结 ...

(defun c:tt (/ p ss str)
  (setvar 'cmdecho 0)
  (if (and (setq ss (ssget))
           (setq str (car (entsel "选择块名文字对象:")))
           (setq p (getpoint "指定基点:"))
      )
    (progn
      (setq str (cdr (assoc 1 (entget str))))

      (if (vla-item (vla-get-blocks
                      (vla-get-activedocument (vlax-get-acad-object))
                    )
                    str
          )
        (command ".block" str "Y" p ss "")
        (command ".block" str p ss "")
      )

      (command ".insert" str p 1. 1. 0.)
    )
  )
  (setvar 'cmdecho 1)
)
回复

使用道具 举报

 楼主| 发表于 2020-5-12 08:59:17 | 显示全部楼层
vectra 发表于 2020-5-11 17:22
(defun c:tt (/ p ss str)
  (setvar 'cmdecho 0)
  (if (and (setq ss (ssget))

选择基点后没有成块,麻烦看下,是什么问题!!!
回复

使用道具 举报

发表于 2020-5-12 09:58:08 | 显示全部楼层
cjjh8301 发表于 2020-5-12 08:59
选择基点后没有成块,麻烦看下,是什么问题!!!

  1. (defun c:tt (/ p ss str)
  2.   (setvar 'cmdecho 0)
  3.   (if (and (setq ss (ssget))
  4.            (setq str (car (entsel "选择块名文字对象:")))
  5.            (setq p (getpoint "指定基点:"))
  6.       )
  7.     (progn
  8.       (setq str (cdr (assoc 1 (entget str))))

  9.       (if (vl-catch-all-error-p
  10.             (vl-catch-all-apply
  11.               'vla-item
  12.               (list (vla-get-blocks
  13.                       (vla-get-activedocument (vlax-get-acad-object))
  14.                     )
  15.                     str
  16.               )
  17.             )
  18.           )
  19.         (command ".block" str p ss "")
  20.         (command ".block" str "Y" p ss "")
  21.       )
  22.       (command ".insert" str p 1. 1. 0.)
  23.     )
  24.   )
  25.   (setvar 'cmdecho 1)
  26. )
回复

使用道具 举报

 楼主| 发表于 2020-5-12 11:17:14 | 显示全部楼层

有同名块没有提示就直接替换了,我是想,出现同名块,就提示下有同名块,然后有(N/Y)选择是否替换,默认为不替换,帮我再修改下
回复

使用道具 举报

 楼主| 发表于 2020-5-12 16:58:03 | 显示全部楼层
htlaser 发表于 2020-5-10 09:44
(defun c:tt (/ p ss ssbox str)   ;已加入块基点
  (setvar 'cmdecho 0)
  (if (and

同时感谢这位兄弟!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-14 14:49 , Processed in 0.375596 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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