找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2358|回复: 16

[求助] [求助]:如何用LISP创建无名块

[复制链接]
发表于 2004-6-25 11:37:33 | 显示全部楼层 |阅读模式

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

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

×
在AUTOCAD使用书籍中经常看到创建无名块,但都没有说明如何创建无名块。当然有不直接的办法可以复制或剪切后粘贴为块,但
复制或剪切时没有基准点,如果用带基点复制后粘贴为块,也比较麻烦,因为粘贴后还要删除以前的。我的意思是:我用LISP实现
在图纸中画线圆等多项操作后,迅速将刚才所作的所有实体变成一个整体例如块的形式在原地方存在,最好是块的形式。我可以将刚才所作的所有实体成为一个选择集,可又怎样变成块呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-6-25 14:22:55 | 显示全部楼层
[php]
;From Joe Burke
;make an anonymous block
;arguments: selection set, insert point, name - typically ""
;source unknown
(defun makeblock (sset baspoint name / i e en blocktype)
  (if sset
    nil
    (setq sset (ssadd))
  )
  (if (or (/= 'STR (type name)) (= "" name))
    (setq name "*A")
  )
  (if (= (substr name 1 1) "*")
    (setq blocktype 1
          name "*A"
    )
    (setq blocktype 0)
  )
  (entmake (append
             '((0 . "BLOCK"))
             (list (cons 2 name))
             (list (cons 70 blocktype))
             (list (cons 10 baspoint))
           )
  )
  (setq i -1)
  (while (setq e (ssname sset (setq i (1+ i))))
    (cond
      ((/= 1 (cdr (assoc 66 (entget e))))
       (if (entget e)
         (progn
           (entmake (entget e '("*")))
           (entdel e)
         )
       )
      )
      ((= 1 (cdr (assoc 66 (entget e))))
       (if (entget e)
         (progn
           (entmake (entget e '("*")))
           (setq en e)
           (while (/= "SEQEND" (cdr (assoc 0 (entget en))))
             (setq en (entnext en))
             (entmake (entget en '("*")))
           )
           (entdel e)
         )
       )
      )
    )
  )
  (setq name (entmake '((0 . "ENDBLK"))))
  (if name
    (progn
      (entmake (append
                 '((0 . "INSERT"))
                 (list (cons 2 name))
                 (list (cons 10 baspoint))
               )
      )
    )
  )
  (if name
    (entlast)
    nil
  )
)                                       
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 19:38:34 | 显示全部楼层
如何插入和炸开无名块呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 21:43:00 | 显示全部楼层
;插入块:
(defun InsertBlock (InsertPt blkname / mspace)
  (vl-load-com)
  (setq        mspace (vla-get-modelspace
                 (vla-get-activedocument (vlax-get-acad-object))
               )
  )
  (vla-insertblock
    mspace
    (vlax-3d-point InsertPt)
    blkname
    1
    1
    1
    0
  )
)
;;;至于炸开,用explode或vla-explode
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 23:15:38 | 显示全部楼层
谢谢了,插入无名块成功,不过原理还是不太清楚,我再研究研究。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 23:33:37 | 显示全部楼层
4楼的插入无名块是用ActiveX方法,和VBA的方法一致,创建无名块用ActiveX方法要好些吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 23:45:42 | 显示全部楼层
vla-insertblock
vla-explode
这类函数在那里可以找到帮助文件,在lisp的帮助文件中找不到该函数?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-25 23:55:51 | 显示全部楼层
对应VBA的对象模型的insertblock、explode方法,看看VBA的帮助
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 08:47:37 | 显示全部楼层
谢谢了,看来我还没有入门,还得好好学习
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-26 11:21:21 | 显示全部楼层
;;;AX创建块,name 为"*U"则为匿名块
[php]
(defun ax:makeblock (sset        baspoint   name              /
                     blkobj        activespace              BlockDef
                     blocks        sArray           idx              doc
                     vla-objects           regen_flag errorsave
                    )
  (setq errorsave *error*)
  (defun *error* (msg)
    (setq *error* errorsave)
  )
;;;;
  (vl-load-com)
  (setq        doc    (vla-get-activedocument (vlax-get-acad-object))
        blocks (vla-get-blocks doc)
  )
  (setq        activespace
         (cond ((= (vla-get-activespace doc) 1) (vla-get-modelspace doc))
               ((= (vla-get-activespace doc) 0) (vla-get-paperspace doc))
         )
  )
  (setq        vla-objects
         '()
        idx -1
        regen_flag
         nil
        self_ref nil
  )
  (repeat (sslength sset)
    (setq vla-objects
           (append vla-objects
                   (list
                     (vlax-ename->vla-object (ssname sset (setq idx (1+ idx))))
                   )
           )
    )
  )
  (if (not (vl-catch-all-error-p
             (vl-catch-all-apply 'vla-item (list blocks name))
           )
      )
    (progn
      (initget 1 "Yes No")
      (if
        (= (getkword
             (strcat "\n" name "已定义。是否重定义? (Yes or No) ")
           )
           "Yes"
        )
         (progn
           (if
             (apply
               'or
               (mapcar
                 '(lambda (x)
                    (and (= (vla-get-objectname x) "AcDbBlockReference")
                         (= (vla-get-name x) name)
                    )
                  )
                 vla-objects
               )
             )
              (progn (princ (strcat "\n" name "自参照。建块失败。"))
                     (exit)
              )
           )
           (setq regen_flag T)
           (setq BlockDef (vla-item blocks name))
           (vlax-for itm BlockDef
             (vla-delete itm)
           )
         )
         (progn
           (princ "\n函数被取消")
           (exit)
         )
      )
    )
  )
  (foreach itm vla-objects
    (vla-move itm
              (vlax-3d-point baspoint)
              (vlax-3d-point '(0 0 0))
    )
  )
  (setq
    blkobj (vla-add blocks (vlax-3d-point '(0 0 0)) name)
    sArray
           (vlax-safearray-fill
             (vlax-make-safearray
               vlax-vbObject
               (cons 0 (1- (length vla-objects)))
             )
             vla-objects
           )
  )
  (vla-copyobjects doc sArray blkobj)
  (mapcar 'vla-delete vla-objects)
  (if regen_flag
    (vla-regen doc acAllViewports)
  )
  (setq *error* errorsave)
  (vla-insertblock
    activespace
    (vlax-3d-point baspoint)
    (vla-get-name blkobj)
    1
    1
    1
    0
  )
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-5 14:00:52 | 显示全部楼层
4樓你的程序怎麼不舉個例,我不會vl所以不會用看不懂InsertPt   blkname 這兩個參數.請教.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-5 14:29:31 | 显示全部楼层
If you have a block call "*U1" in your drawing, then

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

使用道具 举报

发表于 2004-7-5 18:37:11 | 显示全部楼层
看到这些东西
才知道自己太贫乏了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-12-12 00:47:57 | 显示全部楼层
10楼的这个程序在布局中的视口内运行会出错!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-13 07:59:54 | 显示全部楼层
无名块搞不懂,不过可以生成随机名字的块。

  1.   [FONT=courier new]
  2. ;;; ==================================================================
  3. ;;; 方法一:用command的方法,
  4. (defun th-rnd-block (ss pt / blk name)
  5.   (setq blk t)
  6.   (while blk
  7.     (if (null (tblobjname "block" (setq name (rtos (txt-rnd)))))
  8.       (progn
  9.         (command "-block" name pt ss "")
  10.         (setq blk nil)
  11.       )
  12.     )
  13.   )
  14.   (command "-insert" name pt "" "" "")
  15.   (princ)
  16. )
  17. ;;; ==================================================================
  18. (defun txt-rnd ()                       ; 随机数种子
  19.   (* (rem (getvar "cputicks") 1e3) 1e-3)
  20. )
  21. ;;; ==================================================================
  22. ;;; 方法二:用vla方法,
  23. (defun hao-rnd-block (ss pt / blk name)
  24.   (setq blk t)
  25.   (while blk
  26.     (if (null (tblobjname "block" (setq name (rtos (txt-rnd)))))
  27.       (progn
  28.         (th-ss2blk ss pt name)
  29.         (setq blk nil)
  30.       )
  31.     )
  32.   )
  33. )
  34. ;;; ==================================================================
  35. (defun th-ss2blk (selset inspoint blkname / array block index objlstofss ss)
  36.   (setq block (vla-add (vla-get-blocks (thactdoc)) (vlax-3d-point inspoint)
  37.                        blkname
  38.               )
  39.         objlstofss (hao-ss2objlst selset)
  40.         index (1- (sslength selset))
  41.         array (vlax-safearray-fill (vlax-make-safearray vlax-vbobject
  42.                                                         (cons 0 index)
  43.                                    ) objlstofss
  44.               )
  45.   )
  46.   (vla-copyobjects (thactdoc) array block)
  47.   (mapcar
  48.     'vla-delete
  49.     objlstofss
  50.   )
  51.   (vla-insertblock (thactsp) (vlax-3d-point inspoint) (vla-get-name block) 1
  52.                    1 1 0
  53.   )
  54. )
  55. (defun hao-ss2blk (selset inspoint blkname / array block index objlstofss)
  56.   (setq block (vla-add (vla-get-blocks (thactdoc)) (vlax-3d-point inspoint)
  57.                        blkname
  58.               )
  59.         objlstofss (hao-ss2objlst selset)
  60.         index (1- (sslength selset))
  61.         array (vlax-make-safearray vlax-vbobject (cons 0 index))
  62.   )
  63.   (foreach each objlstofss
  64.     (vlax-safearray-put-element array index each)
  65.     (setq index (1- index))
  66.   )
  67.   (vla-copyobjects (thactdoc) array block)
  68.   (mapcar
  69.     'vla-delete
  70.     objlstofss
  71.   )
  72.   (vla-insertblock (thactsp) (vlax-3d-point inspoint) (vla-get-name block) 1
  73.                    1 1 0
  74.   )
  75. )
  76. ;;; ==================================================================
  77. (defun thacadobj ()
  78.   (cond
  79.     (%$*thacadobj*$%)
  80.     (setq %$*thacadobj*$% (vlax-get-acad-object))
  81.   )
  82. )
  83. (defun thactdoc ()
  84.   (cond
  85.     (%$*thactdoc*$%)
  86.     (setq %$*thactdoc*$% (vla-get-activedocument (thacadobj)))
  87.   )
  88. )
  89. (defun thmodsp ()
  90.   (cond
  91.     (%$*thmodsp*$%)
  92.     (setq %$*thmodsp*$% (vla-get-modelspace (thactdoc)))
  93.   )
  94. )
  95. (defun thpapsp ()
  96.   (cond
  97.     (%$*thpapsp*$%)
  98.     (setq %$*thpapsp*$% (vla-get-paperspace (thactdoc)))
  99.   )
  100. )
  101. (defun thactsp ()
  102.   (if (= 1 (vla-get-activespace (thactdoc)))
  103.     (thmodsp)
  104.     (thpapsp)
  105.   )
  106. )
  107. ;;; ==================================================================

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 10:34 , Processed in 0.511884 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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