Prompting with a Default Option

Auto CAD/lisp|2021. 2. 20. 10:09

소개

이 튜토리얼은 사용자가 눌러 선택할 수 있는 기본 옵션을 제공하면서 사용자 입력을 요구하는 다양한 방법을 설명합니다.

ENTER

,

SPACE

또는 프롬프트에서 마우스 오른쪽 버튼을 클릭합니다.

참고 1: 프롬프트 문자열 형식

전문가처럼 보이는 프로그램을 만들기 위해 저는 보통 AutoCAD에서 사용하는 표준 프롬프트 형식과 거의 일치하도록 노력합니다. 아이디어는 최소한의 사용자 교육으로 AutoCAD 환경에 완벽하게 통합될 수 있는 응용프로그램을 만드는 것입니다.

동적 입력이 활성화되었을 때 사용 가능한 옵션을 올바르게 표시하려면(예: DYNMODE = 1

F12

), 프롬프트 문자열은 다음과 같은 형식으로 지정되어야 합니다.

[Option1/Option2/Option3] <Option1>

위의 예에서 옵션 1 , 2  3 은 옵션 1을 기본 옵션으로 사용자 선택에 사용할 수 있습니다 . 사용자가 Enter 키를 누르면 선택됩니다.

참고 2: 전역 변수

다음 예제에서 전역 변수는 프로그램 완료 후 기본 옵션을 효과적으로 '기억'하는 데 사용됩니다. 전역 변수가 사용되는 위치를 나타내기 위해 변수 이름 앞에 global: 가 붙습니다 . 이것은 또한 변수 이름이 다른 프로그램의 지역화되지 않은 변수와 충돌할 위험을 줄입니다.

접두사는 다른 용도로 사용되지 않습니다. AutoLISP에서는 접두사가 표준 변수 이름을 구성합니다.

프로그램 간에 중복된 지역화되지 않은 변수 이름을 사용할 때 발생할 수 있는 결과를 이해하려면 지역화 변수 에 대한 내 자습서를 읽으십시오 .


사례 1: 강제 사용자 입력(기본값 없음)

기본 옵션을 사용할 수 없는 가장 간단한 경우입니다. 비트 코드 1 과 함께 initget 함수를 사용하여 사용자가 사용 가능한 옵션에서 선택하도록 합니다. 따라서 이 경우 사용자 입력을 보장하기 위해 조건부 오류 트래핑이 필요하지 않습니다. 사용자가 프롬프트를 무시할 수 있는 유일한 방법은 다음을 사용하여 프로그램을 종료하는 것이기 때문입니다.

ESC

.

(initget 1 "Alpha Beta Gamma")
(setq ans (getkword "\nChoose [Alpha/Beta/Gamma]: "))

initget 기능 의 비트 코드 1은 사용자가 다음을 눌러 요청에 응답하지 못하게 합니다.

ENTER

, 따라서 사용자가 Alpha , Beta  Gamma 옵션에서 선택하도록 합니다.


사례 2: 사전 설정 기본 옵션

이 경우 기본 옵션을 사용할 수 있지만 매번 동일한 옵션입니다. 기본 옵션은 프롬프트 문자열에 하드코딩되어 있으며 사용자가 다음을 눌러 선택할 수 있습니다.

ENTER

프롬프트에서.

버전 1

(initget "Alpha Beta Gamma")
(setq ans (cond ((getkword "\nChoose [Alpha/Beta/Gamma] <Alpha>: ")) ("Alpha")))

위의 코드에서 옵션 Alpha는 기본 옵션으로 하드 코딩되어 있습니다.

사용자가 누르면

ENTER

프롬프트에서 getkword 표현식은 nil을 반환 하므로 cond 함수는 다음 테스트 조건을 평가하기 위해 이동합니다. 이것은 nil이 아닌 값인 기본 문자열 "Alpha" 이므로 cond 함수에 의해 반환됩니다.

버전 2

(initget "Alpha Beta Gamma")
(if (null (setq ans (getkword "\nChoose [Alpha/Beta/Gamma] <Alpha>: ")))
    (setq ans "Alpha")
)

