石井鱼 发表于 2018-1-25 22:36:25

不怎么用这个,支持一下

lifuor 发表于 2018-1-26 20:27:24

qhdycm2017 发表于 2018-1-25 15:33
梯段宽度参数应该搞成自动记忆上次输入的数值

常用就260、280,所以没必要的

注册 发表于 2018-2-1 08:21:31


(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)
)

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)
)

LIULISHENG 发表于 2018-3-15 12:24:28

谢谢分享!

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

lifuor 发表于 2018-3-19 21:01:15

bssurvey 发表于 2018-3-16 11:46
看看是不是你想要的
(defun C:bztd ( / en data old_list num b n new_list )                        ...

麻烦帮我看看哪里有问题好么?
;;楼梯-梯段尺寸标注
(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)
)

bssurvey 发表于 2018-3-20 08:10:20

本帖最后由 bssurvey 于 2018-3-20 08:14 编辑

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)
)

lifuor 发表于 2018-3-20 23:42:46

bssurvey 发表于 2018-3-20 08:10
(defun C:bztd ( / en data old_list num b n new_list )
(prompt "\n 请选择标注尺寸文字:")
(steq...

感谢回复,只是我修改后还是运行不通。不知道哪里有问题,能烦请您再帮忙看看到底是哪里有问题好么?不盛感激!

bssurvey 发表于 2018-3-21 07:30:06

lifuor 发表于 2018-3-20 23:42
感谢回复,只是我修改后还是运行不通。不知道哪里有问题,能烦请您再帮忙看看到底是哪里有问题好么?不盛 ...

(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)
)
页: 1 [2] 3
查看完整版本: 标注修改-梯段尺寸标注