(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 0) "X" (rtos b 2 0) "=" (rtos shzi 2 0))
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 )
(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 ( / 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 )
(prompt "\n 请选择标注尺寸文字:")
(steq ss (ssget)
k 0
b (getint "\n 请输入梯段宽b<260>:")
)
(if (= b nil)(setq b 260))
(repeat (sslength ss)
(setq en (ssname ss k)
data (entget(cdr en))
old_list (assoc 42 data)
num (cdr old_list)
)
(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)
(setq k (1+k))
)
(princ "\n 转换完成!")
(prin1)
)
lifuor 发表于 2018-3-19 21:01
麻烦帮我看看哪里有问题好么?
;;楼梯-梯段尺寸标注
(defun C:bztd ( / en data old_list num b n new_ ...
(defun C:bztd ( / en data old_list num b n new_list )
(prompt "\n 请选择标注尺寸文字:")
(steq ss (ssget)
;這裡應該是(setq ss(ssget) k 0
b (getint "\n 请输入梯段宽b<260>:")
)
(if (= b nil)(setq b 260))
(repeat (sslength ss)
(setq en (ssname ss k)
data (entget(cdr en)) ;這裡的cdr用不到,因為不是用entsel是用ssget
old_list (assoc 42 data)
num (cdr old_list)
)
(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)
(setq k (1+k)) ;空格位置放錯 (setq k(1+ k))
)
(princ "\n 转换完成!")
(prin1)
)
(defun C:bztd ( / en data old_list num b n new_list )
(prompt "\n 請選擇標注尺寸文字:")
(setq ss (ssget)
k 0
b (getint "\n 請輸入梯段寬b<260>:")
)
(if (= b nil)(setq b 260))
(repeat (sslength ss)
(setq en (ssname ss k)
data (entget en)
old_list (assoc 42 data)
num (cdr old_list)
)
(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)
(setq k(1+ k))
)
(princ "\n 轉換完成!")
(prin1)
)