明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
123
返回列表 发新帖
楼主: 半听可乐

[已解答] 求框选文字和圆,将字高和圆直径统一

[复制链接]
发表于 2013-12-8 14:56:13 | 显示全部楼层
半听可乐 发表于 2013-12-8 10:32
大侠们一下子奉献了这么多的好作品,小弟略晕,Z版主这点睛之笔是要画在哪里呢?

DCL及fas编译版出炉。。。
  1. ;;;批量改文字高度及圆直径DCL版 by edata@2013.12.8
  2. ;;;命令默认ty 可以自定义命令
  3. ;;;dcl部分小菜选择图层多选dcl
  4. ;;;修改圆及文字采用zzxxqq版主简练语句
  5. ;;;加入出错处理

  6. ;出错函数
  7. (defun *error*_New1 (msg)
  8.   (if *error*_Old (setq *error* *error*_Old))
  9.   (if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")   
  10.     (princ "*取消*")
  11.   )
  12.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  13.   (princ)
  14. )
  15. ;对话框处理函数
  16. (defun get_lay(/ lays lay_lst x f dcl_name DCL_ID S_D b B tmp lst1 txth1 dr1)  
  17.     (vlax-map-collection (vla-get-Layers (vla-get-activedocument (vlax-get-acad-object))) '(lambda (x) (setq lay_lst (cons (vla-get-name x) lay_lst))))
  18.   (setq lays "" lay_lst (mapcar 'vl-princ-to-string lay_lst))
  19.   (setq dcl_name (strcat (getenv "temp") "\\sel_lay" ".dcl")
  20.         f (OPEN dcl_name "w"))
  21.   (write-line (strcat "sel_lay:dialog {label="批量改文字高度及圆直径DCL版 by edata@2013.12.8";spacer;:row{
  22.   :column {children_alignment = top ;fixed_height = true ;label = "设置" ;:edit_box {label = "文字高度" ; key="key_h";}:edit_box {label = "圆形直径" ;
  23.   key="key_rr";}spacer; :text{fixed_height = true ;fixed_width = true ;height = 10 ;
  24.   value = "Ctrl+鼠标左键=跳选;\\nCtrl+左键单击选中=取消;\\nShift+鼠标左键=连选;\\n鼠标左键拖动=连选; \\n鼠标双击=单选执行;\\n鼠标双击列表空白=执行;\\n默认全选图层." ;width = 26 ;}}
  25.   :list_box {label="选择图层(多选)"; key="lay_sel"; height=30; width=30; fixed_width=true; fixed_height=true;
  26.                alignment=centered; multiple_select=true; allow_accept=true;}} spacer; ok_cancel;}") f)
  27.   (close f)
  28.   (setq DCL_ID (load_dialog dcl_name))
  29.    (new_dialog "sel_lay" DCL_ID)
  30.    (start_list "lay_sel")
  31.    (mapcar 'add_list lay_lst)   
  32.    (end_list)
  33.   (if sk_txth (set_tile "key_h" (rtos sk_txth 2 2)))
  34.   (if sk_dr (set_tile "key_rr" (rtos sk_dr 2 2)))
  35.   (action_tile "lay_sel"  "(setq b $value)(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr")) (if (= $reason 4) (done_dialog 1))" )
  36.   (action_tile "lay_sel" "(setq b $value)(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr"))")
  37.   (action_tile "accept" "(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr"))(done_dialog 1)")
  38.   (action_tile "cancel" "(done_dialog)(exit)")
  39. (setq S_D (start_dialog))
  40.   (unload_dialog DCL_ID)
  41.      (if (and (= S_D 1) B)
  42.      (progn
  43.       
  44.        (foreach tmp (setq lst1 (read (strcat "(" B ")")))
  45.          (setq lays (strcat lays "," (nth tmp lay_lst)))   
  46.        )
  47.       
  48.      )
  49.    )
  50.   (if (and txth1 dr1)(list lays txth1 dr1)(list lays))
  51.   )
  52. ;主函数
  53. (defun sk_ty(/ ss en e lay_lst dc_lst f_lst)
  54.   (vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  55. (setq *error*_Old *error*)
  56. (setq *error* *error*_New1)
  57.   (or sk_dr (setq sk_dr 150))
  58.   (or sk_txth (setq sk_txth 300))
  59.   (setq dc_lst(get_lay))
  60.   (setq lay_lst(car dc_lst))
  61.   (if (and dc_lst (= (length dc_lst) 3))(progn (setq sk_txth(atof(cadr dc_lst)))(setq sk_dr(atof(caddr dc_lst)))))
  62.   (setq f_lst(list(cons 0 "*text,circle")))
  63.   (if (and lay_lst (/= lay_lst "")) (setq f_lst(cons (cons 8 lay_lst)f_lst)))
  64.   (prompt "\n请选择需要统一直径与字高的圆、文字(ESC取消):")
  65.   (if (setq ss(ssget f_lst))
  66.     (progn
  67.       (while (setq en(ssname ss 0))
  68.         (setq e(entget en))
  69.   ;;;zzxxqq版主简写代码
  70.   (entmod (subst (cons 40 (if (= (cdr(assoc 0 e)) "CIRCLE" ) (* sk_dr 0.5) sk_txth)) (assoc 40 e) e))
  71.         (setq ss(ssdel en ss))
  72.         )
  73.       )
  74.     (princ "\n 没有选中对象 !!!")
  75.     )
  76.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  77.   (if *error*_Old (setq *error* *error*_Old))
  78.     (princ)
  79.     )
  80. ;自定义命令修改
  81. (defun c:ty()(sk_ty))
  82. (vl-load-com)
  83. (prompt"\n批量改文字高度及圆直径DCL版 命令 ty ")
  84. (princ)


  85.             
  86.             
  87.             
  88.             
  89.                
  90.             
  91.             
  92.                
  93.             
  94.         



本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
半听可乐 + 1 非常感激!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-12-8 15:46:13 | 显示全部楼层
edata 发表于 2013-12-8 14:56
DCL及fas编译版出炉。。。

越来越高级了,但我还是希望能够预先定义一些图层,因为我图纸里的图层太多了,在列表里选择图层有些困难。其实你的第一个程序就够用了,这个要求有些吹毛求疵,主要就是想在图层全开的情况下框选大量图元然后程序能对预定义图层上的图元自动执行,其实这个功能完全可以通过先过滤图层,然后使用你的原始版程序来实现,既然大侠热心,也可以考虑一下预定义图层而不是在列表里去选择
回复

使用道具 举报

发表于 2013-12-8 17:47:16 | 显示全部楼层
半听可乐 发表于 2013-12-7 15:59
朋友,如果我想增加个图层识别功能怎么改呢?即只希望修改指定图层中的文字和圆,指定的图层在程序中预先 ...

把(ssget '((0 . "*text,circle"))) 替换成:(ssget (list '(0 . "*text,circle") (cons 8 图层名)))
回复

使用道具 举报

发表于 2013-12-8 18:06:43 | 显示全部楼层
edata 发表于 2013-12-7 20:56
DCL及fas编译版出炉。。。

师兄利害
回复

使用道具 举报

发表于 2013-12-8 18:11:42 | 显示全部楼层
半听可乐 发表于 2013-12-8 15:46
越来越高级了,但我还是希望能够预先定义一些图层,因为我图纸里的图层太多了,在列表里选择图层有些困难 ...

预定义图层是固定的吗。
回复

使用道具 举报

发表于 2013-12-8 20:55:51 | 显示全部楼层
  1. ;;;批量改文字高度及圆直径DCL版 by edata@2013.12.8
  2. ;;;命令默认ty 可以自定义命令
  3. ;;;dcl部分小菜选择图层多选dcl
  4. ;;;修改圆及文字采用zzxxqq版主简练语句
  5. ;;;加入出错处理

  6. ;出错函数
  7. (defun *error*_New1 (msg)
  8.   (if *error*_Old (setq *error* *error*_Old))
  9.   (if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")   
  10.     (princ "*取消*")
  11.   )
  12.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  13.   (princ)
  14. )
  15. ;对话框处理函数
  16. (defun get_lay(/ lays lay_lst x f dcl_name DCL_ID S_D b B tmp lst1 txth1 dr1)
  17.   (setq lays "" lay_lst (list
  18.         "0" "家电" "工作" "dim" ;替换图层名
  19.         ))
  20.   (setq dcl_name (strcat (getenv "temp") "\\sel_lay" ".dcl")
  21.         f (OPEN dcl_name "w"))
  22.   (write-line (strcat "sel_lay:dialog {label="批量改文字高度及圆直径DCL版 by edata@2013.12.8";spacer;:row{
  23.   :column {children_alignment = top ;fixed_height = true ;label = "设置" ;:edit_box {label = "文字高度" ; key="key_h";}:edit_box {label = "圆形直径" ;
  24.   key="key_rr";}spacer; :text{fixed_height = true ;fixed_width = true ;height = 10 ;
  25.   value = "Ctrl+鼠标左键=跳选;\\nCtrl+左键单击选中=取消;\\nShift+鼠标左键=连选;\\n鼠标左键拖动=连选; \\n鼠标双击=单选执行;\\n鼠标双击列表空白=执行;\\n默认全选图层." ;width = 26 ;}}
  26.   :list_box {label="选择图层(多选)"; key="lay_sel"; height=30; width=30; fixed_width=true; fixed_height=true;
  27.                alignment=centered; multiple_select=true; allow_accept=true;}} spacer; ok_cancel;}") f)
  28.   (close f)
  29.   (setq DCL_ID (load_dialog dcl_name))
  30.    (new_dialog "sel_lay" DCL_ID)
  31.    (start_list "lay_sel")
  32.    (mapcar 'add_list lay_lst)   
  33.    (end_list)
  34.   (if sk_txth (set_tile "key_h" (rtos sk_txth 2 2)))
  35.   (if sk_dr (set_tile "key_rr" (rtos sk_dr 2 2)))
  36.   (action_tile "accept" "(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr"))(done_dialog 1)")
  37.   (action_tile "cancel" "(done_dialog)(exit)")
  38. (setq S_D (start_dialog))
  39.   (unload_dialog DCL_ID)
  40.   (foreach tmp lay_lst
  41.          (setq lays (strcat lays "," tmp))   
  42.        )
  43.   (if (and txth1 dr1)(list lays txth1 dr1)(list lays))
  44.   )
  45. ;主函数
  46. (defun sk_ty(/ ss en e lay_lst dc_lst f_lst)
  47.   (vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  48. (setq *error*_Old *error*)
  49. (setq *error* *error*_New1)
  50.   (or sk_dr (setq sk_dr 150))
  51.   (or sk_txth (setq sk_txth 300))
  52.   (setq dc_lst(get_lay))
  53.   (setq lay_lst(car dc_lst))
  54.   (if (and dc_lst (= (length dc_lst) 3))(progn (setq sk_txth(atof(cadr dc_lst)))(setq sk_dr(atof(caddr dc_lst)))))
  55.   (setq f_lst(list(cons 0 "*text,circle")))
  56.   (if (and lay_lst (/= lay_lst "")) (setq f_lst(cons (cons 8 lay_lst)f_lst)))
  57.   (prompt "\n请选择需要统一直径与字高的圆、文字(ESC取消):")
  58.   (if (setq ss(ssget f_lst))
  59.     (progn
  60.       (while (setq en(ssname ss 0))
  61.         (setq e(entget en))
  62.   ;;;zzxxqq版主简写代码
  63.   (entmod (subst (cons 40 (if (= (cdr(assoc 0 e)) "CIRCLE" ) (* sk_dr 0.5) sk_txth)) (assoc 40 e) e))
  64.         (setq ss(ssdel en ss))
  65.         )
  66.       )
  67.     (princ "\n 没有选中对象 !!!")
  68.     )
  69.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  70.   (if *error*_Old (setq *error* *error*_Old))
  71.     (princ)
  72.     )
  73. ;自定义命令修改
  74. (defun c:ty()(sk_ty))
  75. (vl-load-com)
  76. (prompt"\n批量改文字高度及圆直径DCL版 命令 ty ")
  77. (princ)
如果预定是固定的话可以用这个,图层名替换一下。。
回复

使用道具 举报

发表于 2013-12-9 10:08:02 | 显示全部楼层
半听可乐 发表于 2013-12-8 15:46
越来越高级了,但我还是希望能够预先定义一些图层,因为我图纸里的图层太多了,在列表里选择图层有些困难 ...



DCL版本图层更新
图层分为列表和过滤,在过滤列表里将被选择
双击列表图层名将添加或删除图层。
也可以通过选择图形获得图层
------------------------------------
  1. ;;;批量改文字高度及圆直径DCL版 by edata@2013.12.8
  2. ;;;命令默认ty 可以自定义命令
  3. ;;;dcl部分小菜选择图层多选dcl
  4. ;;;修改圆及文字采用zzxxqq版主简练语句
  5. ;;;加入出错处理

  6. ;出错函数
  7. (defun *error*_New1 (msg)
  8.   (if *error*_Old (setq *error* *error*_Old))
  9.   (if (wcmatch (strcase msg t) "*break,*cancel*,*exit*,*取消*")   
  10.     (princ "*取消*")
  11.   )
  12.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  13.   (princ)
  14. )
  15. ;修改函数
  16. (defun sk_xiugai (sk_txth  sk_dr lay_lst / f_lst  ss en e )
  17.     (setq f_lst(list(cons 0 "*text,circle")))
  18.   (if (and lay_lst (/= lay_lst "") (/= lay_lst ",")) (setq f_lst(cons (cons 8 lay_lst)f_lst)))
  19.   (prompt "\n请选择需要统一直径与字高的圆、文字(ESC取消):")
  20.   (if (setq ss(ssget f_lst))
  21.     (progn
  22.       (while (setq en(ssname ss 0))
  23.         (setq e(entget en))
  24.   ;;;zzxxqq版主简写代码
  25.   (entmod (subst (cons 40 (if (= (cdr(assoc 0 e)) "CIRCLE" ) (* sk_dr 0.5) sk_txth)) (assoc 40 e) e))
  26.         (setq ss(ssdel en ss))
  27.         )
  28.       )
  29.     (princ "\n 没有选中对象 !!!")
  30.     ))
  31. ;对话框处理函数
  32. (defun get_lay(/ lays lay_lst x f dcl_name DCL_ID S_D b B tmp lst1 txth1 dr1 lays)  
  33.     (vlax-map-collection (vla-get-Layers (vla-get-activedocument (vlax-get-acad-object))) '(lambda (x) (setq lay_lst (cons (vla-get-name x) lay_lst))))
  34.   (setq lays "" lay_lst (mapcar 'vl-princ-to-string lay_lst))
  35.   (setq dcl_name (strcat (getenv "temp") "\\sel_lay" ".dcl")
  36.         f (OPEN dcl_name "w"))
  37.   (write-line (strcat "sel_lay:dialog {label="批量改文字高度及圆直径DCL版V1.3 by edata@2013.12.9";spacer;:row{
  38.   :column {children_alignment = top ;fixed_height = true ;label = "设置" ;:edit_box {label = "文字高度" ; key="key_h";}:edit_box {label = "圆形直径" ;
  39.   key="key_rr";}spacer; :text{fixed_height = true ;fixed_width = true ;height = 10 ;
  40.   value = "在图层列表里鼠标双击加入过滤组;\\n在过滤列表双击删除;\\n清空按钮清空过滤;\\n过滤列表空则不过滤图层; " ;width = 26 ;}}
  41. :column{label="选择图层加入过滤";:list_box { key="lay_sel"; height=30; width=30; fixed_width=true; fixed_height=true;
  42.                alignment=centered; multiple_select=false; allow_accept=false;} }
  43.   :column{label="过滤图层";:list_box { key="lay_sel2"; height=30; width=30; fixed_width=true; fixed_height=true;
  44.                alignment=centered; multiple_select=false; allow_accept=false;} :row{:button {label="拾取图形加入>>";key="key_en";}
  45.                :button {label="清空";key="key_qc";}}}} spacer; ok_cancel;}") f)
  46.   (close f)
  47.   (setq DCL_ID (load_dialog dcl_name))
  48.    (new_dialog "sel_lay" DCL_ID)
  49.    (start_list "lay_sel")
  50.    (mapcar 'add_list lay_lst)   
  51.    (end_list)
  52.   (if n_lays (progn
  53.   (start_list "lay_sel2")
  54.    (mapcar 'add_list n_lays)   
  55.    (end_list)))
  56.   (if sk_txth (set_tile "key_h" (rtos sk_txth 2 2)))
  57.   (if sk_dr (set_tile "key_rr" (rtos sk_dr 2 2)))
  58.   (defun delsame (lst)
  59.     (if lst
  60.       (cons (car lst) (delsame (vl-remove (car lst) lst)))
  61.     )
  62.   )
  63.   (defun sk_addlist(layx k_i / s1 s2)
  64.     (or n_lays (setq n_lays '()))
  65.     (setq n_lays  (cons (nth k_i layx) n_lays))
  66.     (setq n_lays(delsame n_lays))
  67.     (setq n_lays (vl-sort
  68.    n_lays
  69.    '(lambda (s1 s2)
  70.     (< (car(vl-string->list s1)) (car(vl-string->list s2))))))   
  71.     (start_list "lay_sel2")
  72.    (mapcar 'add_list n_lays)   
  73.    (end_list)
  74.     )
  75.   (defun sk_declist(layd k_d / s1 s2)
  76.     (or n_lays (setq n_lays '()))
  77.     (setq n_lays  (vl-remove (nth k_d layd) n_lays))
  78.     (setq n_lays(delsame n_lays))
  79.     (setq n_lays (vl-sort
  80.    n_lays
  81.    '(lambda (s1 s2)
  82.     (< (car(vl-string->list s1)) (car(vl-string->list s2))) )))   
  83.     (start_list "lay_sel2")
  84.    (mapcar 'add_list n_lays)   
  85.    (end_list)
  86.     )
  87.   (defun k_qc()
  88.     (setq n_lays '())
  89.     (start_list "lay_sel2")
  90.     (mapcar 'add_list n_lays)
  91.     (end_list)
  92.     )
  93.   (defun sk_adden(/ ssen enl enlay s1 s2)   
  94.     (princ "\n选择参考对象:")
  95.     (if(setq ssen(ssget))
  96.       (progn
  97.   (or n_lays(setq n_lays '()))
  98.   (while (setq enl(ssname ssen 0))
  99.     (setq enlay(cdr (assoc 8 (entget enl))))
  100.     (setq n_lays(cons enlay n_lays))
  101.     (setq ssen (ssdel enl ssen))
  102.     )
  103.   (setq n_lays(delsame n_lays))
  104.   (setq n_lays (vl-sort
  105.    n_lays
  106.    '(lambda (s1 s2)
  107.     (< (car(vl-string->list s1)) (car(vl-string->list s2))))))  
  108.   )
  109.       )      
  110.     (get_lay)
  111.     )
  112.   (action_tile "key_qc" "(k_qc)")
  113.   (action_tile "key_en" "(done_dialog 3)")
  114.   (action_tile "lay_sel2" "(setq b $value)(sk_declist n_lays (atoi b))")
  115.   (action_tile "lay_sel" "(sk_addlist lay_lst (atoi $value))(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr"))")
  116.   (action_tile "accept" "(setq txth1 (get_tile "key_h"))(setq dr1 (get_tile "key_rr"))(done_dialog 1)")
  117.   (action_tile "cancel" "(done_dialog)(exit)")
  118. (setq S_D (start_dialog))
  119.   (unload_dialog DCL_ID)
  120.   (cond
  121.        ((= S_D 1)(progn (foreach tmp n_lays (setq lays (strcat lays "," tmp)))(sk_xiugai (setq sk_txth(atof txth1))  (setq sk_dr(atof dr1)) lays)))
  122.        ((= S_D 3)(sk_adden))
  123.    )  
  124.   )

  125. ;主函数
  126. (defun sk_ty(/ )
  127.   (vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  128. (setq *error*_Old *error*)
  129. (setq *error* *error*_New1)
  130.   (or n_lays (setq n_lays (list "" )))
  131.   (or sk_dr (setq sk_dr 150))
  132.   (or sk_txth (setq sk_txth 300))
  133.   (get_lay)  
  134.   (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  135.   (if *error*_Old (setq *error* *error*_Old))
  136.     (princ)
  137.     )
  138. ;自定义命令修改
  139. (defun c:ty()(sk_ty))
  140. (vl-load-com)
  141. (prompt"\n批量改文字高度及圆直径DCL版 命令 ty ")
  142. (princ)


  143.             
  144.             
  145.             
  146.             
  147.                
  148.             
  149.             
  150.                
  151.             
  152.         

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2013-12-9 12:46:23 | 显示全部楼层
edata 发表于 2013-12-8 20:55
如果预定是固定的话可以用这个,图层名替换一下。。

大侠,很完美了,非常感谢!这下方便了好多
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-26 03:02 , Processed in 0.159305 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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