明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2755|回复: 21

[提问] 属性刷程序改进

[复制链接]
发表于 2019-7-4 15:05 | 显示全部楼层 |阅读模式
100明经币
本帖最后由 andyding 于 2019-7-4 15:35 编辑





请各位大侠出手帮忙,悬赏只是一点心意。附件属性刷程序,我的块属性项太多,150项,对话框太长,屏幕显示不下。
希望改成类似院长图片那样的,要源码。


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

最佳答案

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-4 15:05 | 显示全部楼层
  1. ;;最后编辑20190721
  2. (defun c:ATF( );此部分是测试代码用
  3.    (Cq-GetFrameAttributes)
  4.    (if bln(属性块_load))
  5. )


  6. ;;;格式化entsel选不中接着选,空格,右键退出。
  7. (defun LM:SelectIf ( msg pred func keyw / sel ) (setq pred (eval pred))  
  8.   (while
  9.     (progn (setvar 'ERRNO 0) (if keyw (apply 'initget keyw)) (setq sel (func msg))
  10.       (cond
  11.         ( (= 7 (getvar 'ERRNO))
  12.           (princ "\nMissed, Try again.")
  13.         )
  14.         ( (eq 'STR (type sel))
  15.           nil
  16.         )
  17.         ( (vl-consp sel)
  18.           (if (and pred (not (pred sel)))
  19.             (princ "\nInvalid Object Selected.")
  20.           )
  21.         )
  22.       )
  23.     )
  24.   )
  25.   sel
  26. )

  27. ;;;lisp对象名转vla对象名
  28. (defun Cq-en-vl (ename / Vlaobj )

  29. (setq Vlaobj(vlax-ename->vla-object  Ename))

  30. Vlaobj

  31. );end Defun CQ-en-vl


  32. ;;选择集与对象名表互转
  33. (defun Cq-S2E (ss / enlst)
  34.   
  35.   (cond
  36.      ((= (type ss) 'PICKSET) ;;判断符号是否为选择集
  37.       (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (apply 'append (ssnamex ss)))
  38.      ) ;_选择集变表
  39.      ((= (type ss) 'LIST)    ;;判断符号是否为表
  40.             (setq enlst (ssadd)) ;;建立空选择集
  41.             (foreach en ss (ssadd en enlst));;图元名称添加至选择集enlst
  42.      ) ;_表变选择集
  43.   )
  44. );END DEFUN



  45. ;;子程序
  46. ;匹配属性块信息
  47. (defun Cq-GetFrameAttributes ( /)

  48.         (setq sel(LM:SelectIf "\n选取源属性块: "(lambda(x)(=(cdr(assoc 66(entget(car x))))1 )) entsel nil))
  49.         (if sel
  50.                 (progn
  51.                         (setq bln (cdr(assoc 2 (entget(car sel)))))
  52.                         (setq Tags nil Textstr nil)
  53.                         (setq blk (vlax-Ename->vla-Object (car sel)))
  54.                         (if (= (vla-Get-HasAttributes blk) :vlax-true);判断是否有属性
  55.                                 (foreach n (vlax-SafeArray->list(vlax-Variant-Value (vla-GetAttributes blk)));属性集合
  56.                                         (setq Tags(cons(vla-Get-TagString n)Tags))
  57.                                         (setq Textstr(cons(vla-Get-TextString n)Textstr))
  58.                                 )
  59.                         )
  60.                 )
  61.         )
  62.         (setq i (length Tags) Text_lst nil Check_lst nil Texts nil Checks nil)
  63.         (repeat i
  64.                 (setq Text_lst(cons(strcat "text" (itoa i) "_bak20180503")Text_lst))
  65.                 (setq Check_lst(cons(strcat "check" (itoa i) "_bak20180503")Check_lst))
  66.                 (setq Texts(cons(strcat "text" (itoa i))Texts))
  67.                 (setq Checks(cons(strcat "check" (itoa i))Checks))
  68.           (setq i(1- i))
  69.         )
  70.         (Mapcar '(lambda(a b)(set (read a) b)) Text_lst (reverse Textstr))

  71. ;;--------初始化check#去nil---------------
  72.   (foreach n Check_lst
  73.           (if (not (eval(read n)))(set (read n) "0"))
  74.   )

  75. ;;参考
  76. ;;Check2_bak20180503
  77. ;;Text2_bak20180503

  78.         (setq i (length Tags) dcl_Check nil dcl_Text nil dcl_check_text nil)
  79.         (setq rows (cond((< 60 i )30)(15)))
  80.        
  81.         (foreach n Tags
  82. ;;--------定义复选框Dcl代码---------------

  83.          (if (= rows (gcd rows i))
  84.                  (progn
  85.                                 (setq dcl_check_text
  86.                                  (cons
  87.                                                 (append
  88.                                                         dcl_check
  89.                                                  '(
  90.                                                         "}"
  91.                                                         ":column"
  92.                                                         "{"
  93.                                                         )  
  94.                                                         dcl_text
  95.                                                 )
  96.                                                 (cons
  97.                                                         '(
  98.                                                         "}"
  99.                                                         ":column"
  100.                                                         "{"
  101.                                                         )
  102.                                                   dcl_check_text
  103.                                                 )
  104.                                   )       
  105.                                 )
  106.                                 (setq dcl_check nil dcl_text nil)
  107.                         )
  108.          )
  109.    
  110.                 (setq dcl_check
  111.                                 (cons
  112.                                         (strcat
  113.                                                 ":toggle"
  114.                                                 "{"
  115.                                                 "key = \"check" (itoa i) "\" ;"
  116.                                                 "label = \" " n ":\" ;"
  117.                                                 "height = 0.5 ;"
  118.                                                 "}"
  119.                                                 )
  120.                 dcl_check  
  121.                                 )
  122.                 )



  123. ;;--------定义文本框Dcl代码---------------

  124.                 (setq dcl_text
  125.                         (cons
  126.                                  (strcat
  127.                                                 ":edit_box"
  128.                                                 "{"
  129.                                                 "key = \"text" (itoa i) "\" ;"
  130.                                                 "width= 20 ;"
  131.                                                 "height = 0.5 ;"
  132.                                                 "}"
  133.                                         )
  134.                         dcl_text
  135.                          )
  136.           )       

  137.                 (setq i(1- i))
  138.         )
  139.        
  140.         (setq dcl_check_text
  141.                         (cons
  142.                                 (append
  143.                                         dcl_check
  144.                                  '(
  145.                                         "}"
  146.                                         ":column"
  147.                                         "{"
  148.                                         )  
  149.                                         dcl_text
  150.                                 )
  151.                                 (cons
  152.                                         '(
  153.                                         "}"
  154.                                         ":column"
  155.                                         "{"
  156.                                         )
  157.                                   dcl_check_text
  158.                                 )
  159.                         )       
  160.         )

  161. (princ)
  162.    
  163. )


  164. ;;子程序
  165. ;;;勾选属性修改
  166. (defun Cq-PutAttributes (ss / )

  167.         (if ss
  168.          (progn
  169.                 (setq enlst(cq-s2e ss))
  170.                  (if (equal "1" all_sel)
  171.                                 (foreach en enlst
  172.                                         (MJ:ChangeAttributes (cons en (Mapcar 'cons (reverse Tags) (Mapcar 'eval(Mapcar 'read Text_lst)))))
  173.                                 );for 全选
  174.                                
  175.                          (foreach en enlst
  176.                                  (setq i 0)
  177.                                  (foreach Check Check_lst
  178.                                          (if (= "1" (eval (read Check))) (MJ:PutTagTextStringByRef (cq-en-vl en) (nth i (reverse Tags)) (eval(read(nth i Text_lst)))))
  179.                                          (setq i(1+ i))
  180.                                  )         
  181.                          );for        勾选
  182.                  );if "1" all_sel
  183.          );progn
  184.         );if ss
  185.        
  186. (princ)
  187. ); defun


  188. (defun 属性块_load( / )

  189.         (vl-load-com)
  190.         ;;设置对话框位置
  191.         (if (not #dlg_pnt20180503)
  192.             (setq #dlg_pnt20180503 '(-1 -1))
  193.         );if
  194.         
  195.         (setq dcl_id (load_dialog (setq Dcl_File (Write_Dcl_属性块))));对话框加载
  196.         (vl-file-delete Dcl_File);加载后删除DCL文件
  197.         (setq Dialog_Return 2)
  198.         (while (> Dialog_Return 1) ;循环控制对话框是否结束
  199.                 (new_dialog "属性块" dcl_id "" #dlg_pnt20180503);建立窗体
  200. ;-->-->-对话框初始化->-->--
  201.                 (setq keys (append checks texts  '("check0" "command1" "command2" "command3" "accept" "cancel")));列表全部控件名称
  202.                 (foreach key keys;全部控件的初始化1
  203.                         (if (eval (read (strcat key "_bak20180503"))) (set_tile key (eval (read (strcat key "_bak20180503")))));控件内容
  204.                         (action_tile key "(Action_属性块_Keys $key $value)");点击动作
  205.                 )
  206.                
  207. ;-------设置文本框状态------
  208.                 (setq i 0)
  209.                 (foreach n  checks
  210.                        (if (equal (eval(read(strcat n "_bak20180503"))) "0") (mode_tile (nth i texts) 1) (mode_tile (nth i texts) 0))
  211.                        (setq i (1+ i))
  212.                  )
  213.                  
  214. ;--<--<-对话框初始化完成-<--<--
  215.                 (setq Dialog_Return (start_dialog));开启对话框(用户可见)
  216.                
  217. ;-->-->-LPACMQ加入按键功能>>>>>>>
  218.                 (cond
  219.                         ((= Dialog_Return 3)
  220.                          (C:ATF)
  221.                          (unload_dialog dcl_id)
  222.                         )
  223.                        
  224.                         ((= Dialog_Return 4)
  225.                          (princ "\n★修改块参照属性")
  226.                          (Cq-PutAttributes
  227.         (setq ss(ssget (list '(0 . "INSERT")'(-4 . "<OR")(cons 2 bln)(cons 2 "*FRAME*")'(-4 . "OR>"))))
  228.        )
  229.                         )
  230.                 );cond
  231. ;--<--<-LPACMQ按键功能完成<<<<<<<

  232.         );While
  233.         (unload_dialog dcl_id);退出时卸载对话框
  234.         (princ);防止函数回显
  235. )

  236. (defun Action_属性块_Keys (key value / ) ;全部控件的点击动作触发

  237. (eval
  238.         (append
  239.                 '(cond((= key "accept") ;{确认按钮}
  240.                                                 (Get_属性块_Data)
  241.                                                 ;;保存对话框位置坐标 -by LPACMQ 2015-6-8
  242.                                                 (setq #dlg_pnt20180503 (done_dialog 1));对话框退出返回主函数 传递给Dialog_Return值为1
  243.                                         )
  244.                                         ((= key "cancel") ;{取消按钮}
  245.                                                 (done_dialog 0);对话框退出返回主函数 传递给Dialog_Return值为0
  246.                                         )
  247.                  )
  248.         ;参考
  249.         ;        ((= key "check1")(if (equal "0" $value )(progn (mode_tile "text1" 1) (set_tile "check0" "0")) (mode_tile "text1" 0)))
  250.                  (mapcar '(lambda(a b)
  251.                                                                 (read
  252.                                                                                 (strcat "((= key "
  253.                                                                                         (vl-prin1-to-string(eval a))
  254.                                                                                         ")(if (equal \"0\" $value)(progn(mode_tile "
  255.                                                                                         (vl-prin1-to-string(eval b))
  256.                                                                                         " 1)(set_tile \"check0\" \"0\"))(mode_tile "
  257.                                                                                         (vl-prin1-to-string(eval b)) " 0)))"
  258.                                                                                 )
  259.                                                                  )
  260.                                                    )
  261.                          checks texts                                       
  262.                  )
  263.                        
  264.                 '(((= key "check0") ; {"全选"} (多选按钮)
  265.                                 (cond
  266.                                          ((equal "1" $value )
  267.                                                 (foreach n checks (set_tile n "1"))
  268.                                                 (foreach n texts (mode_tile n 0))
  269.                                          )
  270.                                          ((equal "0" $value )
  271.                                                 (foreach n checks (set_tile n "0"))
  272.                                                 (foreach n texts (mode_tile n 1))
  273.                                          )
  274.                                  )
  275.                          )
  276.                         ((= key "command3") ; {"默认"} (按钮)
  277.                                 ;;先清零
  278.                                 (set_tile "check0" "0")
  279.                                 (foreach n checks (set_tile n "0"))
  280.                                 (foreach n texts (mode_tile n 1))
  281.                                
  282.                                 ;;默认配置
  283.                                 (progn (mode_tile "text1" 0) (set_tile "check1" "1"))
  284.                                 (progn (mode_tile "text2" 0) (set_tile "check2" "1"))
  285.                                 (progn (mode_tile "text3" 0) (set_tile "check3" "1"))
  286.                                 (progn (mode_tile "text4" 0) (set_tile "check4" "1"))
  287.                                 (progn (mode_tile "text5" 0) (set_tile "check5" "1"))
  288.         ;                        (progn (mode_tile "text6" 0) (set_tile "check6" "1"))
  289.         ;                        (progn (mode_tile "text7" 0) (set_tile "check7" "1"))
  290.                                 (progn (mode_tile "text8" 0) (set_tile "check8" "1"))
  291.                                 (progn (mode_tile "text9" 0) (set_tile "check9" "1"))
  292.                                 (progn (mode_tile "text10" 0) (set_tile "check10" "1"))
  293.         ;                        (progn (mode_tile "text11" 0) (set_tile "check11" "1"))
  294.                                 (progn (mode_tile "text12" 0) (set_tile "check12" "1"))
  295.         ;                        (progn (mode_tile "text13" 0) (set_tile "check13" "1"))
  296.                                 (Get_属性块_Data)
  297.                         )
  298.                         ((= key "command1") ; {"匹配"} (按钮)
  299.                                 (Get_属性块_Data)
  300.                                 (done_dialog 3);3
  301.                                
  302.                         )
  303.                         ((= key "command2") ; {"修改"} (按钮)
  304.                                 (setq all_sel (get_tile "check0"))
  305.                                 (Get_属性块_Data)
  306.                                 (done_dialog 4)
  307.                         )
  308.                 )
  309.         );Append
  310. );eval

  311. )



  312. (defun Get_属性块_Data( / );临时生成Dcl文件 返回文件名
  313.        
  314.         (foreach key keys
  315.                 (set (read (strcat key "_bak20180503")) (get_tile key));每个控件都赋给一个变量 用于下次开启初始化
  316.         )
  317. )

  318. (defun Write_Dcl_属性块( / )
  319.        
  320. (defun *error* (msg)
  321.   (princ "出错: 对不起")
  322.   (princ msg)
  323.   (princ)
  324. )
  325.         (setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
  326.         (setq file (open Dcl_File "w"))
  327.         (foreach str (append
  328.          (list
  329.                 "属性块:dialog"
  330.                 "{"
  331.                 " label = \" 属性块编辑工具v1.0 \";"
  332.                 "    :row" ;column
  333.                 "    {"
  334.                 "        :boxed_column"
  335.                 "        {"
  336.     (strcat "         label = \"块名:" bln "\" ;")
  337.                 "            :row"
  338.                 "            {"
  339.                 "                :column"
  340.                 "                {"
  341.                 )
  342.                
  343.                 (apply 'append dcl_check_text)

  344.          '(
  345.                 "                }"
  346.                 "                :column"
  347.                 "                {"
  348.                 "                    :toggle"
  349.                 "                    {"
  350.                 "                        key = \"check0\" ;"
  351.                 "                        label = \"全选\" ;"
  352.                 "                        width = 0.5 ;"
  353.                 "                        height = 0.5 ;"
  354.                 "                    }"
  355.                 "                    :button"
  356.                 "                    {"
  357.                 "                        key = \"command3\" ;"
  358.                 "                        label = \"默认\" ;"
  359.                 "                        width = 0.5 ;"
  360.                 "                        height = 2.5 ;"
  361.                 "                    }"
  362.                 "                    :button"
  363.                 "                    {"
  364.                 "                        key = \"command1\" ;"
  365.                 "                        label = \"匹配\" ;"
  366.                 "                        width = 0.5 ;"
  367.                 "                        height = 5 ;"
  368.                 "                    }"
  369.                 "                    :button"
  370.                 "                    {"
  371.                 "                        key = \"command2\" ;"
  372.                 "                        label = \"修改\" ;"
  373.                 "                        width = 0.5 ;"
  374.                 "                        height = 10 ;"
  375.                 "                    }"
  376.                 "                }"
  377.                 "            }"
  378.                 "        }"
  379.                 "    }"
  380.                 "ok_cancel ;"
  381.                 "}"
  382.                 )
  383.                                                  );append
  384.                 (write-line str file)
  385.         )
  386.         (close file)
  387.         Dcl_File
  388. )


  389. ;;30.2 [功能] 更改选定块的指定属性
  390. ;; (MJ:PutTagTextStringByRef (*En2Obj* (car (entsel))) "设计" "new value")
  391. (defun MJ:PutTagTextStringByRef        (br tagname textstring / atts tag)
  392.   (if (and
  393.         (= (vla-get-hasattributes br) :vlax-true)
  394.         (safearray-value
  395.           (setq        atts
  396.                  (vlax-variant-value
  397.                    (vla-getattributes br)
  398.                  )
  399.           )
  400.         )
  401.       )
  402.     (foreach tag (vlax-safearray->list atts)
  403.       (if (= (strcase tagname) (strcase (vla-get-tagstring tag)))
  404.         (vla-put-TextString tag textstring)
  405.       )
  406.     )
  407.     (vla-update br)
  408.   )
  409. )

  410. ;;30.3 [功能] 更改块多个属性
  411. ;;(setq blk (car (entsel)))
  412. ;;(MJ:ChangeAttributes (list blk (cons "设计" "AA")(cons "名称" "BB")))
  413. (defun MJ:ChangeAttributes (lst / atts blk item)
  414.   (setq        blk (vlax-Ename->vla-Object (car lst))
  415.         lst (cdr lst)
  416.   )
  417.   (if (= (vla-Get-HasAttributes blk) :vlax-true) ;如果有属性
  418.     (progn
  419.       (setq atts (vlax-SafeArray->list
  420.                    (vlax-Variant-Value (vla-GetAttributes blk))
  421.                  )
  422.       )                                       
  423.       (foreach item lst
  424.         (mapcar
  425.           '(lambda (x)
  426.              (if
  427.                (= (strcase (car item)) (strcase (vla-Get-TagString x)))
  428.                 (vla-Put-TextString x (cdr item))
  429.              )                               
  430.            )
  431.           atts
  432.         )                               
  433.       )                                       
  434.       (vla-Update blk)
  435.     )
  436.   )                               
  437. )




评分

参与人数 1明经币 +1 收起 理由
andyding + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-7-5 09:11 | 显示全部楼层
帖不要沉啊。
回复

使用道具 举报

发表于 2019-7-6 10:40 | 显示全部楼层
150个确实多,可以考虑做成翻页的,类似ATE命令
回复

使用道具 举报

发表于 2019-7-6 12:27 来自手机 | 显示全部楼层
没有样板块怎么搞
回复

使用道具 举报

发表于 2019-7-6 13:31 | 显示全部楼层
高手不屑搞
新手搞不定
这个主要有点耗时间  尴尬了
回复

使用道具 举报

 楼主| 发表于 2019-7-6 15:46 | 显示全部楼层
qq1254582201 发表于 2019-7-6 12:27
没有样板块怎么搞

这个不需要样板的,自己随便做一个都可以。
回复

使用道具 举报

 楼主| 发表于 2019-7-6 15:46 | 显示全部楼层
taoyi0727 发表于 2019-7-6 13:31
高手不屑搞
新手搞不定
这个主要有点耗时间  尴尬了

确实有点
回复

使用道具 举报

发表于 2019-7-6 16:06 | 显示全部楼层
你这个就是要重新做面板  要做动态的面板  我就是个半桶水,不好弄
回复

使用道具 举报

 楼主| 发表于 2019-7-6 22:02 | 显示全部楼层
taoyi0727 发表于 2019-7-6 16:06
你这个就是要重新做面板  要做动态的面板  我就是个半桶水,不好弄

固定面板也可以,  刷属性少的块, 灰色一大片都没有关系  
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 18:07 , Processed in 0.290270 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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