11. Edit Box 제어

 

모든 대화 상자를 화면에 나타나게 하려면 다음과 같은 AutoLISP 프로그램을 작성하면 됩니다.

앞 Edit Box에서 작성한 sedit02.dcl 파일을 예로 들겠습니다.

 

    ;; sedit02.lsp

    (defun c:sedit()

       (setq dcl_flag (load_dialog "sedit02.dcl"))

       (new_dialog "sample02" dcl_flag)

       ;; 사용자 입력을 위한 타일의 이벤트 설정

       (setq rtnDLG (start_dialog))

       (done_dialog)

       (unload_dialog dcl_flag)

       (if (= rtnDLG 1)

           (EVENT_OK)     ;; OK 이벤트 설정

           (EVENT_Cancel) ;; Cancel 이벤트 설정

       )

    )

     

    그림.10-01

    // sedit02.dcl

    sample02:dialog

    {

      label = " Edit Box Sample Dialog";

      spacer;

      : edit_box {

                  label = "Edit Box Sample";

                  key = "db";

                  value = "Edit Box";

                  edit_width = 20;

                  edit_limit = 26;

                 }

      spacer;

      ok_cancel;

    }

 

위의 LISP파일과 DCL파일을 AutoCAD에서 실행시켜도 단지 [그림.10-01]과 같은 대화 상자만 나타날 뿐 아무런 기능을

가지지 않습니다.    대화 상자로서 완전한 기능을 가지려면 LISP 파일 안에서 대화 상자 컨트롤 관련 LISP 함수들을

사용하여 각각의 타일에 맞는 조건이나 이벤트들을 설정해 주어야합니다.

 

Edit Box를 제어하기위해서 사용하는 LISP 함수는 다음과 같습니다.

** 대화 상자 제어-2 참조 

    action_tile

    mode_tile

    set_tile

     

 

우선 Edit Box를 제어하기 이전에 Edit Box의 용도를 정해야 합니다.

숫자를 입력 받을 것인가? 아니면 문자를 입력 받을 것인가?를 정해야 합니다.

왜냐하면 대화 상자는 숫자와 문자를 구별하지 않고 무조건 문자로 모든 것을 받아들이기 때문입니다.

따라서, 숫자를 입력받기 위한 Edit Box와 문자를 입력받기 위한 Edit Box로 구분해서 설정해주어야 합니다.

기본적인 설정은 두가지 경우 비슷하나 숫자를 입력 받는 경우는 AutoLISP의 변환 함수는 이용해야 한다는 것만 다릅니다.

 

1.  Edit Box를 제어하는 LISP 프로그램 작성 순서

    defun 함수 정의

    "load_dialog"를 이용한 DCL 파일 호출

    "new_dialog"를 이용한 대화 상자 호출

    "set_tile"와 "mode_tile"를 이용한 타일 초기화

    "action_tile"를 이용한 입력값 처리

    "start_dialog"를 이용한 대화 상자 종료 리턴값 반환

    종료 이벤트 설정

    "done_dialog"를 이용한 대화 상자 종료

    "unload_dialog"를 이용한 대화 상자 메모리 종료

 

 

2. "set_tile"를 이용한 타일 초기화

    Edit Box에 초기값을 표시하기 위해서는 DCL의 "value"를 사용해야 하지만, LISP의 "set_tile" 함수를 이용해서 할 수도 있습니다.

    "set_tile"를 이용해서 초기화할 때 직접 초기화하지 않고 변수를 이용하여 초기화합니다.

    위의 예제 프로그램 "sedit02.dcl"의 edit_box에 초기값을 "set_tile"를 사용해서 표시하기 위해서는 다음과 같이 해야 합니다.

      edit_box의 key-name이 "db"입니다.

      set_tile을 edit_box에 지정한 예

         (set_tile "db" "Expression")


      Edit Box에 초기값을 변수로 지정한 예

         (set_tile "db" Variable)


      초기값을 사용자가 지정한 변수(dbvalue)에 지정한 예

         (set_tile "db" dbvalue)

     

    다음 예제는 아무런 기능을 가지지 않습니다.

    단순하게 "set_tile"를 이용해서 타일을 초기화하는 방법을 설명한 것입니다.

    예제 프로그램)

      ; SEDIT.LSP

      (defun c:sedit()

        (prompt "\n Loaded.......")

        (setq dcl_sample (load_dialog "c:/sedit02.dcl"))

        (new_dialog "sample" dcl_sample)

        (setq dbvalue "100")        ; 초기값 설정

        (set_tile "db" dbvalue)      ; 타일 초기화

        (setq sample (start_dialog))

        (done_dialog)

        (unload_dialog dcl_sample)

        (prompt "\n By D.M.Z")

        (princ)

      )

      // SEDIT02.DCL

      sample : dialog {

            label = " Edit Box Sample Dialog " ;

            : edit_box {

                label="Edit Box Smaple";

                key="db";

                // value="Edit Box"; 주석 처리

                edit_limt=26;

                }

            ok_cancel;

            }

 

