找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2392|回复: 12

[求助] [求助]:替换图块并保持插入尺寸(原大小)之LISP程序

[复制链接]
发表于 2006-10-12 23:48:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
求可批量替换图块并保持被替换图块原大小的LISP程序
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2006-10-15 17:59:26 | 显示全部楼层
最初由 fsxm 发布
[B]用vla-GetBoundingBox可以:
类似的看有用不:http://www.xdcad.net/forum/showthread.php?s=&threadid=597610
改动一下就成了:看看是不是你要求的了?
[code]
(vl-load-com)
(defun substblk        (newblkn... [/B]

谢谢,程序可以达到我的要求了,不过每次替换都要输入块名,比较麻烦,可不可以改成直接选取样块呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 8612个

财富等级: 富甲天下

发表于 2006-10-13 08:41:54 | 显示全部楼层

Re: [求助]:替换图块并保持插入尺寸(原大小)之LISP程序

最初由 武陵山人 发布
[B]求可批量替换图块并保持被替换图块原大小的LISP程序 [/B]


  1.   [FONT=courier new]
  2. (defun c:bth (/ cn oldb newb len se1 e0 e1 bn b0)
  3.   (command "color" "")
  4.   (setvar "unitmode" 0)
  5.   (princ "\n选择块实体:")
  6.   (setq        se1  (ssget '((0 . "INSERT")))
  7.         oldb nil
  8.         newb nil
  9.   )
  10.   (if se1
  11.     (progn
  12.       (setq bn (getstring "\n批量替换*/<新块名>(回车选取样块):"))
  13.       (cond
  14.         ((= bn "*")
  15.          (setq oldb (strcase (getstring "\n旧块名:"))
  16.                newb (strcase (getstring "\n新块名:"))
  17.          )
  18.         )
  19.         ((= bn "")
  20.          (setq b0 nil)
  21.          (while        (not b0)
  22.            (initget " ")
  23.            (setq b0 (entsel "\n选取样块:"))
  24.            (cond
  25.              ((= (type b0) 'STR) (setq b0 t))
  26.              ((and
  27.                 (= (type b0) 'LIST)
  28.                 (/= (cdr (assoc 0 (setq b0 (entget (car b0))))) "INSERT")
  29.               )
  30.               (setq b0 nil)
  31.              )
  32.              (t (setq bn (cdr (assoc 2 b0))))
  33.            )
  34.          )
  35.         )
  36.         (t nil)
  37.       )
  38.       (setq len (sslength se1))
  39.       (while (> len 0)
  40.         (setq e0 (ssname se1 0)
  41.               e1 (entget e0)
  42.         )
  43.         (if (and oldb newb)
  44.           (if (= (strcase (cdr (assoc 2 e1))) oldb)
  45.             (setq e1 (subst (cons 2 newb) (assoc 2 e1) e1))
  46.           )
  47.           (setq e1 (subst (cons 2 bn) (assoc 2 e1) e1))
  48.         )
  49.         (entmod e1)
  50.         (entupd e0)
  51.         (ssdel e0 se1)
  52.         (if se1
  53.           (setq len (sslength se1))
  54.         )
  55.       )
  56.     )
  57.   )
  58.   (princ)
  59. )
  60.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-13 14:29:20 | 显示全部楼层
楼上的程序块定义尺寸大小必须一样
如果不一样,可以插入后调整x,y比例即可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-15 00:36:31 | 显示全部楼层
liuyj 兄提供的程序不能达到我的目的,替换后还要重新调整图块的比例才能使图块的大小一致。谁能帮忙写一个可以一步搞定的程序呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-15 10:16:09 | 显示全部楼层
“图块原大小”的含义不明确,比如一个圆的和一个方的块,如何保证图块原大小?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-15 11:11:01 | 显示全部楼层
最初由 xyp1964 发布
[B]“图块原大小”的含义不明确,比如一个圆的和一个方的块,如何保证图块原大小? [/B]

我主要是用于树木图块的替换,都是圆形的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-15 13:53:56 | 显示全部楼层
用vla-GetBoundingBox可以:
类似的看有用不:http://www.xdcad.net/forum/showthread.php?s=&threadid=597610
改动一下就成了:看看是不是你要求的了?

  1. (vl-load-com)
  2. (defun substblk        (newblkname             oldblk    /         box
  3.                  boxmax           boxmin    insp      newblk         newblkname
  4.                  newbox           newmax    newmin    oldblk         scx
  5.                  scy
  6.                 )
  7.   (vla-GetBoundingBox
  8.     (vlax-ename->vla-object oldblk)
  9.     'boxmin
  10.     'boxmax
  11.   )
  12.   (setq        boxmin (vlax-safearray->list boxmin)
  13.         boxmax (vlax-safearray->list boxmax)
  14.         box    (mapcar '- boxmax boxmin)
  15.   )
  16.   (entmake
  17.     (list
  18.       '(0 . "INSERT")
  19.       '(100 . "AcDbEntity")
  20.       '(100 . "AcDbBlockReference")
  21.       (cons 2 newblkname)
  22.       '(10 0.0 0.0 0.0)
  23.       '(41 . 1.0)
  24.       '(42 . 1.0)
  25.       '(43 . 1.0)
  26.     )
  27.   )
  28.   (setq newblk (entlast))
  29.   (vla-GetBoundingBox
  30.     (vlax-ename->vla-object newblk)
  31.     'newmin
  32.     'newmax
  33.   )
  34.   (setq        newmin (vlax-safearray->list newmin)
  35.         newmax (vlax-safearray->list newmax)
  36.         newbox (mapcar '- newmax newmin)
  37.   )
  38.   (setq        scx  (/ (car box) (car newbox))
  39.         scy  (/ (cadr box) (cadr newbox))
  40.         insp (mapcar '- boxmin (mapcar '* newmin (list scx scy 0)))
  41.   )
  42.   (entmod (list        (cons -1 newblk)
  43.                 (cons 10 insp)
  44.                 (cons 41 scx)
  45.                 (cons 42 scy)
  46.           )
  47.   )
  48.   (entdel oldblk)
  49. )
  50. (defun c:test ()
  51.   (cond        ((and
  52.            (setq newblkname (getstring "\n新块名:"))
  53.            (if (tblsearch "block" newblkname)
  54.              t
  55.              (alert "查无此块!")
  56.            )
  57.            (setq ss (ssget '((0 . "insert")))) ;请加入自定过滤
  58.          )
  59.          (setq i -1)
  60.          (repeat
  61.            (sslength ss)
  62.             (setq oldblk (ssname ss (setq i (1+ i))))
  63.             (substblk newblkname oldblk)
  64.          )
  65.         )
  66.   )
  67.   (princ)
  68. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-15 18:20:57 | 显示全部楼层
(setq newblkname (getstring "\n新块名:"))
换为:
(setq newblkname (cdr (assoc 2 (entget (car (entsel))))))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-15 21:26:09 | 显示全部楼层
谢谢 fsxm  兄!很好用,解决了一直以来困扰我的一个问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2006-10-16 13:00:40 | 显示全部楼层
不错的东东。
如果新块带属性,用新块替换旧块时新块的属性好像不见了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-10-16 16:52:54 | 显示全部楼层
还有一个问题要麻烦 fsxm 兄:
对象块被替换后会将生成的对象改变到当前图层,能不能让生成的对象保留在被替换块原来的图层上?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-16 21:07:36 | 显示全部楼层
谢谢eachy老大又送我一分啦
武陵山人斑竹:

  1. (entmod        (list (cons -1 newblk)
  2.               (cons 10 insp)
  3.               (cons 41 scx)
  4.               (cons 42 scy)
  5.         )
  6. )
  7. 改成:
  8. (entmod        (list (cons -1 newblk)
  9.               (assoc 8 (entget oldblk))        ;图层
  10.               (cons 10 insp)
  11.               (cons 41 scx)
  12.               (cons 42 scy)
  13.         )
  14. )
复制代码


dwg001老兄的意见提的好啊~新块带属性的确要烦一点~
我想这样解决吧:
前面的entmake改用command~这样可以在不增加代码基础上加上属性
后面entmod时也不便处理属性
不妨在entmod前在新块基础上再entmake一个无名块
以后就entmod这个无名块好了后再炸开还原为带属性块~
理论上可行性能通过了~现在没时间来写可能要到下星期日
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 16:42 , Processed in 0.438398 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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