text文本表示的数字计算

分类:lisp函数 | 标签: text   文本   数字   计算  
2008-04-07 21:53 阅读(?)评论(0)

;;;加载对 C:CAL 函数的支持
(if (or (= (type c:cal) 'list)  ;R14使用
 (= (type c:cal) 'SUBR)  ;R2000+使用
 (= (type c:cal) NIL)  ;R2004使用
    )
    (arxload "geomcal.arx")
)

(vl-load-com)
;;;==================================================================
;;;功能:text文本表示的数字计算
(defun C:.. (/ *LST_01 *STR *LST *NNN_MIN *NNN_LST *N *SS *I *ENT Z
      *ENT_LST *NUM)
    ;;分隔符 和 运算符
    (setq *LST_01 '((" ") ("(") (")") ("+") ("-") ("*") ("/") ("^")))
    ;;获取计算公式
    (princ
 (strcat
     "\n>>>小提示: A、B...打头表示一列文本;"
     "\n           I、J...打头表示单个文本;"
     "\n           Z表示结果对象本身;"
 )
    )
    (if (and (setq *STR (getstring t "\n请输入公式: "))
      (setq *LST (ZL-STR-SUB2 *STR *LST_01))
 )
 (progn
     ;;初始化
     (setq *NNN_MIN 1000000000) ;_记录最小的一组对象个数
     (setq *NNN_LST '()) ;_存放选择对象的表
     ;;提示用户,选取对象
     (foreach *N *LST
  (cond
      ;;判断是否是分隔符 和 运算符
      ((assoc *N *LST_01)
       () ;_不做处理,跳过
      )
      ;;判断是否以 Z,表示结果对象本身
      ((= (ascii (strcase *N)) 90)
   () ;_不做处理,跳过
      )
      ;;判断是否是lisp函数
      ((= (type (read *n)) 'SUBR);_这句不妥
   ()
      )
      ;;判断是否以 A、B...打头
      ((<= 65 (ascii (strcase *N)) 72)
       (if (assoc *N *NNN_LST)
    ()
    (progn
        (princ (strcat "\n>>>选取 " *N " 对象..."))
        (if (setq *SS (ssget '((0 . "TEXT"))))
     (progn
         (setq *NNN_MIN
           (min (sslength *SS) *NNN_MIN)
         )
         ;;构建表,并排序
         (setq *ENT_LST (SS->LST *SS))
         ;;
         (setq
      *NNN_LST
         (cons
      (cons *N *ENT_LST)
      *NNN_LST
         )
         )
     )
     ()
        )
    )
       )
      )
      ;;判断是否以 I、J...打头
      ((<= 73 (ascii (strcase *N)) 89)
       (if (setq *SS (entsel (strcat "\n点取选择 " *N)))
    (set (read *N)
         (read (cdr (assoc 1 (entget (car *SS))))
         )
    )
    (set (read *N) 0.0)
       )
       (princ "  ")
       (princ (eval (read *N)))
      )
      ;;如果有其他符号存在,则提示一下
      (t
       (princ "\n存在约定外符号: ")
       (princ *N)
      )
  )
     )
     ;;计算
     (princ "\n>>>>>>>>>>>>>>>>>>>>>>")
     (princ "\n>>>选择结果存放位置... ")
     (if (setq *SS (ssget '((0 . "TEXT"))))
  (progn
      (setq *NNN_MIN
        (min (sslength *SS) *NNN_MIN)
      )
      ;;构建表,并排序
      (setq *ENT_LST (SS->LST *SS))
      (setq *I 0)
      (repeat *NNN_MIN
   ;;本身对象赋值
   (setq *ENT (nth *I *ENT_LST)
         Z    (read (cdr (assoc 1 *ENT))) ;_read 函数有待改进
   )
   ;;对一列选择的对象赋值
   (foreach *N *NNN_LST
       (set (read (car *N))
     (read (cdr (assoc 1 (nth (1+ *I) *N))))
       )
   )
   ;;计算
   (if (or (setq *NUM (eval (read *STR)))
    (setq *NUM (c:cal *STR))
       )
       (progn
    ;;(princ NUM)
    (setq
        *ENT
           (subst (cons 1 (rtos *NUM 2 2))
           (assoc 1 *ENT)
           *ENT
           )
    )
    (entmod *ENT)
       )
   )
   (setq *I (1+ *I))
      )
  )
     )
     ;;
     ()
 )
    )
    (princ)
)
;;;==================================================================

;;;====================================================
;;;      函数二                                       
;;;功能:字符串按照符进行分割                         
;;;参数:STR ----欲分割的字符串,支持汉字             
;;;      LST ----分隔符表,大小写敏感                 
;;;日期:zml84 于 2008-02-19                          
;;;示例:(ZL-STR-SUB2 "1N3.5(2)" '(("N")("(" ")")))   
;;;       ===>>  ("1" "N" "3.5" "(2)")                
;;;示例:(ZL-STR-SUB2 "abc汉字2(1.5)" '(("汉""字")))  
;;;       ===>>  ("abc" "汉字" "2(1.5)")              
(defun ZL-STR-SUB2 (STR LST / I LST2 LST_TMP STRI STR_TMP)
    (setq LST2 '()) ;_存放结果的变量
    (setq STR_TMP "")
    (while (/= STR "")
 (if (> (ascii (substr STR 1 1)) 159)
     (setq STRI (substr STR 1 2)
    STR  (substr STR 3)
     )
     (setq STRI (substr STR 1 1)
    STR  (substr STR 2)
     )
 )
 (if (setq LST_TMP (assoc STRI LST))
     (progn
  (if (/= STR_TMP "")
      (setq LST2   (cons STR_TMP LST2)
     STR_TMP ""
      )
  )
  (cond
      ((= 1 (length LST_TMP))
       (setq LST2 (cons STRI LST2))
      )
      ((= 2 (length LST_TMP))
       (if (setq I (vl-string-search (cadr LST_TMP) STR))
    (setq LST2 (cons
     (strcat STRI
      (substr STR 1 I)
      (cadr LST_TMP)
     )
     LST2
        )
          STR  (substr STR
         (+ 1 I (strlen (cadr LST_TMP)))
        )
    )
    (setq LST2 (cons STR LST2)
          STR  ""
    )
       )
      )
  )
     )
     (setq STR_TMP (strcat STR_TMP STRI))
 )
    )
    (if (/= STR_TMP "")
 (setq LST2 (cons STR_TMP LST2))
    )
    (reverse LST2)
) ;_结束defun
;;;==================================
;;;功能:选择集转换到组码表,并排序
(defun SS->LST (SS / LST I)
    (setq LST '()
   I   0
    )
    (repeat (sslength SS)
 (setq LST (cons (entget (ssname SS I)) LST))
 (setq I (1+ I))
    )
    ;;排序
    (setq LST (vl-sort LST
         (function
      (lambda (*E1 *E2)
          ;;按照x坐标排序
          ;;(< (car (cdr (assoc 10 *e1))) (car (cdr (assoc 10 *e2))))
          ;;按照Y坐标排序
          (< (cadr (cdr (assoc 10
          *E1
          )
     )
      )
      (cadr (cdr (assoc 10
          *E2
          )
     )
      )
          )
      )
         )
       )
    )
    ;;返回
    LST
)
;;;================================== 

   阅读(?)评论(0)
 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明