사칙연산 리습인데 숫자의 음수인식을 못합니다.
예를 들면 더하기를 했을 때 숫자 15와 숫자 -2를 선택하면 13 나와야 하는데 17이 나옵니다.
도와주십시오~
파일올리기가 안되서 파일내용 올립니다
;;==================================================================
; 숫자 더하기(98주말농부)
; ->숫자가 포함된 문자을 다중선택후 숫자만을 더한값을 자동으로 표기
; ->설정값변경 옵션추가/자리수 선택가능(2007.5.14)
;;—— Number plus ———————————————–
(defun c:=(/ os ot ts a yn ht dot ss grpt pt1 ssn txnum-lst en tx k
pn ar1 ar2 ar3)
;->*error* start
(defun *error* (msg)(princ “error: “)(princ msg)
(setvar “osmode” os)(setvar “orthomode” ot)
(princ))
;-<*error* end
(prompt “…더하기”)
(setq os (getvar “osmode”) ot (getvar “orthomode”)
ts (getvar “textsize”))
(setvar “orthomode” 0) (setvar “osmode” 0)
(if (= dwnp nil) (setq dwnp 2))
;->설정값 변경
(setq a (strcat “n현재 설정값(문자높이=” (rtos ts 2 1)
“,자리수=” (rtos dwnp 2 0) “)을 변경할까요? [Y/N] <N> : “))
(initget “Yes No”)
(setq yn (getkword a))
(if (= yn “Yes”)
(progn
(setq a (strcat “n문자높이<” (rtos ts 2 1) “>:”))
(setq ht (getdist a))
(if (= ht nil) (setq ht ts))
(setq a (strcat “n소수점 자리수을 지정<” (rtos dwnp 2 0) “>:”))
(setq tem (getint a))
(if (= tem nil) (setq dot dwnp) (setq dot (abs tem)) )
(setq dwnp dot)
)
(setq ht ts dot dwnp)
)
;-<
(setq ss (ssget ‘((0 . “text”))))
(setq grpt (grread T))
(setq pt1 (cadr grpt))
(setq ssn (sslength ss))
(setq txnum-lst nil);리스트 초기화
(setq k 0)
(repeat ssn
(setq en (ssname ss k))
(setq tx (cdr (assoc 1 (entget en))))
;->문자내에 컴마 없애기
(setq pn (vl-string-position (ascii “,”) tx));nil
(while pn
(setq tx (strcat (substr tx 1 pn) (substr tx (+ pn 2)) ))
(setq pn (vl-string-position (ascii “,”) tx))
)
;-<
(setq txnum-lst (append (@tx_num_lst tx) txnum-lst))
(setq k (+ k 1))
)
(setq ar1 (apply ‘+ txnum-lst))
(setq ar2 (rtos ar1 2 dot))
(if (>= dot 1)
(setq ar3 (@tx_dot ar2 dot))
(setq ar3 ar2)
)
(command “text” “j” “r” pt1 ht “0” ar3)
(prompt “nEnter text point->”)
(command “move” “l” “” pt1 pause)
(setvar “osmode” os)(setvar “orthomode” ot)
(prin1))
;;==========================================================
; 자릿수 맞추기(2007.05.주말농부)
; ->문자로된 숫자의 자리수를 맞추고 문자로 되돌리기
;;———————————————————-
(defun @tx_dot(tx dot / k k1 tx tx1 tx2 tx3)
(setq k1 (vl-string-position (ascii “.”) tx))
(if (= k1 nil) (setq tx1 (strcat tx “.0”)) (setq tx1 tx))
(setq k (strlen tx1))
(setq k1 (vl-string-position (ascii “.”) tx1))
(setq tx2 (substr tx1 1 (+ k1 1)))
(setq tx3 (substr tx1 (+ k1 2)))
(setq k (strlen tx3))
(while (< k dot)
(setq tx3 (strcat tx3 “0”))
(setq k (strlen tx3))
)
(strcat tx2 tx3)
)
;;========================================================
; 숫자 리스트 작성(2007.05.주말농부)
; ->문자중 숫자만의 리스트을 만드는 리습 (tx->txnum-lst)
;;——————————————————–
(defun @tx_num_lst(tx / txn k tx1 tx2 tx3 txnum-lst)
(setq txn (strlen tx) tx2 “” txnum-lst nil k 1 )
(repeat (+ txn 1)
(setq tx1 (substr tx k 1))
(if (or (= 46 (ascii tx1)) (<= 48 (ascii tx1) 57))
(setq tx2 (strcat tx2 tx1))
(progn
(if (/= tx2 “”)(setq txnum-lst (append txnum-lst (list (atof tx2)))) )
(setq tx2 “”)
) )
(setq k (1+ k))
)
txnum-lst)
;;=====================================================================
; 숫자 빼기(98 주말농부)
; ->처음선택한 수에서 나중에 선택된 수 들을 빼고 결과를 화면에 표기함
; ->숫자가 포함된 문자을 선택하면 숫자만을 계산함(2007.5.23)
; ->설정값변경 옵션추가/자리수 선택가능(2007.5.23)
;;—— Number minus ————————————————-
(defun c:-(/ os ot ts a yn ht dot ss grpt pt1 ssn txnum-lst en tx k
pn ar1 ar2 ar3)
;->*error* start
(defun *error* (msg)(princ “error: “)(princ msg)
(setvar “osmode” os)(setvar “orthomode” ot)
(princ))
;-<*error* end
(prompt “…빼기”)
(setq os (getvar “osmode”) ot (getvar “orthomode”)
ts (getvar “textsize”))
(setvar “orthomode” 0) (setvar “osmode” 0)
(if (= dwnm nil) (setq dwnm 2))
;->설정값 변경
(setq a (strcat “n현재 설정값(문자높이=” (rtos ts 2 1)
“,자리수=” (rtos dwnm 2 0) “)을 변경할까요? [Y/N] <N> : “))
(initget “Yes No”)
(setq yn (getkword a))
(if (= yn “Yes”)
(progn
(setq a (strcat “n문자높이<” (rtos ts 2 1) “>:”))
(setq ht (getdist a))
(if (= ht nil) (setq ht ts))
(setq a (strcat “n소수점 자리수을 지정<” (rtos dwnm 2 0) “>:”))
(setq tem (getint a))
(if (= tem nil) (setq dot dwnm) (setq dot (abs tem)) )
(setq dwnm dot)
)
(setq ht ts dot dwnm)
)
;-<
(setq ss (ssget ‘((0 . “text”))))
(setq grpt (grread T))
(setq pt1 (cadr grpt))
(setq ssn (sslength ss))
(setq txnum-lst nil);리스트 초기화
(setq k (- ssn 1))
(repeat ssn
(setq en (ssname ss k))
(setq tx (cdr (assoc 1 (entget en))))
;->문자내에 컴마 없애기
(setq pn (vl-string-position (ascii “,”) tx));nil
(while pn
(setq tx (strcat (substr tx 1 pn) (substr tx (+ pn 2)) ))
(setq pn (vl-string-position (ascii “,”) tx))
)
;-<
(setq txnum-lst (append (@tx_num_lst tx) txnum-lst))
(setq k (- k 1))
)
(setq ar1 (apply ‘- txnum-lst))
(setq ar2 (rtos ar1 2 dot))
(if (>= dot 1)
(setq ar3 (@tx_dot ar2 dot))
(setq ar3 ar2)
)
(command “text” “j” “r” pt1 ht “0” ar3)
(prompt “nEnter text point->”)
(command “move” “l” “” pt1 pause)
(setvar “osmode” os)(setvar “orthomode” ot)
(prin1))
숫자가 포함된 문자을 다중선택후 숫자만을 더한값을 자동으로 표기
-2를 @tx_num_lst 함수에서 2로 바꿔버리는 거 같네요