이 함수는 현재 마우스의 위치와 클릭을 했는지, 키보드를 입력했다면 어떤 것을 입력했는지를 반환하기 때문에 각 입력에 따른 별도의 기능을 부여할 수 있다는 장점이 있다.
grread 는 (grread 't 15 2) 이와 같이 두쌍의 숫자를 옵션으로 가지고 있는데.. 앞의 숫자는 반환값에 대한 것. 뒤의 숫자는 커서의 모양을 제어하는 것이다.
앞의 숫자는 다음과 같다.
1 (bit 0) : 움직이는 좌표와 키보드 동작을 반환
2 (bit 1) : 움직이는 좌표와 펑션키를 포함한 모든 키를 반환
4 (bit 2) : 커서키를 제어하는 뒤쪽의 숫자를 반영함. 이 비트를 선택하지 않으면, 뒷의 커서제어가 먹지 않음.
8 (bit 3) : 에러메시지를 억제함.
뒤의 숫자는 다음과 같다.
0 : 십자선만 있고, 오스냅박스를 감춤
1 : 커서를 감춤 (십자선 감춤) 즉, 화면에 아무 것도 나타나지 않음
2 : 객체선택사각 (PickBox)만 나타남
그러므로, 만약 객체선택사각으로 기능을 제어할 때는
(grread 't (+ 1 4 8) 2) 로 해주면 된다.
그리고, 현재 사용하는 커서 모양을 유지하면서 좌표를 얻고 싶으면
(grread 't (+ 1 8) 0) 인데, 4비트가 포함될 경우에는 뒤쪽 숫자가 의미 없으므로,
(grread 't (+ 1 8)) 처럼 앞 숫자만 있어도 무방하다.
이 함수를 돌린 결과는 두개의 쌍으로 반환되는데..
마우스 이동 : (3 (좌표)) , 이동중인 좌표, 계속 변경됨
마우스 클릭 : (5 (좌표)) , 클릭한 점의 고정 좌표
오른쪽 마우스클릭 : (25 (화면에 대한 마우스 x축 위치)
만약 1920x1080 화면이고, 마우스가 왼쪽 끝에 있다면 30 정도를 반환함
키보드 입력 : (2 (키보드고유번호))
이 때, 각 키보드에 대한 고유번호는 아래와 같다.
;;;=============================================================================; ;; grread 키보드 고유번호 정리 ;; 2017. 01. izzarder.com ;;;=============================================================================; (defun c:xxx ( / code) (while (progn (setq code (grread T 9)) (cond ((= (car code) 5) T) ((= (car code) 3) (princ "do_LeftClick")) ((= (car code) 11) (princ "do_RightClick")) ((= (car code) 25) (princ "do_RightClick")) ((equal code '(2 0)) (princ "do_CTRL-@")) ((equal code '(2 1)) (princ "do_CTRL-A")) ((equal code '(2 2)) (princ "do_F9")) ((equal code '(2 3)) (princ "do_F12")) ((equal code '(2 4)) (princ "do_F6")) ((equal code '(2 5)) (princ "do_F5")) ((equal code '(2 6)) (princ "do_F3")) ((equal code '(2 7)) (princ "do_F7")) ((equal code '(2 8)) (princ "do_Back")) ((equal code '(2 9)) (princ "do_Tab")) ((equal code '(2 10)) (princ "do_CTRL-J")) ((equal code '(2 11)) (princ "do_CTRL-K")) ((equal code '(2 12)) (princ "do_CTRL-L")) ((equal code '(2 13)) (princ "do_Return")) ((equal code '(2 14)) (princ "do_CTRL-N")) ((equal code '(2 15)) (princ "do_F8")) ((equal code '(2 16)) (princ "do_CTRL-P")) ((equal code '(2 17)) (princ "do_CTRL-Q")) ((equal code '(2 18)) (princ "do_CTRL-R")) ((equal code '(2 19)) (princ "do_CTRL-S")) ((equal code '(2 20)) (princ "do_F4")) ((equal code '(2 21)) (princ "do_F10")) ((equal code '(2 22)) (princ "do_CTRL-V")) ((equal code '(2 23)) (princ "do_F11")) ((equal code '(2 24)) (princ "do_CTRL-X")) ((equal code '(2 25)) (princ "do_CTRL-Y")) ((equal code '(2 26)) (princ "do_CTRL-Z")) ((equal code '(2 27)) (princ "do_CTRL-[")) ((equal code '(2 28)) (princ "do_CTRL-\\")) ((equal code '(2 29)) (princ "do_CTRL-]")) ((equal code '(2 30)) (princ "do_CTRL-^")) ((equal code '(2 31)) (princ "do_CTRL-_")) ((equal code '(2 32)) (princ "do_Space")) ((equal code '(2 33)) (princ "do_ExclamationMark")) ((equal code '(2 34)) (princ "do_DoubleQuote")) ((equal code '(2 35)) (princ "do_Hash")) ((equal code '(2 36)) (princ "do_Dollar")) ((equal code '(2 37)) (princ "do_Percent")) ((equal code '(2 38)) (princ "do_Ampersand")) ((equal code '(2 39)) (princ "do_Apostrophe")) ((equal code '(2 40)) (princ "do_OpenParenthesis")) ((equal code '(2 41)) (princ "do_CloseParenthesis")) ((equal code '(2 42)) (princ "do_Asterisk")) ((equal code '(2 43)) (princ "do_Plus")) ((equal code '(2 44)) (princ "do_Comma")) ((equal code '(2 45)) (princ "do_Minus")) ((equal code '(2 46)) (princ "do_Dot")) ((equal code '(2 47)) (princ "do_Slash")) ((equal code '(2 48)) (princ "do_0")) ((equal code '(2 49)) (princ "do_1")) ((equal code '(2 50)) (princ "do_2")) ((equal code '(2 51)) (princ "do_3")) ((equal code '(2 52)) (princ "do_4")) ((equal code '(2 53)) (princ "do_5")) ((equal code '(2 54)) (princ "do_6")) ((equal code '(2 55)) (princ "do_7")) ((equal code '(2 56)) (princ "do_8")) ((equal code '(2 57)) (princ "do_9")) ((equal code '(2 58)) (princ "do_Colon")) ((equal code '(2 59)) (princ "do_Semicolon")) ((equal code '(2 60)) (princ "do_LessThan")) ((equal code '(2 61)) (princ "do_Equals")) ((equal code '(2 62)) (princ "do_GreatThan")) ((equal code '(2 63)) (princ "do_QuestionMark")) ((equal code '(2 64)) (princ "do_At")) ((equal code '(2 65)) (princ "do_A")) ((equal code '(2 66)) (princ "do_B")) ((equal code '(2 67)) (princ "do_C")) ((equal code '(2 68)) (princ "do_D")) ((equal code '(2 69)) (princ "do_E")) ((equal code '(2 70)) (princ "do_F")) ((equal code '(2 71)) (princ "do_G")) ((equal code '(2 72)) (princ "do_H")) ((equal code '(2 73)) (princ "do_I")) ((equal code '(2 74)) (princ "do_J")) ((equal code '(2 75)) (princ "do_K")) ((equal code '(2 76)) (princ "do_L")) ((equal code '(2 77)) (princ "do_M")) ((equal code '(2 78)) (princ "do_N")) ((equal code '(2 79)) (princ "do_O")) ((equal code '(2 80)) (princ "do_P")) ((equal code '(2 81)) (princ "do_Q")) ((equal code '(2 82)) (princ "do_R")) ((equal code '(2 83)) (princ "do_S")) ((equal code '(2 84)) (princ "do_T")) ((equal code '(2 85)) (princ "do_U")) ((equal code '(2 86)) (princ "do_V")) ((equal code '(2 87)) (princ "do_W")) ((equal code '(2 88)) (princ "do_X")) ((equal code '(2 89)) (princ "do_Y")) ((equal code '(2 90)) (princ "do_Z")) ((equal code '(2 91)) (princ "do_OpenSquareBracket")) ((equal code '(2 92)) (princ "do_BackSlash")) ((equal code '(2 93)) (princ "do_CloseSquareBracket")) ((equal code '(2 94)) (princ "do_Caret")) ((equal code '(2 95)) (princ "do_UnderScore")) ((equal code '(2 96)) (princ "do_BackQuote")) ((equal code '(2 97)) (princ "do_a")) ((equal code '(2 98)) (princ "do_b")) ((equal code '(2 99)) (princ "do_c")) ((equal code '(2 100))(princ "do_d")) ((equal code '(2 101))(princ "do_e")) ((equal code '(2 102))(princ "do_f")) ((equal code '(2 103))(princ "do_g")) ((equal code '(2 104))(princ "do_h")) ((equal code '(2 105))(princ "do_i")) ((equal code '(2 106))(princ "do_j")) ((equal code '(2 107))(princ "do_k")) ((equal code '(2 108))(princ "do_l")) ((equal code '(2 109))(princ "do_m")) ((equal code '(2 110))(princ "do_n")) ((equal code '(2 111))(princ "do_o")) ((equal code '(2 112))(princ "do_p")) ((equal code '(2 113))(princ "do_q")) ((equal code '(2 114))(princ "do_r")) ((equal code '(2 115))(princ "do_s")) ((equal code '(2 116))(princ "do_t")) ((equal code '(2 117))(princ "do_u")) ((equal code '(2 118))(princ "do_v")) ((equal code '(2 119))(princ "do_w")) ((equal code '(2 120))(princ "do_x")) ((equal code '(2 121))(princ "do_y")) ((equal code '(2 122))(princ "do_z")) ((equal code '(2 123))(princ "do_OpenBrace")) ((equal code '(2 124))(princ "do_VerticalBar")) ((equal code '(2 125))(princ "do_CloseBrace")) ((equal code '(2 126))(princ "do_Tilde")) ((equal code '(2 127))(princ "do_Delete")) ( t ) ) ) ) )
아래 구문을 돌려 보면 어떤 기능을 하는 것인지 아마도 확실히 알 수 있을 것이다.
;;;=============================================================================; ;; grread 예제 ;; 2017. 01. izzarder.com ;;;=============================================================================; (defun c:xxx ( / grdata code data) (while (progn (setq grdata (grread 't 9 0) code (car grdata) data (cadr grdata) ) (cond ( (and (= 5 code) (listp data)) t ; t는 함수를 계속 while 한다는 의미 ) ( (and (= 3 code) (listp data)) (command "_LINE" '(0 0) data "") (princ "글릭") (princ data) ) ( (= 25 code) (princ "오른쪽 마우스") (princ data) ) ( (= 2 code) (cond ( (= 13 data) (princ "엔터") (princ data) ) ( (= 32 data) (princ "스페이스") (princ data) ) ( (vl-position data '(85 117)) (princ "대소문자 U") (princ data) ) ( t ) ) ) ( t ) ) ) ) )
'Lisp & Tips > Lisp' 카테고리의 다른 글
치수관련 변수 목록 (0) | 2015.01.03 |
---|---|
문자 또는 숫자 자동 증가 (0) | 2014.11.22 |
SSGET 사용법 정리 (0) | 2014.11.07 |
리스트에서 순서 뽑기 기초 (0) | 2014.10.27 |
(mapcar) 와 (lambda) (0) | 2014.10.25 |