lifuor 发表于 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)
)

bssurvey 发表于 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多重選擇才可使用。

bssurvey 发表于 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)                                                            
)                                                                  

lifuor 发表于 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 00:45:34

小板凳:lol

琴剑江山_10184 发表于 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)
)

yoyoho 发表于 2018-1-23 09:54:03

谢谢分享程序!!!!!!

LIULISHENG 发表于 2018-1-23 10:24:19

学习一下哦

panliang9 发表于 2018-1-23 11:24:57

谢谢分享!

lifuor 发表于 2018-1-23 23:32:40

bssurvey 发表于 2018-1-23 08:51
(defun C:bztd ()                                                      
(setq en (entsel "\n 請選擇 ...

谢谢,文字说明很实用、贴心,赞!

lifuor 发表于 2018-1-23 23:33:07

琴剑江山_10184 发表于 2018-1-23 08:55
(defun C:bztd ()
(setq en (entsel "\n 请选择标注尺寸文字:")
       data (entget(car en))


多谢解答!

qhdycm2017 发表于 2018-1-25 15:33:57

梯段宽度参数应该搞成自动记忆上次输入的数值
页: [1] 2 3
查看完整版本: 标注修改-梯段尺寸标注