** 참고

    value를 이용해서 Edit_box를 초기화하는 방법보다는 set_tile를 이용해서 초기화하는 것이 프로그램을 하다보면 더 편리합니다.

    특히, key값과 입력되는 값이 저장되는 변수명이 다를 경우, 프로그램을 반복해서 실행시키면 전달되는 값이 서로 틀릴 수도 있습니다.

    예를 들어 숫자를 입력받는 Edit Box가 있을 때, 실행할 때마다 LISP의 변환 함수를 이용해서 변환을 합니다.

    변환한 후 계산, 도면 작성에 이용하게 되는데 프로그램이 종료될 때 메모리에서 삭제되지 않으면 LISP 프로그램은 계속해서 변환하려 합니다.

    그러나, 데이터 타입이 일치하지 않기 때문에 에러가 발생합니다.

    쉽게 말하면, 프로그램을 한번 실행시키면 숫자로 이루어진 문자열을 숫자로 변환을 하게 됩니다.

    두번 프로그램을 실행시키면, 첫 번째에서 이미 변환된 데이터를 다시 변환을 시키려하기 때문에 에러가 발생하게 되는 것입니다.

    따라서, 이러한 에러 발생을 피하려면 "value"를 이용해서 초기화하는 것보다는 "set_tile"를 이용해서 타일을 초기화하는 것이 효과적입니다.

     

     

3. Mode_tile 설정

      ; SEDIT.LSP

      (defun c:sedit()

        (prompt "\n Loaded.......")

        (setq dcl_sample (load_dialog "c:/sedit02.dcl"))

        (new_dialog "sample" dcl_sample)

        (setq dbvalue "100")        ; 초기값 설정

        (set_tile "db" dbvalue)      ; 타일 초기화

        (mode_tile "db" 2)

        (setq sample (start_dialog))

        (done_dialog)

        (unload_dialog dcl_sample)

        (prompt "\n By D.M.Z")

        (princ)

      )

      // SEDIT02.DCL

      sample : dialog {

            label = " Edit Box Sample Dialog " ;

            : edit_box {

                label="Edit Box Smaple";

                key="db";

                edit_limt=26;

                }

            ok_cancel;

            }

 

 

 4. Edit Box에 입력되는 값을 인식

    Edit Box에 입력되는 값을 인식, 저장하기 위해서는 "action_tile" 함수를 이용해야 합니다.

    이 함수의 기능은 타일을 선택했을 때 그 타일의 기능을 정의하는 것입니다.

    자세한 것은 "대화 상자 제어-2"를 참조하세요.

    위의 예제 프로그램 "sedit02.dcl"의 edit_box에 입력되는 값을 인식, 저장하기 위해서는 다음과 같이 해야 합니다.

      edit_box의 key-name이 "db"입니다.

      action_tile을 edit_box에 지정한 예

         (action_tile "db" "(Expression)")


      Edit Box에 입력되는 값을 변수에 저장하는 예

         (action_tile "db" "(setq Variable $value)")


      입력되는 값을 사용자가 지정한 변수(dbvalue)에 저장하는 예

         (action_tile "db" "(setq dbvalue $value)")

     

    예제 프로그램)

      ; SEDIT.LSP

      (defun c:sedit()

        (prompt "\n Loaded.......")

        (setq dcl_sample (load_dialog "c:/sedit02.dcl"))

        (new_dialog "sample" dcl_sample)

        (setq dbvalue "100")

        (set_tile "db" dbvalue)

        (mode_tile "db" 2)

        (action_tile "db" "(setq dbvalue $value)")

        (setq sample (start_dialog))

        (done_dialog)

        (unload_dialog dcl_sample)

        (prompt "\n By D.M.Z")

        (princ)

      )

      // SEDIT02.DCL

      sample : dialog {

            label = " Edit Box Sample Dialog " ;

            : edit_box {

                label="Edit Box Smaple";

                key="db";

                edit_limt=26;

                }

            ok_cancel;

            }

 

 