이 두 번째 버전은 첫 번째와 동일한 논리를 사용하지만 조건부 연산자 cond가 if 문 으로 대체되었습니다 . 따라서 ans 변수  nil 이면 기본 옵션이 바인딩됩니다.


사례 3: 동적 기본값

이 경우 global:ans 변수는 전역적입니다(사용되는 함수 정의에서 지역화되지 않음). 전역이기 때문에 프로그램 완료 후 바인딩된 값을 잃지 않습니다.

(if (null global:ans)
    (setq global:ans "Alpha")
)
(initget "Alpha Beta Gamma")
(if (setq tmp (getkword (strcat "\nChoose [Alpha/Beta/Gamma] <" global:ans ">: ")))
    (setq global:ans tmp)
)

위의 코드에서 변수 global:ans는 먼저 nil이 아닌 값을 확인합니다. 이것은 프로그램을 처음 실행할 때 사용자에게 제공되는 기본값이 있는지 확인하기 위한 것입니다.

프로그램을 처음 실행하면 global:ans 변수는 nil이 되고 if 문은 "Alpha" 값을 변수에 바인딩합니다. 이것이 첫 번째 기본값이 됩니다 .

다음에 오는 if 문은 이전 예제에서 사용된 논리를 뒤집습니다. 사용자가 일부 입력으로 응답한 경우(예: getkword 함수  nil이 아닌 값을 반환한 경우) 전역 변수 global:ans가 업데이트되어 새 입력을 저장합니다( 사용자가 명시적으로 동일한 옵션을 기본값으로 선택했더라도).

반대로 사용자가

ENTER

프롬프트에서 getkword 함수는 nil을 반환 하고 global:ans 변수는 사용자가 선택한 기본 옵션으로 기존 값을 유지합니다.

그런 다음 프로그램이 두 번째로 실행되면 변수 global:ans는 이제 값을 가지므로 첫 번째 if 문의 테스트 표현식은 nil을 반환합니다 . 따라서 다음 식에서는 global:ans 변수가 보유한 마지막으로 선택한 옵션이 기본값으로 사용됩니다.


예를 넘어서

위의 모든 예에서 getkword 함수를 사용하여 미리 정의된 옵션 집합 중 하나를 선택하도록 사용자에게 프롬프트했지만 위에서 설명한 방법 및 논리는 다른 getXXX 사용자 입력 함수(예: getreal) 에 동일하게 적용될 수 있습니다. , getdist 등) null 입력 시 빈 문자열( "" )을 반환하는 getstring 은 예외입니다 .

다른 함수로 일반화할 때 유일한 추가 고려 사항은 기본값의 데이터 유형에서 사용자 프롬프트를 표시하는 데 사용되는 문자열로 변환해야 한다는 것입니다.

예를 들어 사용자에게 정수 값을 지정하라는 메시지를 표시할 때 strcat (문자열 연결 ) 함수를 사용하여 기본값을 사용자 프롬프트와 연결할 수 있도록 itoa (정수에서 ASCII로) 함수를 사용해야 합니다.

(if (null global:int)
    (setq global:int 1)
)
(initget 6)
(if (setq tmp (getint (strcat "\nEnter a positive non-zero integer <" (itoa global:int) ">: ")))
    (setq global:int tmp)
)

유사하게, 다음 예에서 전역 변수의 숫자 값은 rtos (실제 문자열로) 함수를 사용하여 소수점 이하 3자리까지 십진수 형식의 문자열로 변환됩니다 .

(if (null global:dis)
    (setq global:dis (+ pi pi))
)
(initget 4)
(if (setq tmp (getdist (strcat "\nSpecify circumference <" (rtos global:dis 2 3) ">: ")))
    (setq global:dis tmp)
)

출처: http://www.lee-mac.com/promptwithdefault.html

'Auto CAD > lisp' 카테고리의 다른 글

Selection Set Processing  (0) 2021.02.20
Error Handling  (0) 2021.02.20
Mapcar & Lambda  (0) 2021.02.20
달수 ▷ ActiveX 처음 시작하기전에 읽어보세요  (2) 2019.04.05
VL-remove (리스트에서 요소제거하기)  (0) 2019.04.04

댓글()