找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2273|回复: 10

[分享]:选择集转块方法收集

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2009-2-14 11:25:45 | 显示全部楼层 |阅读模式

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

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

×

  1.   [FONT=courier new]

  2. ;;; 选择集转块的方法
  3. ;;; ==================================================================
  4. ;;; 以下两个为俺在国外的网站上找到的,具体地址不记得了.
  5. (defun th-ss2blk
  6.        (selset inspoint blkname / array block index objlstofss ss)
  7.   (setq        block           (vla-add (vla-get-blocks (thactdoc))
  8.                             (vlax-3d-point inspoint)
  9.                             blkname
  10.                    )
  11.         objlstofss (hao-ss2objlst selset)
  12.         index           (1- (sslength selset))
  13.         array           (vlax-safearray-fill
  14.                      (vlax-make-safearray
  15.                        vlax-vbobject
  16.                        (cons 0 index)
  17.                      )
  18.                      objlstofss
  19.                    )
  20.   )
  21.   (vla-copyobjects (thactdoc) array block)
  22.   (mapcar
  23.     'vla-delete
  24.     objlstofss
  25.   )
  26.   (vla-insertblock
  27.     (thactsp)
  28.     (vlax-3d-point inspoint)
  29.     (vla-get-name block)
  30.     1
  31.     1
  32.     1
  33.     0
  34.   )
  35. )
  36. (defun hao-ss2blk
  37.        (selset inspoint blkname / array block index objlstofss)
  38.   (setq        block           (vla-add (vla-get-blocks (thactdoc))
  39.                             (vlax-3d-point inspoint)
  40.                             blkname
  41.                    )
  42.         objlstofss (hao-ss2objlst selset)
  43.         index           (1- (sslength selset))
  44.         array           (vlax-make-safearray vlax-vbobject (cons 0 index))
  45.   )
  46.   (foreach each        objlstofss
  47.     (vlax-safearray-put-element array index each)
  48.     (setq index (1- index))
  49.   )
  50.   (vla-copyobjects (thactdoc) array block)
  51.   (mapcar
  52.     'vla-delete
  53.     objlstofss
  54.   )
  55.   (vla-insertblock
  56.     (thactsp)
  57.     (vlax-3d-point inspoint)
  58.     (vla-get-name block)
  59.     1
  60.     1
  61.     1
  62.     0
  63.   )
  64. )
  65. (defun t2-ss2blk (ss pt bn)
  66.   (entmake
  67.     (list (cons 0 "BLOCK") (cons 10 pt) (cons 2 bn) '(70 . 0))
  68.   )
  69.   (foreach each        (hao-ss2lst ss)
  70.     (setq elist (entget each))
  71.     (entmake elist)
  72.   )
  73.   (entmake (list (cons 0 "ENDBLK")))
  74.   (entmake (list (cons 0 "INSERT") (cons 2 bn) (cons 10 pt)))
  75.   (command "_.ERASE" ss "")
  76.   (redraw)
  77.   (princ)
  78. )
  79. ;;; ==================================================================
  80. ;;; 选择集转随机名的块
  81. (defun th-rnd-block (ss pt / blk name)
  82.   (setq blk t)
  83.   (while blk
  84.     (if        (null (tblobjname "block" (setq name (rtos (th-rnd)))))
  85.       (progn
  86.         (command "-block" name "non" pt ss "")
  87.         (setq blk nil)
  88.       )
  89.     )
  90.   )
  91.   (command "-insert" name pt "" "" "")
  92.   (princ)
  93. )
  94. (defun hao-rnd-block (ss pt / blk name)
  95.   (setq blk t)
  96.   (while blk
  97.     (if        (null (tblobjname "block" (setq name (rtos (th-rnd)))))
  98.       (progn
  99.         (th-ss2blk ss pt name)
  100.         (setq blk nil)
  101.       )
  102.     )
  103.   )
  104. )
  105. (defun t2-rnd-block (ss pt)
  106.   (vl-cmdf "cutclip" ss "")
  107.   (vl-cmdf "pasteblock" "non" pt)
  108.   (princ)
  109. )
  110. ;;; 这个与上面两个不同,pt需为ss最小包围角左下角时,生成的块位置才与ss重合
  111. ;;; ==================================================================
  112. ;;; [url]http://www.xdcad.net/forum/showthread.php?s=&threadid=456502[/url]
  113. ;;; 上面的链接为eachy版主的块制函数,俺改了一下,不知道对不,目前测试可用.
  114. ;;; 制作做块头
  115. (defun th-mkblk        (blockname pt / blocktype)
  116.   (if (or
  117.         (/= 'str (type blockname))
  118.         (= "" blockname)
  119.       )
  120.     (setq blockname "*A")
  121.   )
  122.   (if (= (substr blockname 1 1) "*")
  123.     (setq blocktype 1
  124.           blockname "*A"
  125.     )
  126.     (setq blocktype 0)
  127.   )
  128.   (entmake (list '(0 . "BLOCK")
  129.                  (cons 2 blockname)
  130.                  (cons 70 blocktype)
  131.                  (cons 10 pt)
  132.            )
  133.   )
  134. )
  135. ;;; 做块尾
  136. (defun th-mkeblk ()
  137.   (entmake '((0 . "ENDBLK")))
  138. )
  139. ;;; 插入图块
  140. (defun th-mkinsert (bname ins-pt)
  141.   (entmakex
  142.     (list '(0 . "INSERT") (cons 2 bname) (cons 10 ins-pt))
  143.   )
  144. )
  145. ;;; 在此基础上,再生成一个函数
  146. (defun th-block        (bn pt lambda-expression)
  147.   (th-mkblk bn pt)
  148.   (lambda-expression)
  149.   (setq bn (th-mkeblk))
  150.   (th-mkinsert bn pt)
  151. )
  152. ;;; ==================================================================

  153.   [/FONT]
相关公共函数

  1.   [FONT=courier new]
  2. ;;; ==================================================================
  3. ;;; 子函数
  4. (defun hao-ss2lst (ss / n l)
  5.   (if (and
  6.         ss
  7.         (< 0 (sslength ss))
  8.       )
  9.     (repeat (setq n (sslength ss))
  10.       (setq n (1- n)
  11.             l (cons (ssname ss n) l)
  12.       )
  13.     )
  14.   )
  15. )
  16. (defun hao-ss2objlst (ss / n l)
  17.   (if (and
  18.         ss
  19.         (< 0 (sslength ss))
  20.       )
  21.     (repeat (setq n (sslength ss))
  22.       (setq n (1- n)
  23.             l (cons (vlax-ename->vla-object (ssname ss n)) l)
  24.       )
  25.     )
  26.   )
  27. )
  28. (defun thacadobj ()
  29.   (cond
  30.     (%$*thacadobj*$%)
  31.     (setq %$*thacadobj*$% (vlax-get-acad-object))
  32.   )
  33. )
  34. (defun thactdoc ()
  35.   (cond
  36.     (%$*thactdoc*$%)
  37.     (setq %$*thactdoc*$% (vla-get-activedocument (thacadobj)))
  38.   )
  39. )
  40. (defun th-rnd ()
  41.   (* (rem (* (getvar "cputicks") (getvar "millisecs")) 1e8) 1e-8)
  42. )
  43. (defun hao-ss-aftere (ename / ss)
  44.   (if (and
  45.         ename
  46.         (setq ss (ssadd))
  47.         (eq 'ename (type ename))
  48.       )
  49.     (while (setq ename (entnext ename))
  50.       (ssadd ename ss)
  51.     )
  52.     (setq ss (ssget "x"))
  53.   )
  54.   ss
  55. )
  56. ;;; ==================================================================
  57.   [/FONT]

应用

  1.   [FONT=courier new]
  2. ;;; ==================================================================
  3. (defun c:test1 (/ elist ss)
  4.   (th-block "th"
  5.             (getpoint "\nPick point:")
  6.             (lambda ()
  7.               (setq ss (ssget))
  8.               (foreach each
  9.                             (hao-ss2lst ss)
  10.                 (setq elist (entget each))
  11.                 (entmake elist)
  12.               )
  13.             )
  14.   )
  15. )
  16. (defun c:test2 ( / elist laste pt ss)
  17.   (th-block ""
  18.             (getpoint "\nPick point:")
  19.             (lambda ()
  20.               (setq laste (entlast))
  21.               (command "line"
  22.                        (getpoint "\nPick point:")
  23.                        (getpoint "\nPick next point:")
  24.                        ""
  25.               )
  26.               (command "circle"
  27.                        (getpoint "\nPick point:")
  28.                        5
  29.               )
  30.               (command "line"
  31.                        (getpoint "\nPick point:")
  32.                        (getpoint "\nPick next point:")
  33.                        ""
  34.               )
  35.               (command "circle"
  36.                        (setq pt(getpoint "\nPick point:"))
  37.                        (getdist pt "\nPick next poiont:")
  38.               )
  39.               (setq ss (hao-ss-aftere laste))
  40.               (foreach each
  41.                             (hao-ss2lst ss)
  42.                 (setq elist (entget each))
  43.                 (entmake elist)
  44.               )
  45.               (command "erase" ss "")
  46.             )
  47.   )
  48. )
  49. ;;; ==================================================================
  50.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-2-14 11:40:36 | 显示全部楼层
谢谢taner分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-14 15:08:01 | 显示全部楼层
最简单的 ctrl+<shift>+c, ctrl+v
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-14 18:26:39 | 显示全部楼层
老外真能整,整出这么长的代码来......
俺都没耐心看下去......3楼说的多好!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-14 19:36:00 | 显示全部楼层
  1. [FONT=courier new]
  2. ;; 建立随机名图块
  3. (defun Rand-Block (ss point / x)
  4.   (setq x (rtos (* (getvar "cdate") 1000000) 2 0))
  5.   (command "_block" x "non" point ss "")
  6.   (command "_insert" x "non" point "" "" "")
  7. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-14 19:39:05 | 显示全部楼层
  1. [FONT=courier new];; 建立图块
  2. (defun Rand-Block (bname ss point  / x)
  3.   (command "_block" bname "non" point ss "")
  4.   (command "_insert" bname "non" point "" "" "")
  5. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-14 22:40:37 | 显示全部楼层
xyp1964
为什么对你的函数加载时总是显示“错误: 参数太少”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 244个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

发表于 2022-7-14 10:06:53 | 显示全部楼层
感谢分享源码和讨论
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 09:14 , Processed in 0.218595 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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