5. 문자를 입력 받는 경우

 

 

6. 숫자를 입력 받는 경우

 다음 예제는 숫자를 입력받아서 화면에 출력하고, 입력한 숫자의 지름을 갖는 원을 그리는 예제입니다.
 

      ; SEDIT.LSP

      (defun c:sedit()

        (prompt "\n Loaded.......")

        (setq dcl_sample (load_dialog "c:/sedit02.dcl"))

        (new_dialog "sample" dcl_sample)

          (setq dbvalue "100")        ; 초기값 설정

          (set_tile "db" dbvalue)      ; 타일 초기화

          (mode_tile "db" 2)

           ; 타일 선택시 이벤트

          (action_tile "db" "(setq dbvalue $value)")

          (setq sample (start_dialog))

          ; OK 또는 Cancel 이벤트 설정

          (if (= sample 1)

            ; OK 선택시 이벤트

            (progn

              (ok_sample_func)

              (prompt "\n 입력한 숫자는")

              (princ dbvalue)

              (prompt "입니다.")

            )

            ; Calcel 선택시 이벤트

            (prompt "\n Cancel을 선택했습니다.")

          )

        (done_dialog)

        (unload_dialog dcl_sample)

        (prompt "\n By D.M.Z")

        (princ)

      )

      (defun ok_sample_func()

        (setq dbvalue (atoi dbvalue))

        ; 정수를 입력 받는 경우

        ; (setq dbvalue (atof value))

        ; 실수를 입력받을 경우

        ; 입력받은 숫자를 이용해서 계산 또는 좌표를 설정

        ; 하기 위해서는 AutoLISP의 변화 함수를 이용해야

        ; 합니다. ** 변환 함수 참조

        (setq rvalue (/ dbvalue 2))

        (setq point00 (list 100 100))

        (command "circle" point00 rvalue)

      )

      // SEDIT02.DCL

      sample : dialog {

            label = " Edit Box Sample Dialog " ;

            : edit_box {

                label="Edit Box Smaple";

                key="db";

                // value="Edit Box"; 주석 처리

                edit_limt=26;

                }

            ok_cancel;

            }

      Command: (load "c:/sp")

      OK_SAMPLE_FUNC

      Command: sedit

       Loaded.......circle 3P/2P/TTR/<Center point>

      : Diameter/<Radius> <100.0000>: 150

      Command:

       입력한 숫자는300입니다.

       By D.M.Z

       

       

      Command: sedit

       Loaded.......

       Cancel을 선택했습니다.

       By D.M.Z

       

       

 

 

7. 숫자, 문자를 구별해서 받는 경우

       

      (defun c:candn()

        (prompt "\n Loaded.......")

        (setq dcl_id (load_dialog "c:/candn.dcl"))

        (new_dialog "candn" dcl_id)

        (setq cn "숫자 또는 문자열을 입력하세요.")

        (set_tile "cn" cn)

        (mode_tile "cn" 2)

        (action_tile "cn" "(setq cn $value)")

        (setq candn (start_dialog))

        (if (= candn 1) (ok_func) (prompt "\n 취소했습니다."))

        (done_dialog)

        (unload_dialog dcl_id)

        (prompt "\n By D.M.Z")

        (princ)

      )

      (defun ok_func(/ b a cnl cnc point out)

        (setq b 0)

        (setq a 1)

        (setq cnl (strlen cn))

        (while (<= a cnl)

          (setq cnc (substr cn a 1))

          (cond

            ((= "1" cnc)(setq n 0))

            ((= "2" cnc)(setq n 0))

            ((= "3" cnc)(setq n 0))

            ((= "4" cnc)(setq n 0))

            ((= "5" cnc)(setq n 0))

            ((= "6" cnc)(setq n 0))

            ((= "7" cnc)(setq n 0))

            ((= "8" cnc)(setq n 0))

            ((= "9" cnc)(setq n 0))

            ((= "0" cnc)(setq n 0))

            ((= "." cnc)(setq n 0))

            (t (setq b 1))

          )

          (setq a (+ a 1))

        )

        (if (= b 1) (setq out "Character")(setq out "Number"))

        (setq point (list 100 100))

        (setvar "textsize" 10)

        (command "erase" "all" "")

        (command "text" point "" "" out)

        )

       

       

8. 포커스 이동

 

 

9. 파일을 이용한 초기화

 

 

10. Edit Box에 입력되는 값을 Text로 표시

 

 

Edit Box

최초 작성일 2000.01.08

List Box

최종 수정일 2006.06.28