明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16413|回复: 47

[源码] [可选择]块属性刷刷刷.

  [复制链接]
发表于 2014-3-4 17:44:12 | 显示全部楼层 |阅读模式
本帖最后由 77077 于 2014-3-4 21:48 编辑

此程序功能还不够完善,希望大神们来添砖加瓦,程序代码太乱,欢迎修改~~~~~
缺少的函数可以去论坛找来用.

功能演示:


源码:
  1. ;;;功能:属性刷刷刷
  2. (vl-load-com)
  3. (defun C:TT (/ SS ID ID2 ENT ENTBLOCK ENTDATA I LST1)
  4. (if  (and (setq SS (entsel "\n点取源对象: "))
  5.        (setq ENT (GetAttributes (car SS)))
  6.        (SSS-MAKE-DCL ENT "d:\\test.dcl")
  7.        (>= (setq ID (load_dialog "d:\\test.dcl")) 0)
  8.      )
  9.   (progn
  10.       (setq LST1 '())
  11.       (new_dialog "BLK_SSS" ID)
  12.       (set_tile "DLG_NAME" (strcat "块属性刷刷刷-测试"))
  13.       (setq ID2 (start_dialog))
  14.       (princ "\n===id2=")
  15.       (princ ID2)
  16.       (setq lst2 (mapcar '(lambda (x) (nth x ENT)) LST1))
  17.       (princ "\n要刷同的是:")
  18.       (princ lst2)
  19.   (if (and (= ID2 1) (> (length LST2) 0))
  20.   (if (setq SS1 (ssget '((0 . "INSERT"))));选择目标块
  21.     (foreach tagname LST2
  22.       (setq value (getattvalue (car SS) tagname));取得源块tag的属性值
  23.       (repeat
  24.         (setq i (sslength SS1));目标块数量
  25.         (setattvalue (ssname SS1 (setq i (1- i))) tagname value);修改目标块tag的属性值
  26.       )
  27.     )
  28.   )
  29.   )
  30.       ;;卸载对话框文件
  31.       (unload_dialog ID)
  32.       (vl-file-delete  "d:\\test.dcl")
  33.   )
  34.     )
  35.     (princ)
  36. )

  37. ;;;[功能]根据ENT表,生成DCL文件
  38. (defun SSS-MAKE-DCL  (ENT FILENAME / F1 I)
  39.   (if  (setq F1 (open FILENAME "w"))
  40.     (progn
  41.       (write-line "BLK_SSS: dialog{ key = "DLG_NAME"; label = "刷刷刷";" F1 )
  42.       (write-line ":boxed_column{label="对象特性:";"  F1)
  43.       (setq I 0)
  44.       (foreach N ENT
  45.        (progn
  46.           (write-line (strcat  ":toggle{ label="" (vl-princ-to-string N) "";   key = "KEY匹配" (itoa I) ""; width=20;  action="(tt-01 " (itoa I) ")";value="0";  }" ) F1 )
  47.           (setq I (1+ I))
  48.        )
  49.       )
  50.       (write-line "}" F1)
  51.       (write-line "ok_only;" F1)
  52.       (write-line "}" F1)
  53.       (close F1)
  54.       t
  55.     )
  56.   )
  57. )
  58. ;;;匹配  被修改
  59. (defun TT-01 (INT)
  60.     (if (= $VALUE "1")
  61.       (setq LST1 (cons INT LST1));将INT添加到表LST1
  62.       (setq LST1 (vl-remove INT LST1))
  63.     )
  64. )

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +3 收起 理由
langjs + 2 赞一个!
flyfox1047 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 学习|主题: 24, 订阅: 0
发表于 2020-11-4 00:59:04 | 显示全部楼层
  1. ;;;功能:属性刷子
  2. (vl-load-com)
  3. (defun C:KN (/ SS ID ID2  ENTBLOCK ENTDATA I LST2 LST1 )
  4. (if  (and (setq SS (entsel "\n点取源对象: "))
  5.        (setq ENT (GetAttributes (car SS)))
  6.      
  7.        (SSS-MAKE-DCL ENT "d:\\test.dcl")
  8.                  
  9.        (>= (setq ID (load_dialog "d:\\test.dcl")) 0)
  10.      )
  11.   (progn
  12.      (setq LST1 '())
  13.      (new_dialog "sxk_sss" ID)
  14.      (action_tile  "Command1" "(TT1)")
  15.      (action_tile  "Command2" "(TT2)")
  16.      (setq ID2 (start_dialog))
  17.     (print LST1)
  18.      (princ "\n>>>>>>>>>>id2=")
  19.      (princ ID2)
  20.      (setq lst2  (mapcar '(lambda (x) (nth x ENT)) LST1))
  21.      (setq lst2  (mapcar '(lambda (x) (cadr x)) LST2))
  22.      (princ "\n要刷同的是:")(princ lst2)
  23.   (if (and (= ID2 1) (> (length LST2) 0))
  24.   (if (setq SS1 (ssget '((0 . "INSERT"))));选择目标块
  25.     (foreach tagname LST2
  26.       (setq value (getattvalue (car SS) tagname));取得源块tag的属性值
  27.       (repeat
  28.         (setq i (sslength SS1));目标块数量
  29.         (setattvalue (ssname SS1 (setq i (1- i))) tagname value);修改目标块tag的属性值
  30.       )
  31.     )
  32.   )
  33.   )
  34.       ;;卸载对话框文件
  35.       (unload_dialog ID)
  36.       (vl-file-delete  "d:\\test.dcl")
  37.   )
  38.     )
  39.     (princ)
  40. )

  41. ;;;[功能]根据ENT表,生成DCL文件
  42. (defun SSS-MAKE-DCL  (ENT FILENAME / F1 I)
  43.   (if  (setq F1 (open FILENAME "w"))
  44.     (progn
  45.       (write-line "sxk_sss: dialog\n{\n key = \"DLG_NAME\"; \nlabel = \"属性块刷子\";" F1 )
  46.       (write-line " :row{"                                  F1)
  47.       (write-line ":boxed_column\n{\nlabel=\"对象特性:\";"  F1)
  48.       (setq I 0)
  49.       
  50.       (foreach N ENT
  51.        (progn
  52.                 
  53.           (write-line (strcat  ":toggle\n{ label=\""
  54.                                (vl-princ-to-string( Cadr N))
  55.                                "\"" ";key = \"" (itoa I) "\";\nwidth=20;\nvalue=\"0\";"
  56.                                "action=\"(TT" " " (itoa I) ")\";}")
  57.                                 F1 )
  58.                                
  59.                                 
  60.                                
  61.                              
  62.                                
  63.                                
  64.                                

  65.          (setq I (1+ I))
  66.        )
  67.       );;;结束foreach
  68.       
  69.       (write-line "\n}" F1);;;结束boxed_column
  70.       (write-line " :column{"                                  F1)
  71.       (write-line " :button{key = \"Command1\" ; label = \"全选\" ; width = 10 ;  height = 1.5 ; }" F1)
  72.       (write-line " :button{key = \"Command2\" ; label = \"全部取消\" ; width = 10 ;  height = 1.5 ; }" F1)
  73.             
  74.                
  75.                
  76.                
  77.                
  78.       (write-line "\nok_only;" F1)
  79.       (write-line "\n}" F1);;;column
  80.       (write-line "\n}" F1);;;row
  81.       
  82.       (write-line "\n}" F1);;;结束dialog
  83.       (close F1)
  84.       t
  85.     );;;结束progn
  86.   );;;结束if

  87. )


  88. ;;;action 函数
  89. (defun TT (INT)
  90.     (if (= $VALUE "1")
  91.       
  92.       (setq LST1 (cons INT LST1));将INT添加到表LST1
  93.       (setq LST1 (vl-remove INT LST1))  
  94.     )
  95. )
  96. ;;;全选 action 函数
  97. (defun TT1 ( / j)
  98. (setq j 0)
  99. (while  (<  j (length ENT ))
  100.   (set_tile (itoa j) "1")
  101.   (setq LST1 (cons j LST1))
  102.   (setq j (1+ j))
  103. )  
  104.   )
  105. ;;;全部取消 action 函数
  106. (defun TT2 (/ j)
  107. (setq j 0)
  108. (while  (<  j (length ENT ))
  109.   (set_tile (itoa j) "0")
  110.   (setq LST1 '())
  111.   (setq j (1+ j))
  112. )  
  113.   )




  114. ;;;取得图元属性
  115. (defun getattributes (ent / lst r)
  116.   
  117.   (while (=  (cdr (assoc 0 (setq lst (entget (setq ent (entnext ent))))))
  118.              "ATTRIB" )
  119.            
  120.     (setq  r  (cons
  121.                 (mapcar 'cdr (mapcar 'assoc '(-1 2 1) (list lst lst lst)))
  122.                 r)
  123.   )
  124.   (reverse r)
  125. )
  126.   )

  127. ;;;取得块属性值
  128. (defun getattvalue (entblock attname / entdata entname test value)
  129.   (setq entname entblock test t  )
  130.   (while (and  test   (setq entname (entnext entname))  )
  131.     (setq entdata (entget entname))
  132.     (cond
  133.     ((not (= (cdr (assoc 0 entdata)) "ATTRIB"))   (setq test nil)  )
  134.     ((= "SEQEND" (cdr (assoc 0 entdata)))         (setq test nil)  )
  135.     ((= (cdr (assoc 2 entdata)) attname)          (setq value (cdr (assoc 1 entdata)))  )
  136.      )
  137.   )
  138.   value
  139. )

  140. ;;;getattnamelst 替换getattributes
  141. ;;;给块属性赋值
  142. (defun setattvalue (EN ATTNAME vALUE /  szb1 E TEST ENT)
  143.         (setq E EN          RETURN NIL          TEST t    )
  144.     (while (and        TEST                (setq E (entnext E))           )
  145.         (setq ENT (entget E))
  146.         (cond
  147.             ;;
  148.             ((not (= (cdr (assoc 0 ENT)) "ATTRIB"))
  149.              (setq TEST NIL)
  150.             )
  151.             ;;
  152.             ((= "SEQEND" (cdr (assoc 0 ENT)))
  153.              (setq TEST NIL)
  154.             )
  155.             ;;
  156.             ((= (cdr (assoc 2 ENT)) ATTNAME )
  157.              (setq ENT (subst        (cons 1 VALUE)  (assoc 1 ENT) ENT) )
  158.              (entmod ENT)
  159.              (entupd EN)
  160.              (setq RETURN t)
  161.             )
  162.            ) ;_结束cond
  163.     )
  164.     ;;返回
  165.     RETURN
  166. )



半懂不懂调试了3天,终于能用了
回复 支持 1 反对 0

使用道具 举报

发表于 2022-5-7 15:12:16 | 显示全部楼层
fl202 发表于 2014-7-11 10:20
以下是补缺少的两个子函数:附件是经测试的完整程序,对程序稍作修改,收币一个。大家自主选择,补函数后还 ...

加一个全选功能,更方便啊
发表于 2014-3-4 23:54:30 | 显示全部楼层
补个函数
  1. (defun getattributes (ent / lst r)
  2.   (while (=
  3.            (cdr (assoc 0 (setq lst (entget (setq ent (entnext ent))))))
  4.            "ATTRIB"
  5.          )
  6.     (setq
  7.       r        (cons           (mapcar 'cdr (mapcar 'assoc '(-1 2 1) (list lst lst lst)))
  8.           r
  9.         )
  10.     )
  11.   )
  12.   (reverse r)
  13. )
发表于 2014-3-5 08:14:20 | 显示全部楼层
看起来很牛
发表于 2014-3-5 13:07:05 | 显示全部楼层
本帖最后由 masterlong 于 2014-3-5 13:10 编辑

不错
几点建议
1.
目标块名开关:同名块/异名块
2.
开关:全选/清空
3.
开关:默认全选/清空
4.
属性值的显示
发表于 2014-3-5 21:16:51 | 显示全部楼层
建议楼主给全源码,谢谢了!
发表于 2014-3-6 08:35:50 | 显示全部楼层
很不错哦,支持
发表于 2014-3-10 06:03:38 | 显示全部楼层
不能直接用,不知道如何调试,麻烦版主贴个完整的,谢谢!
 楼主| 发表于 2014-3-10 09:32:55 | 显示全部楼层
xieyanghui 发表于 2014-3-10 06:03
不能直接用,不知道如何调试,麻烦版主贴个完整的,谢谢!

好好找,论坛有人贴出过函数集,其中就包括我这里缺少的三个函数!
本来嘛也可以直接贴出来的,只是为了避免拿着程序就走人的现象,所以^^^^

见谅!
 楼主| 发表于 2014-3-10 09:38:14 | 显示全部楼层
masterlong 发表于 2014-3-5 13:07
不错
几点建议
1.

不错,几点建议都不错.
1.目标块名开关:同名块/异名块==>这个建议不错,我会改进的.
2.开关:全选/清空==>2.3这建议也不错,我也觉得麻烦,多谢提醒,下次改进!
3.开关:默认全选/清空
4.属性值的显示==>属性值的显示方式,只需要修改调用的GetAttributes函数即可,不需要在这些代码里面修改.
发表于 2014-3-11 09:36:11 | 显示全部楼层
好东西,收藏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 18:04 , Processed in 0.228654 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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