明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2222|回复: 14

[求助]哪位高手帮忙看看这个程序错在了哪里?

    [复制链接]
发表于 2009-5-23 11:55:00 | 显示全部楼层 |阅读模式
;有很多这样的属性块,提示有“标高_1:10”、“标高_1:20”“标高_1:40”“标高_1:50”“标高_1:100”“标高_1:150”“标高_1:200”。。。
;下面这个程序是选择图中符合条件的块,然后进行缩放。

(Defun c:tt (/ DATA II OS SN SS STR)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(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 (setq str (vla-get-promptstring X))
"标高*"
)
)
(setq data (cons (cons (vla-get-name BLK)
(read (vl-string-subst
""
"标高_1:"
str
)
)
)
data
)
)
)
)
)
(foreach blk data
(if (setq ii -1
ss (ssget (list (cons 0 "insert") (cons 2 (car blk)))
)
)
(repeat (sslength ss)
(setq sn (ssname ss (setq ii (1+ ii))))
(command "_.Scale"
sn
""
(cdr (assoc 10 (entget sn)))
(/ 50.0 (cdr blk))
)
)
)
)
(setvar "osmode" os)
(princ)
)
;哪位高手帮忙看看这个程序错在了哪里?附件中有测试文件。

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-5-23 12:14:00 | 显示全部楼层
  1. (Defun c:tt (/ BNN 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 bnn (car blk)
  29.        bnn (if (= (substr bnn 1 1) "*")
  30.       (strcat "`" bnn)
  31.       bnn
  32.     )
  33.        ii  -1
  34.        ss  (ssget "_x"
  35.     (list (cons 0 "insert") (cons 2 bnn))
  36.     )
  37. )
  38.       (repeat (sslength ss)
  39. (setq sn (ssname ss (setq ii (1+ ii))))
  40. (command "_.Scale"
  41.    sn
  42.    ""
  43.    (cdr (assoc 10 (entget sn)))
  44.    (/ 50.0 (cdr blk))
  45. )
  46.       )
  47.     )
  48.   )
  49.   (setvar "osmode" os)
  50.   (princ)
  51. )
 楼主| 发表于 2009-5-23 12:51:00 | 显示全部楼层

非常感谢mmmmmm,但我想要的是:只对图中“所选择”的符合条件的块进行处理,并不是对图中“所有”符合条件的块进行处理。而且这个功能不要对图“所有块”进行判断,因为文件大一点的话就会很慢。

发表于 2009-5-23 20:49:00 | 显示全部楼层
  1. (Defun c:tt (/ BNN BNX 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.     (setq bnn (car blk)
  29.    bnn (if (= (substr bnn 1 1) "*")
  30.   (strcat "`" bnn)
  31.   bnn
  32.        )
  33.     )
  34.     (if (null bnx)
  35.       (setq bnx bnn)
  36.       (setq bnx (strcat bnx "," bnn))
  37.     )
  38.   )
  39.   (if (and (princ "\n 请选择图块 <退出>:")
  40.     (setq ss (ssget (list (cons 0 "insert") (cons 2 bnn))))
  41.     (setq ii -1)
  42.       )
  43.     (repeat (sslength ss)
  44.       (setq sn (ssname ss (setq ii (1+ ii)))
  45.      scl (cdr (assoc (cdr (assoc 2 (entget sn))) data))
  46.       )
  47.       (command "_.Scale"
  48.         sn
  49.         ""
  50.         (cdr (assoc 10 (entget sn)))
  51.         (/ 50.0 scl)
  52.       )
  53.     )
  54.   )
  55.   (setvar "osmode" os)
  56.   (princ)
  57. )
 楼主| 发表于 2009-5-23 21:12:00 | 显示全部楼层

文件比较大时也是比较的慢,而且图中如果没有符合条件的属性块的话会出错:

命令: tt
 请选择图块 <退出>:; 错误: ssget 列表值错误

发表于 2009-5-24 00:25:00 | 显示全部楼层

要想速度快,你需要提高硬件。

图中如果没有符合条件的属性块,就不需要运行本程序,出错也无所谓。你自己也会一点点,可以自己去修改的。

 楼主| 发表于 2009-5-24 08:46:00 | 显示全部楼层
