明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5042|回复: 21

[源码] 标注修改-梯段尺寸标注

[复制链接]
发表于 2018-1-23 00:44:31 | 显示全部楼层 |阅读模式
本帖最后由 lifuor 于 2018-1-24 18:51 编辑

更新,感谢两位坛友的帮忙,附上我这程序源码的最终版。编制的目的,主要是为了修改楼梯梯段的标注,供需要的人参考啦!
;;楼梯-梯段尺寸标注
(defun C:bztd ( / en data old_list num b n new_list )
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))
       old_list (assoc 42 data)
       num (cdr old_list)
       b (getint "\n 请输入梯段宽b<260>:")   shzi (atof (substr (rtos text 2 0) 1)) shzi这个变量,其实属于循环转换啦,其实可以不用定义的,所以删除。
)
(if (= b nil)(setq b 260))
(setq n (/ num b)
       new (strcat (rtos n 2 0) "x" (rtos b 2 0) "=" (rtos num 2 0))
       new_list (cons 1 new)
       data (subst new_list old_list data)
  )
(entmod data)
(princ "\n 转换完成!")
(prin1)
)

======
求各位坛友帮帮忙,如图片所示,我想实现点选一个标注,输入一个数字,将原有标注文字改为两个数相乘等于该标注文字。
如,原有标注2080,我运行lsp,点这个标注,输入260,就会原位变成8x260=2080的形式,变换前后如图。
我自己编写了一部分代码,但是因为水平有限,有些地方编的不对。那么正确的应该怎样呢?麻烦会的帮修改下,谢谢!
(defun C:bztd ()
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))
       old_list (assoc 1 data)
       text (cdr old_list)
       b (getint "\n 请输入梯段宽b<260>:")
       shzi (atof (substr text 1))
)
  (princ text)
(if (= b nil)(setq b 260))
(setq n (/ text b)
       new ("n"x"b"="shzi")
       new_list (cons 1 new)
       data (subst new_list old_list data)
  )
(entmod data)
(prin1)
)

本帖子中包含更多资源

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

x
发表于 2018-3-16 11:46:13 | 显示全部楼层
lifuor 发表于 2018-3-15 08:48
您好,我想在此基础上实现一次选多个标注的功能,也就是加个条件语句,我的修改如下,但是因为理论不扎实 ...

看看是不是你想要的
(defun C:bztd ( / en data old_list num b n new_list )                                       
(while (setq en (entsel "\n 請選擇標注尺寸文字:"))                                         
    (setq data (entget(car en))                                                            
        old_list (assoc 42 data) ;因為是實際的尺寸,有時(assoc 1 data)裡的值是""(空的)      
        num (cdr old_list)                                                                  
        b (getint "\n 請輸入梯段寬b<260>:")                                                
    )                                                                                       
    (if (= b nil)(setq b 260))                                                              
    (setq n (/ num b)                                                                       
        new (strcat (rtos n 2 0) "x" (rtos b 2 0) "=" (rtos num 2 0))                       
        ;文字數字連接用stract及數字轉文字rtos取實數(rtos n 2 0)如果要小數點,將0改為1或其他
       new_list (cons 1 new)                                                               
        data (subst new_list old_list data)                                                
     )                                                                                      
     (entmod data)                                                                          
)                                                                                          
(princ "\n 轉換完成!")                                                                    
(prin1)                                                                                    
)                                                                                          
還是你要選擇同一圖層的標註,因為entsel一次只能選擇一個圖元,不可多選,所以sslength會沒有作用,如果要用sslegth 要搭配ssget多重選擇才可使用。
发表于 2018-1-23 08:51:17 | 显示全部楼层
(defun C:bztd ()                                                      
(setq en (entsel "\n 請選擇標注尺寸文字:")                           
        data (entget(car en))                                         
        old_list (assoc 42 data)      ;因為他是實際的尺寸,有時(assoc 1 data) 裡的值是""(空的)                                
        text (cdr old_list)                                          
        b (getint "\n 請輸入梯段寬b<260>:")                           
        shzi (atof (substr (rtos text 2 0) 1))                        
)                                                                    
   (princ text)                                                      
(if (= b nil)(setq b 260))                                          
(setq n (/ text b)                                                   
        new (strcat (rtos n 2 0) "x" (rtos b 2 0) "=" (rtos shzi 2 0))
    ;數字和文字不能直接連結,所以要靠STRCAT 及數字轉文字RTOS 取實數(rtos n 2 0),如果要小數點可以將0改1或其他數
    new_list (cons 1 new)                                         
        data (subst new_list old_list data)                           
)                                                                    
(entmod data)                                                        
(prin1)                                                              
)                                                                    
 楼主| 发表于 2018-3-15 08:48:58 | 显示全部楼层
bssurvey 发表于 2018-1-23 08:51
(defun C:bztd ()                                                      
(setq en (entsel "\n 請選擇 ...

您好,我想在此基础上实现一次选多个标注的功能,也就是加个条件语句,我的修改如下,但是因为理论不扎实,有些问题,您方便时给看看行么?谢谢
;;楼梯-梯段尺寸标注
(defun C:bztd ( / en data old_list num b n new_list )
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))
       old_list (assoc 42 data) ;因为是实际的尺寸,有时(assoc 1 data)里的值是""(空的)
       num (cdr old_list)
       b (getint "\n 请输入梯段宽b<260>:")
       n (sslength data)
       k 0
)
(if (= b nil)(setq b 260))
(while (< k n)
   (setq n (/ num b)
       new (strcat (rtos n 2 0) "x" (rtos b 2 0) "=" (rtos num 2 0))
       ;文字数字连接用stract及数字转文字rtos取实数(rtos n 2 0)如果要小数点,将0改为1或其他
       new_list (cons 1 new)
       data (subst new_list old_list data)
    )
       (entmod data)
       (setq k (+ k 1))
    )
(princ "\n 转换完成!")
(prin1)
)
发表于 2018-1-23 08:55:17 | 显示全部楼层
(defun C:bztd ()
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))
       old_list (assoc 42 data)
       text (cdr old_list)
       b (getint "\n 请输入梯段宽b<260>:")
       shzi (atof (substr (rtos text 2) 1))
)
  (princ text)
(if (= b nil)(setq b 260))
(setq n (/ text b)
       new (strcat (rtos n 2) "X" (rtos b 2) "=" (rtos shzi 2))
       new_list (cons 1 new)
       data (subst new_list old_list data)
  )
(entmod data)
(prin1)
)
发表于 2018-1-23 09:54:03 | 显示全部楼层
谢谢分享程序!!!!!!
发表于 2018-1-23 10:24:19 | 显示全部楼层
学习一下哦
 楼主| 发表于 2018-1-23 23:32:40 | 显示全部楼层
bssurvey 发表于 2018-1-23 08:51
(defun C:bztd ()                                                      
(setq en (entsel "\n 請選擇 ...

谢谢,文字说明很实用、贴心,赞!
 楼主| 发表于 2018-1-23 23:33:07 | 显示全部楼层
琴剑江山_10184 发表于 2018-1-23 08:55
(defun C:bztd ()
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))

多谢解答!
发表于 2018-1-25 15:33:57 | 显示全部楼层
梯段宽度参数应该搞成自动记忆上次输入的数值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-19 02:38 , Processed in 0.175259 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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