2012년 12월 25일 화요일

[LISP-GSJ] 콤마붙이는 프로그램 (포스트아이디 : 431355445408298573)


;;=====================================================================================================
;; http://cafe.daum.net/zwcad & http://www.lispcenter.net
;;=====================================================================================================
;; 선택된 객체들 중에서 콤마를 제거한다.
;; 숫자 형태의 문자열이 아니어도 콤마가 존재하면 모두 제거한다.
;;=====================================================================================================
(defun C:RC( / SSetEnt01 SSetEnt02 EntCount01 EntCount02 CountNum01 CountNum02 EntName EntList EntType TextVal TextVal01 TextVal02)
   ;;--------------------------------------------------------------------------------------------------
   (setq SSetEnt01 nil)
   (setq SSetEnt02 nil)
   (setq SSetEnt01 (ssget))
   ;;--------------------------------------------------------------------------------------------------
   (if (/= SSetEnt01 nil)
       (setq EntCount01 (sslength SSetEnt01))
       (setq EntCount01 0)
   )
   ;;--------------------------------------------------------------------------------------------------
   (setq SSetEnt02 (ssadd))
   (setq CountNum01 0)
   (repeat EntCount01
           (setq EntName (ssname SSetEnt01 CountNum01))
           (setq EntList (entget EntName))
           (setq EntType (cdr (assoc 0 EntList)))
           (if (or (= "TEXT" EntType) (= "MTEXT" EntType))
               (progn
                    (setq TextVal (cdr (assoc 1 EntList)))
                    (if (> (PatternCount TextVal ",") 0)
                        (ssadd EntName SSetEnt02)
                    )
               )
           )
           (setq CountNum01 (+ CountNum01 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   (if (/= SSetEnt02 nil)
       (setq EntCount02 (sslength SSetEnt02))
       (setq EntCount02 0)
   )
   ;;--------------------------------------------------------------------------------------------------
   (setq CountNum02 0)
   (repeat EntCount02
           (setq EntName (ssname SSetEnt02 CountNum02))
           (setq EntList (entget EntName))
           (setq TextVal01 (cdr (assoc 1 EntList)))
           (setq TextVal02 (RemoveChar TextVal01 ","))
           (setq TextVal01 (assoc 1 EntList))
           (setq TextVal02 (cons 1 TextVal02))
           (setq EntList (subst TextVal02 TextVal01 EntList))
           (entmod EntList)
           (setq CountNum02 (+ CountNum02 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   (princ (strcat "\n" (itoa EntCount01) "개의 객체 중에서 " (itoa EntCount02) "개의 문자열을 수정했습니다!"))
   ;;--------------------------------------------------------------------------------------------------
   (princ)
)
;;=====================================================================================================
;;=====================================================================================================
;; 선택된 객체들 중에서 숫자 형태의 문자열에 콤마를 삽입한다.
;;=====================================================================================================
(defun C:IC( / SSetEnt01 SSetEnt02 EntCount01 EntCount02 CountNum01 CountNum02 EntName EntList EntType TextVal TextVal01 TextVal02)
   ;;--------------------------------------------------------------------------------------------------
   (setq SSetEnt01 nil)
   (setq SSetEnt02 nil)
   (setq SSetEnt01 (ssget))
   ;;--------------------------------------------------------------------------------------------------
   (if (/= SSetEnt01 nil)
       (setq EntCount01 (sslength SSetEnt01))
       (setq EntCount01 0)
   )
   ;;--------------------------------------------------------------------------------------------------
   (setq SSetEnt02 (ssadd))
   (setq CountNum01 0)
   (repeat EntCount01
           (setq EntName (ssname SSetEnt01 CountNum01))
           (setq EntList (entget EntName))
           (setq EntType (cdr (assoc 0 EntList)))
           (if (or (= "TEXT" EntType) (= "MTEXT" EntType))
               (progn
                    (setq TextVal (cdr (assoc 1 EntList)))
                    (if (= (NumberP_Func TextVal) 'T)
                        (ssadd EntName SSetEnt02)
                    )
               )
           )
           (setq CountNum01 (+ CountNum01 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   (if (/= SSetEnt02 nil)
       (setq EntCount02 (sslength SSetEnt02))
       (setq EntCount02 0)
   )
   ;;--------------------------------------------------------------------------------------------------
   (setq CountNum02 0)
   (repeat EntCount02
           (setq EntName (ssname SSetEnt02 CountNum02))
           (setq EntList (entget EntName))
           (setq TextVal01 (cdr (assoc 1 EntList)))
           (setq TextVal02 (InsertComma TextVal01))
           (setq TextVal01 (assoc 1 EntList))
           (setq TextVal02 (cons 1 TextVal02))
           (setq EntList (subst TextVal02 TextVal01 EntList))
           (entmod EntList)
           (setq CountNum02 (+ CountNum02 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   (princ (strcat "\n" (itoa EntCount01) "개의 객체 중에서 " (itoa EntCount02) "개의 문자열을 수정했습니다!"))
   ;;--------------------------------------------------------------------------------------------------
   (princ)
)
;;=====================================================================================================
;;=====================================================================================================
;; 전달 받은 문자열에서 지정한 문자를 삭제한다.
;;=====================================================================================================
(defun RemoveChar(iTextVal iDelChar / iTextVal iRChar iRtnText iCountNum)
   ;;--------------------------------------------------------------------------------------------------
   (setq iRtnText "")
   ;;--------------------------------------------------------------------------------------------------
   (setq iCountNum 1)
   (repeat (strlen iTextVal)
           (if (/= (substr iTextVal iCountNum 1) iDelChar)
               (setq iRtnText (strcat iRtnText (substr iTextVal iCountNum 1)))
           )
           (setq iCountNum (+ iCountNum 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   iRtnText
)
;;=====================================================================================================
;;=====================================================================================================
;; 전달 받은 문자열에 콤마를 삽입한다.
;;=====================================================================================================
(defun InsertComma(iTextVal / iTextVal iTextType iTextTail iTextHead iCountNum)
   ;;--------------------------------------------------------------------------------------------------
   (setq iTextType (type (read iTextVal))) ;;
   (if (= iTextType 'REAL)
       (progn
            (setq iTextTail (SplitRearChar iTextVal "."))
            (setq iTextHead (SplitFrontChar iTextVal "."))
       )
       (progn
            (setq iTextTail "")
            (setq iTextHead iTextVal)
       )
   )
   ;;--------------------------------------------------------------------------------------------------
   (setq iTextHead (vl-string->list iTextHead))
   (setq iTextHead (reverse iTextHead))
   (setq iTextHead (vl-list->string iTextHead))
   ;;--------------------------------------------------------------------------------------------------
   (setq iTextVal "")
   ;;--------------------------------------------------------------------------------------------------
   (setq iCountNum 1)
   (repeat (strlen iTextHead)
           (if (= (rem iCountNum 3) 0)
               (setq iTextVal (strcat "," (substr iTextHead iCountNum 1) iTextVal ))
               (setq iTextVal (strcat (substr iTextHead iCountNum 1) iTextVal ))
           )
           (setq iCountNum (+ iCountNum 1))
   )
   ;;--------------------------------------------------------------------------------------------------
   (if (= (substr iTextVal 1 1) ",")
       (setq iTextVal (substr iTextVal 2))
   )
   ;;--------------------------------------------------------------------------------------------------
   (if (= iTextType 'REAL)
       (setq iTextVal (strcat iTextVal "." iTextTail))
   )
   ;;--------------------------------------------------------------------------------------------------
   iTextVal
)
;;=====================================================================================================
;;=====================================================================================================
;; 구분자를 기준으로 절단하여 뒤부분을 리턴한다
;;=====================================================================================================
(defun SplitRearChar(iTextData iSplitChar / iTextData iSplitChar iPositionNum)
   (setq iPositionNum (vl-string-search iSplitChar iTextData 0))
   (if (/= iPositionNum nil)
       (setq iTextData (substr iTextData (+ iPositionNum 2)))
       (alert "문자열 분리 실패       ")
   )
)
;;=====================================================================================================
;;=====================================================================================================
;; 구분자를 기준으로 절단하여 앞부분을 리턴한다
;;=====================================================================================================
(defun SplitFrontChar(iTextData iSplitChar / iTextData iSplitChar iPositionNum)
   (setq iPositionNum (vl-string-search iSplitChar iTextData 0))
   (if (/= iPositionNum nil)
       (setq iTextData (substr iTextData 1 iPositionNum))
       (alert "문자열 분리 실패       ")
   )
)
;;=====================================================================================================
;;=====================================================================================================
;; 문자열이 숫자인지 판단
;;=====================================================================================================
(defun NumberP_Func(iTextData / iTextData iRtnValue)
   (if (numberp (read iTextData))
       (setq iRtnValue 'T)
       (setq iRtnValue nil)
   )
   iRtnValue
)
;;=====================================================================================================
;;=====================================================================================================
;; 전달받은 문자열에서 구분자를 카운트한다.
;;=====================================================================================================
(defun PatternCount(iTextData iPatternChar / iTextData iPatternChar iPatternCount iPositionNum iTextLength)
   (setq iPatternCount 0)
   (setq iPositionNum -1)
   (setq iTextLength (strlen iTextData))
   (while (and (/= iPositionNum nil) (<= iPositionNum iTextLength))
          (setq iPositionNum (+ iPositionNum 1))
          (setq iPositionNum (vl-string-search iPatternChar iTextData iPositionNum))
          (if (and (/= iPositionNum nil) (<= iPositionNum iTextLength))
              (setq iPatternCount (+ iPatternCount 1))
          )
   )
   iPatternCount
)
;;=====================================================================================================
(princ "\nhttp://cafe.daum.net/zwcad  &  http://www.lispcenter.net")
(princ)

댓글 없음:

댓글 쓰기

즐거운 하루되세요...^^