本帖最后由 作者 于 2009-5-24 10:31:04 编辑

我有的是CPU酷瑞双核2.5G,内存2G,CAD2007.我这个程序是想对已有的选择集进行处理的。

(Defun c:tt ( / blk bnn bnx data ii scl sn ss ssi str)
(princ "\n 请选择图块 <退出>:")
(setq ss (ssget '((0 . "INSERT"))))
    (vlax-for BLK (vla-get-blocks
     (vla-get-activedocument (vla-get-objectname ss))
   );在此如何对已有选择对象SS进行判断呢?这里这样好像不行
     (vlax-for ss BLK
       (if (and (= (vla-get-objectname ss) "AcDbAttributeDefinition")
         (wcmatch (setq str (vla-get-promptstring ss))
    "标高*"
         )
    )
  (setq data (cons (cons (vla-get-name BLK)
           (read (vl-string-subst
            ""
            "标高_1:"
            str
          )
           )
     )
     data
      )
  )
       )
     )
   )
   (foreach blk data
     (setq bnn (car blk)
    bnn (if (= (substr bnn 1 1) "*")
   (strcat "`" bnn)
   bnn
        )
     )
     (if (null bnx)
       (setq bnx bnn)
       (setq bnx (strcat bnx "," bnn))
     )
   )
   (if (and (/= nil bnn) (setq ii -1))
(progn
(vl-cmdf "select" ss "")
(setq ssi (ssget "p" (list (cons 0 "INSERT") (cons 2 bnn))))
     (repeat (sslength ssi)
       (setq sn (ssname ssi (setq ii (1+ ii)))
      scl (cdr (assoc (cdr (assoc 2 (entget sn))) data))
       )
       (command "_.Scale"
         sn
         ""
         (cdr (assoc 10 (entget sn)))
         (/ 50.0 scl)
       )
     )
)
   )
   (princ)
)

发表于 2009-5-24 09:17:00 | 显示全部楼层
 楼主| 发表于 2009-5-24 09:51:00 | 显示全部楼层

小萝卜头,你不明白我的意思,你的程序没能达到我想要的结果。

我想要的是:对已有选择对象SS进行判断呢?

 楼主| 发表于 2009-5-24 23:02:00 | 显示全部楼层

哪位高人出手帮忙一下,这将完成我的软件的一个阶段:

我这个程序是想对已有的选择集进行处理的。

(Defun c:tt ( / blk bnn bnx data ii scl sn ss ssi str)
(princ "\n 请选择图块 <退出>:")
(setq ss (ssget '((0 . "INSERT"))))
    (vlax-for BLK (vla-get-blocks
     (vla-get-activedocument (vla-get-objectname ss))
   );在此如何对已有选择对象SS进行判断呢?这里这样好像不行
     (vlax-for ss BLK
       (if (and (= (vla-get-objectname ss) "AcDbAttributeDefinition")
         (wcmatch (setq str (vla-get-promptstring ss))
    "标高*"
         )
    )
  (setq data (cons (cons (vla-get-name BLK)
           (read (vl-string-subst
            ""
            "标高_1:"
            str
          )
           )
     )
     data
      )
  )
       )
     )
   )
   (foreach blk data
     (setq bnn (car blk)
    bnn (if (= (substr bnn 1 1) "*")
   (strcat "`" bnn)
   bnn
        )
     )
     (if (null bnx)
       (setq bnx bnn)
       (setq bnx (strcat bnx "," bnn))
     )
   )
   (if (and (/= nil bnn) (setq ii -1))
(progn
(vl-cmdf "select" ss "")
(setq ssi (ssget "p" (list (cons 0 "INSERT") (cons 2 bnn))))
     (repeat (sslength ssi)
       (setq sn (ssname ssi (setq ii (1+ ii)))
      scl (cdr (assoc (cdr (assoc 2 (entget sn))) data))
       )
       (command "_.Scale"
         sn
         ""
         (cdr (assoc 10 (entget sn)))
         (/ 50.0 scl)
       )
     )
)
   )
   (princ)
)

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

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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