找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1095|回复: 3

[转贴]:块操作类函数。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-5-20 02:21:32 | 显示全部楼层 |阅读模式

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

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

×

  1. ;;; By Jimmy Bergmark
  2. ;;; Copyright (C) 1997-2003 JTB World, All Rights Reserved
  3. ;;; Website: [url]www.jtbworld.com[/url] / [url]http://jtbworld.vze.com[/url]
  4. ;;; E-mail: [email]info@jtbworld.com[/email] / [email]jtbworld@hotmail.com[/email]
  5. ;;;
  6. ;;; Updated: 2003-02-24
  7. ;;;

  8. ;;; (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))

  9. ;;; Erases all blocks named "revtext2"
  10. ;;; (ax:EraseBlock doc "revtext2")
  11. (defun ax:EraseBlock (doc bn / layout i)
  12.   (vlax-for layout (vla-get-layouts doc)
  13.     (vlax-for i (vla-get-block layout)
  14.       (if (and
  15.             (= (vla-get-objectname i) "AcDbBlockReference")
  16.             (= (strcase (vla-get-name i)) (strcase bn))
  17.           )
  18.         (vla-Delete i)
  19.       )
  20.     )
  21.   )
  22. )

  23. ;;; Test if block named "revtext2" exist
  24. ;;; (ax:ExistBlock doc "revtext2")
  25. (defun ax:ExistBlock (doc bn / layout i exist)
  26.   (setq exist nil)
  27.   (vlax-for layout (vla-get-layouts doc)
  28.     (vlax-for i (vla-get-block layout)
  29.       (if (and
  30.             (= (vla-get-objectname i) "AcDbBlockReference")
  31.             (= (strcase (vla-get-name i)) (strcase bn))
  32.           )
  33.         (setq exist T)
  34.       )
  35.     )
  36.   )
  37.   exist
  38. )

  39. ;;; Rename block from "revtext" to "revtext1"
  40. ;;; (ax:RenameBlock doc "revtext" "revtext1")
  41. (defun ax:RenameBlock (doc bn nn / layout i)
  42.   (vlax-for layout (vla-get-layouts doc)
  43.     (vlax-for i (vla-get-block layout)
  44.       (if (and
  45.             (= (vla-get-objectname i) "AcDbBlockReference")
  46.             (= (strcase (vla-get-name i)) (strcase bn))
  47.           )
  48.         (vla-put-name i nn)
  49.       )
  50.     )
  51.   )
  52. )

  53. ;;; a list of all block names
  54. ;;; return example ("*D5" "A$C263E5435" "b2" "b1")
  55. (defun ax:blocks (/ b bn tl)
  56.   (vlax-for b (vla-get-blocks
  57.                 (vla-get-ActiveDocument (vlax-get-acad-object))
  58.               )
  59.     (if (= (vla-get-islayout b) :vlax-false)
  60.       (setq tl (cons (vla-get-name b) tl))
  61.     )
  62.   )
  63.   (reverse tl)
  64. )

  65. ;;; a list of all xref names
  66. ;;; return example ("xref1" "x2")
  67. (defun ax:xrefs (/ b bn tl)
  68.   (vlax-for b (vla-get-blocks
  69.                 (vla-get-ActiveDocument (vlax-get-acad-object))
  70.               )
  71.     (if (= (vla-get-isxref b) :vlax-true)
  72.       (setq tl (cons (vla-get-name b) tl))
  73.     )
  74.   )
  75.   (reverse tl)
  76. )

  77. ;;; Returns a list with references to a given block
  78. ;;; (blockrefs )
  79. ;;; example: (blockrefs "b1")
  80. ;;; return: ( )
  81. ;;; tip: if return is nil it's not inserted
  82. (defun blockrefs (bn / lst ed)
  83.   (if (setq ed (tblobjname "block" bn))
  84.     (setq
  85.       lst (entget
  86.             (cdr (assoc 330 (entget ed)))
  87.           )
  88.     )
  89.   )
  90.   (apply
  91.     'append
  92.     (mapcar '(lambda (x)
  93.                (list (cdr x))
  94.              )
  95.             (cdr (reverse (cdr (member (assoc 102 lst) lst))))
  96.     )
  97.   )
  98. )

  99. ;;; Returns a list containing every reference to a given block
  100. ;;; Arguments: a string identifying the block to search for
  101. (defun listblockrefs (blkName / lst)
  102.   (setq        lst (entget
  103.               (cdr (assoc 330 (entget (tblobjname "block" blkName))))
  104.             )
  105.   )
  106.   (apply
  107.     'append
  108.     (mapcar '(lambda (x)
  109.                (if (entget (cdr x))
  110.                  (list (cdr x))
  111.                )
  112.              )
  113.             (cdr (reverse (cdr (member (assoc 102 lst) lst))))
  114.     )
  115.   )
  116. )

  117. ;;; Returns a list containing the entity names of block definitions that reference a given block
  118. ;;; Arguments: a string identifying the block to search for
  119. (defun ax:GetParentBlocks (blkName / doc)
  120.   (vl-load-com)
  121.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  122.   (apply
  123.     'append
  124.     (mapcar '(lambda (x)
  125.                (if (= :vlax-false
  126.                       (vla-get-IsLayout
  127.                         (vla-ObjectIdToObject
  128.                           doc
  129.                           (vla-get-OwnerId (vlax-ename->vla-object x))
  130.                         )
  131.                       )
  132.                    )
  133.                  (list x)
  134.                )
  135.              )
  136.             (listblockrefs blkName)
  137.     )
  138.   )
  139. )

  140. ;;; Deletes the specified subentity from its block definition
  141. ;;; Arguments: the entity name of an item within a block reference
  142. ;;; Returns: the remaining item count of the block definition
  143. ;;; The drawing must be regenerated for the change to become visible
  144. (defun ax:DeleteObjectFromBlock        (ent / doc blk)
  145.   (setq        doc (vla-get-ActiveDocument (vlax-get-acad-object))
  146.         ent (vlax-ename->vla-object ent)
  147.         blk (vla-ObjectIdToObject doc (vla-get-OwnerID ent))
  148.   )
  149.   (vla-Delete ent)
  150.   (vla-get-Count blk)
  151. )

  152. ;;; Adds the specified item to a given block definition
  153. ;;; Arguments: the entity name of a block reference
  154. ;;;            a selection set containing the objects to add
  155. ;;; Returns: nil
  156. ;;; The drawing must be regenerated for the change to become visible
  157. (defun ax:AddObjectsToBlock (blk ss / doc blkref blkdef inspt refpt)
  158.   (setq        doc        (vla-get-ActiveDocument (vlax-get-acad-object))
  159.         blkref        (vlax-ename->vla-object blk)
  160.         blkdef        (vla-Item (vla-get-Blocks doc) (vla-get-Name blkref))
  161.         inspt        (vlax-variant-value (vla-get-InsertionPoint blkref))
  162.         ssarray        (selectionset->array ss)
  163.         refpt        (vlax-3d-point '(0 0 0))
  164.   )
  165.   (foreach ent (vlax-safearray->list ssarray)
  166.     (vla-Move ent inspt refpt)
  167.   )
  168.   (vla-CopyObjects doc ssarray blkdef)
  169.   (foreach ent (vlax-safearray->list ssarray)
  170.     (vla-Delete ent)
  171.   )
  172.   (princ)
  173. )

  174. ;;; Utility routine to convert a selection set to an ActiveX array
  175. (defun selectionset->array (ss / c r)
  176.   (vl-load-com)
  177.   (setq c -1)
  178.   (repeat (sslength ss)
  179.     (setq r (cons (ssname ss (setq c (1+ c))) r))
  180.   )
  181.   (setq r (reverse r))
  182.   (vlax-safearray-fill
  183.     (vlax-make-safearray
  184.       vlax-vbObject
  185.       (cons 0 (1- (length r)))
  186.     )
  187.     (mapcar 'vlax-ename->vla-object r)
  188.   )
  189. )

  190. ;;; (ax:GetTagTextString doc "sheet-text" "client-drw")
  191. (defun ax:GetTagTextString (doc bn tagname / layout i atts tag str)
  192.   (vlax-for layout (vla-get-layouts doc)
  193.     (vlax-for i (vla-get-block layout)
  194.       (if (and
  195.             (= (vla-get-objectname i) "AcDbBlockReference")
  196.             (= (strcase (vla-get-name i)) (strcase bn))
  197.           )
  198.         (if (and
  199.               (= (vla-get-hasattributes i) :vlax-true)
  200.               (safearray-value
  201.                 (setq atts
  202.                        (vlax-variant-value
  203.                          (vla-getattributes i)
  204.                        )
  205.                 )
  206.               )
  207.             )   
  208.           (foreach tag (vlax-safearray->list atts)
  209.             (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  210.               (setq str (vla-get-TextString tag))
  211.             )
  212.           )
  213.         )
  214.       )
  215.     )
  216.   )
  217.   str
  218. )

  219. ;;; (ax:FindBlockTagValue (vla-get-activedocument (vlax-get-acad-object)) "blockname" "tagname" "tagvalue")
  220. (defun ax:FindBlockTagValue
  221.        (doc bn tagname value / layout i atts tag sset c)
  222.   (vlax-for layout (vla-get-layouts doc)
  223.     (vlax-for i (vla-get-block layout)
  224.       (if (and
  225.             (= (vla-get-objectname i) "AcDbBlockReference")
  226.             (= (strcase (vla-get-name i)) (strcase bn))
  227.           )
  228.         (if (and
  229.               (= (vla-get-hasattributes i) :vlax-true)
  230.               (safearray-value
  231.                 (setq atts
  232.                        (vlax-variant-value
  233.                          (vla-getattributes i)
  234.                        )
  235.                 )
  236.               )
  237.             )
  238.           (progn
  239.             (foreach tag (vlax-safearray->list atts)
  240.               (if (and
  241.                     (= (strcase tagname)
  242.                        (strcase (vla-get-TagString tag))
  243.                     )
  244.                     (= value (vla-get-TextString tag))
  245.                   )
  246.                 (progn
  247.                   (if (not sset)
  248.                     (setq sset (ssadd (vlax-vla-object->ename i)))
  249.                     (ssadd (vlax-vla-object->ename i) sset)
  250.                   )
  251.                 )
  252.               )
  253.             )
  254.           )
  255.         )
  256.       )
  257.     )
  258.   )
  259.   (sssetfirst nil sset)
  260. )

  261. ;;; list of all "REV-NO" in block "revtext1" in order of y-coordinate, bottom to up
  262. ;;; (ax:GetManyTags "revtext1" "REV-NO")
  263. (defun ax:GetManyTags (bn tag / ax lst)
  264.   (foreach x (ax:ListBlockIns doc bn)
  265.     (setq lst (cons (ax:GetTagTextStringByRef (cadddr x) tag) lst))
  266.   )
  267.   (reverse lst)
  268. )

  269. ;;; list of all "REV-NO" in block "revtext2" in order of y-coordinate, bottom to up
  270. ;;; (ax:SetManyTags "revtext2" "revtext1" "REV-NO" "REV-NO")
  271. (defun ax:SetManyTags (bn-to bn-from tag-to tag-from / ax lst i)
  272.   (setq lst (ax:GetManyTags bn-from tag-from))
  273.   (setq i 0)
  274.   (foreach x (ax:ListBlockIns doc bn-to)
  275.     (ax:PutTagTextStringByRef (cadddr x) tag-to (nth i lst))
  276.     (setq i (1+ i))
  277.   )
  278. )

  279. ;;; (ax:GetTagTextStringByRef # "REV-NO")
  280. (defun ax:GetTagTextStringByRef (br tagname / atts tag str)
  281.   (if (and
  282.         (= (vla-get-hasattributes br) :vlax-true)
  283.         (safearray-value
  284.           (setq atts
  285.                  (vlax-variant-value
  286.                    (vla-getattributes br)
  287.                  )
  288.           )
  289.         )
  290.       )
  291.     (foreach tag (vlax-safearray->list atts)
  292.       (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  293.         (setq str (vla-get-TextString tag))
  294.       )
  295.     )
  296.   )
  297.   str
  298. )

  299. ;;; (ax:PutTagTextString doc "sheet-text" "client-drw" "new value")
  300. (defun ax:PutTagTextString (doc bn tagname textstring / layout i atts tag)
  301.   (vlax-for layout (vla-get-layouts doc)
  302.     (vlax-for i (vla-get-block layout)
  303.       (if (and
  304.             (= (vla-get-objectname i) "AcDbBlockReference")
  305.             (= (strcase (vla-get-name i)) (strcase bn))
  306.           )
  307.         (if (and
  308.               (= (vla-get-hasattributes i) :vlax-true)
  309.               (safearray-value
  310.                 (setq atts
  311.                        (vlax-variant-value
  312.                          (vla-getattributes i)
  313.                        )
  314.                 )
  315.               )
  316.             )   
  317.           (foreach tag (vlax-safearray->list atts)
  318.             (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  319.               (vla-put-TextString tag textstring)
  320.             )
  321.           )
  322.           (vla-update i)
  323.         )
  324.       )
  325.     )
  326.   )
  327. )

  328. ;;; (ax:PutTagTextStringByRef # "REV-NO" "new value")
  329. (defun ax:PutTagTextStringByRef (br tagname textstring / atts tag)
  330.   (if (and
  331.         (= (vla-get-hasattributes br) :vlax-true)
  332.         (safearray-value
  333.           (setq atts
  334.                  (vlax-variant-value
  335.                    (vla-getattributes br)
  336.                  )
  337.           )
  338.         )
  339.       )
  340.     (foreach tag (vlax-safearray->list atts)
  341.       (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  342.         (vla-put-TextString tag textstring)
  343.       )
  344.     )
  345.     (vla-update br)
  346.   )
  347. )

  348. ;;; (ax:ChangeTagHeight    )
  349. ;;; (ax:ChangeTagHeight doc "sheet-text" "client-drw" 0.97)
  350. (defun ax:ChangeTagHeight (doc bn tagname tagheight / layout i atts tag)
  351.   (vlax-for layout (vla-get-layouts doc)
  352.     (vlax-for i (vla-get-block layout)
  353.       (if (and
  354.             (= (vla-get-objectname i) "AcDbBlockReference")
  355.             (= (strcase (vla-get-name i)) (strcase bn))
  356.           )
  357.         (if (and
  358.               (= (vla-get-hasattributes i) :vlax-true)
  359.               (safearray-value
  360.               (setq atts
  361.                      (vlax-variant-value
  362.                        (vla-getattributes i)
  363.                      )
  364.               )
  365.             )
  366.              )   
  367.           (foreach tag (vlax-safearray->list atts)
  368.             (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  369.               (vla-put-height tag tagheight)
  370.             )
  371.           )
  372.           (vla-update i)
  373.         )
  374.       )
  375.     )
  376.   )
  377. )

  378. ;;; List the insertion point and reference of a block in active layout
  379. ;;; sort them by y-value
  380. ;;; (ax:ListBlockIns doc "revtext1")
  381. ;;; return value example:
  382. ;;; ((341.385 29.2937 0.0 #)
  383. ;;;  (341.385 34.2937 0.0 #)
  384. ;;;  (341.385 39.2937 0.0 #))
  385. (defun ax:ListBlockIns (doc bn / layout i pl)
  386.   (vlax-for layout (vla-get-layouts doc)
  387.     (vlax-for i (vla-get-block layout)
  388.       (if (and
  389.             (= (vla-get-objectname i) "AcDbBlockReference")
  390.             (= (strcase (vla-get-name i)) (strcase bn))
  391.           )
  392.         (setq pl
  393.                (cons
  394.                  (append (safearray-value
  395.                            (vlax-variant-value (vla-get-InsertionPoint i))
  396.                          )
  397.                          (list i)
  398.                  )
  399.                  pl
  400.                )
  401.         )
  402.       )
  403.     )
  404.   )
  405.   ; sort by y-value
  406.   (vl-sort pl
  407.              (function (lambda (e1 e2)
  408.                          (< (cadr e1) (cadr e2)) ) ) )
  409. )

  410. ;;; Changes the insertion point of a tag
  411. ;;; (ax:ChangeTagIns doc "sheet-text" "a3-scale" '(703.4722 17.8350 0))
  412. (defun ax:ChangeTagIns (doc bn tagname ins / layout i atts tag)
  413.   (defun list->variantArray (ptsList / arraySpace sArray)
  414.     (setq arraySpace
  415.       (vlax-make-safearray
  416.         vlax-vbdouble
  417.         (cons 0 (- (length ptsList) 1))
  418.       )
  419.     )
  420.     (setq sArray (vlax-safearray-fill arraySpace ptsList))
  421.     (vlax-make-variant sArray)
  422.   )
  423.   (vlax-for layout (vla-get-layouts doc)
  424.     (vlax-for i (vla-get-block layout)
  425.       (if (and
  426.             (= (vla-get-objectname i) "AcDbBlockReference")
  427.             (= (strcase (vla-get-name i)) (strcase bn))
  428.           )
  429.         (if (and
  430.               (= (vla-get-hasattributes i) :vlax-true)
  431.               (safearray-value
  432.               (setq atts
  433.                      (vlax-variant-value
  434.                        (vla-getattributes i)
  435.                      )
  436.               )
  437.             )
  438.              )   
  439.           (foreach tag (vlax-safearray->list atts)
  440.             (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  441.               (vla-put-InsertionPoint tag (list->variantArray ins))
  442.             )
  443.           )
  444.           (vla-update i)
  445.         )
  446.       )
  447.     )
  448.   )
  449. )

  450. ;;; Changes attributes on all block references matching
  451. ;;; (ChangeAttributes (list  '( . ) ...))
  452. ;;; (ChangeAttributes (list "testblock" '("TESTTAG2" . "item1") '("NEWTAG" . "tagvalue")))
  453. (defun ChangeAttributes (lst / sset item atts ename i)
  454.   (setq i 0)
  455.   (setq sset (ssget "X" (list '(0 . "INSERT") (cons 2 (car lst)))))
  456.   (if sset
  457.     (repeat (sslength sset)
  458.       (setq ename (ssname sset i))
  459.       (setq i (+ 1 i))
  460.       (if (safearray-value
  461.             (setq atts
  462.                    (vlax-variant-value
  463.                      (vla-getattributes (vlax-ename->vla-object ename))
  464.                    )
  465.             )
  466.           )
  467.         (progn
  468.           (foreach item (cdr lst)
  469.             (mapcar
  470.               '(lambda (x)
  471.                  (if
  472.                    (= (strcase (car item))
  473.                       (strcase (vla-get-tagstring x))
  474.                    )
  475.                     (vla-put-textstring x (cdr item))
  476.                  )
  477.                )
  478.               (vlax-safearray->list atts)
  479.             )
  480.           )
  481.           (vla-update (vlax-ename->vla-object ename))
  482.         )
  483.       )
  484.     )
  485.   )
  486. )

  487. ;;; (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  488. ;;; (ax:ChangeTagWidth    )
  489. ;;; (ax:ChangeTagWidth doc "panel1" "drw-no" 0.97)
  490. (defun ax:ChangeTagWidth (doc bn tagname tagwidth / layout i atts tag)
  491.   (vlax-for layout (vla-get-layouts doc)
  492.     (vlax-for i (vla-get-block layout)
  493.       (if (and
  494.             (= (vla-get-objectname i) "AcDbBlockReference")
  495.             (= (strcase (vla-get-name i)) (strcase bn))
  496.           )
  497.         (if (and
  498.               (= (vla-get-hasattributes i) :vlax-true)
  499.               (safearray-value
  500.               (setq atts
  501.                      (vlax-variant-value
  502.                        (vla-getattributes i)
  503.                      )
  504.               )
  505.             )
  506.              )   
  507.           (foreach tag (vlax-safearray->list atts)
  508.             (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  509.               (vla-put-scalefactor tag tagwidth)
  510.             )
  511.           )
  512.           (vla-update i)
  513.         )
  514.       )
  515.     )
  516.   )
  517. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-2-17 23:40:05 | 显示全部楼层
作何用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-3-27 09:12:43 | 显示全部楼层
真的很好,我一直找了很长时间,这个非常全面,作为资料也好,学习也好.特别是E文不是很好的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-30 09:18:51 | 显示全部楼层
简直不知楼上在说什么,明显的套话骗分。"为资料也好,学习也好.特别是E文不是很好的",这也说的出!  那段代码有一个不是E文么???!!!

感觉确是很好的东西,但逐段分析代码太累了,又没有注释。有没有使用说明,有也是"E文"。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-18 22:49 , Processed in 0.432871 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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