明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: userzhl

[求助]可不可以把属性块里的"提示"作为过滤条件对图块进行选择呢?

  [复制链接]
 楼主| 发表于 2009-5-19 20:03:00 | 显示全部楼层

;;利用属性块中的提示选择块
;;(setq FILTER (JW_ATT "test"))
;;(setq SS (ssget (list (cons 0 "INSERT") (cons 2 FILTER))))
(defun JW_ATT (str / BLK_NA FILTER)
;;By carrot1983 2009-05-18
(setq FILTER "")
(vlax-for BLK (vla-get-blocks
  (vla-get-activedocument (vlax-get-acad-object))
  )
(vlax-for X BLK
(if (and (= (vla-get-objectname X) "AcDbAttributeDefinition")
  (wcmatch (vla-get-promptstring X)
   str
  ) ;_支持模糊匹配
  (setq BLK_NA (vla-get-name BLK))
 )
 (setq FILTER (strcat "`" BLK_NA "," FILTER)) ;_`匿名块用到
)
)
)
(if (= FILTER "")
NIL
FILTER
)
)
;有很多这样的块,提示有“标高_1:10”、“标高_1:20”“标高_1:40”“标高_1:50”“标高_1:100”“标高_1:150”“标高_1:200”
;需要批量进行处理
;下面这个程序可以完成,要搜索图中所有的块,然后才进行判断,文件大一点的话太慢了。
;请教如何改成:只对所选的块进行判断?
(defun C:TT ( / edat edat1 en filter in_sc1 ins ins_e insc n n_in2 scal ss_bg promptstring)
(princ
    "\n把属性块里的(提示)作为过滤条件对图块进行选择 By carrot1983 REV2009-05-19"
  )
(setq ss (ssget '((0 . "INSERT"))))
(SETQ scal 50)
(if (/= nil (setq FILTER (JW_ATT (strcat "标高*"))))
(progn
(vl-cmdf "select" ss "")
(setq ss_bg (ssget "p" (list (cons 0 "INSERT") (cons 2 FILTER))))
(repeat (setq n (sslength ss_bg))
(setq edat1 (ssname ss_bg (setq n (1- n)))
 edat (tblobjname "BLOCK" (cdr (assoc 2 (setq INS_e (entget edat1)))))
)
(while (and edat (setq en (entget edat)))
    (if (= "ATTDEF" (cdr (assoc 0 en)))
    (setq tag  (cdr (assoc 2 en))
     promptstring (cdr (assoc 3 en))
      )
    )
    (setq edat (entnext edat))
)
(setq IN_SC1 (atof (substr promptstring (+ (vl-string-position (ascii ":") promptstring) 2))));提取标高_1:后面的数据

(vl-cmdf "_SCALE" edat1 "" "_non" INS  (/ scal IN_SC1))
)
)
)
(princ)
)

本帖子中包含更多资源

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

x
 楼主| 发表于 2009-5-20 07:18:00 | 显示全部楼层
版主,可否出手相助一下?
发表于 2009-5-20 10:08:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-20 11:33:23 编辑

因为需要从不同的提示字符串中提取数据,所以浏览块定义时需要同时保存图块名称和提示比例到数据表。
然后再顺次对数据表中相应的图块进行缩放。程序为TT1
或者直接对全图进行搜索,过滤符合要求的属性和比例,再对图块进行缩放。程序为TT2.
没有测试图,所以不保证没有问题。
  1. (Defun c:TT1 (/ DATA II OS SN SS STR)
  2.   (setq os (getvar "osmode"))
  3.   (setvar "osmode" 0)
  4.   (vlax-for BLK (vla-get-blocks
  5.     (vla-get-activedocument (vlax-get-acad-object))
  6.   )
  7.     (vlax-for X BLK
  8.       (if (and (= (vla-get-objectname X) "AcDbAttributeDefinition")
  9.         (wcmatch (setq str (vla-get-promptstring X))
  10.    "标高*"
  11.         )
  12.    )
  13. (setq data (cons (cons (vla-get-name BLK)
  14.           (read (vl-string-subst
  15.            ""
  16.            "标高_1:"
  17.            str
  18.          )
  19.           )
  20.     )
  21.     data
  22.      )
  23. )
  24.       )
  25.     )
  26.   )
  27.   (foreach blk data
  28.     (if (setq ii -1
  29.        ss (ssget "_x"
  30.    (list (cons 0 "insert") (cons 2 (car blk)))
  31.    )
  32. )
  33.       (repeat (sslength ss)
  34. (setq sn (ssname ss (setq ii (1+ ii))))
  35. (command "_.Scale"
  36.    sn
  37.    ""
  38.    (cdr (assoc 10 (entget sn)))
  39.    (/ 50.0 (cdr blk))
  40. )
  41.       )
  42.     )
  43.   )
  44.   (setvar "osmode" os)
  45.   (princ)
  46. )
  47. (Defun C:TT2 (/ II OS SCALE SN SS)
  48.   (setq ss (ssget "_x" '((0 . "insert") (66 . 1)))
  49. ii -1
  50. os (getvar "osmode")
  51.   )
  52.   (setvar "osmode" 0)
  53.   (repeat (sslength ss)
  54.     (setq sn (ssname ss (setq ii (1+ ii)))
  55.    Scale nil
  56.     )
  57.     (foreach att (vlax-safearray->list
  58.       (vlax-variant-value
  59.         (vla-GetAttributes (vlax-ename->vla-object sn))
  60.       )
  61.     )
  62.       (if (and (null Scale)
  63.         (wcmatch (vla-get-promptstring att) "标高*")
  64.    )
  65. (setq Scale (read (vl-string-subst
  66.        ""
  67.        "标高_1:"
  68.        (vla-get-promptstring att)
  69.      )
  70.       )
  71. )
  72.       )
  73.     )
  74.     (if Scale
  75.       (command "_.Scale"
  76.         sn
  77.         ""
  78.         (cdr (assoc 10 (entget sn)))
  79.         (/ 50.0 Scale)
  80.       )
  81.     )
  82.   )
  83.   (setvar "osmode" os)
  84.   (princ)
  85. )
 楼主| 发表于 2009-5-20 10:45:00 | 显示全部楼层

命令: tt2 ; 错误: 参数类型错误: VLA 对象集合: (#<VLA-OBJECT IAcadAttributeReference 06bbb944>)

发表于 2009-5-20 11:41:00 | 显示全部楼层
需要把vlax-for改成foreach,已修改
 楼主| 发表于 2009-5-20 11:51:00 | 显示全部楼层
命令: tt2 ; 错误: ActiveX 服务器返回错误: 未知名称: PromptString
 楼主| 发表于 2009-5-20 13:14:00 | 显示全部楼层
没人帮忙?
发表于 2009-5-20 19:41:00 | 显示全部楼层

我想错了,ATTRIB的提示属性是不存在的,所以TT2将无法使用。只能用TT1的方法。

 楼主| 发表于 2009-5-22 07:30:00 | 显示全部楼层
TT1也用不了。图中有符合条件的块,但执行后没反映。
 楼主| 发表于 2009-5-22 15:05:00 | 显示全部楼层
没有理?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 18:29 , Processed in 0.203454 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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