更新,感谢两位坛友的帮忙,附上我这程序源码的最终版。编制的目的,主要是为了修改楼梯梯段的标注,供需要的人参考啦!
;;楼梯-梯段尺寸标注
(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)
)
看看是不是你想要的
(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多重選擇才可使用。
您好,我想在此基础上实现一次选多个标注的功能,也就是加个条件语句,我的修改如下,但是因为理论不扎实,有些问题,您方便时给看看行么?谢谢
;;楼梯-梯段尺寸标注
(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)
)
(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)
)