다수의 그래픽창들을 한꺼번에 제거하는 방법
IDL에서 그래픽 표출 작업을 하다보면 여러 개의 그래픽창들을 띄우게 되는 경우가 종종 있습니다. 그리고 작업이 다 끝나서 그래픽창들을 없애고자 할 경우, 띄워놓은 그래픽창들이 그냥 1~2개 정도라면 그냥 일일이 직접 없애도 별 무리는 없습니다. 하지만 그 갯수가 더 많을 경우에는 하나하나 제거하는 것도 은근히 귀찮아지게 됩니다. 따라서 이미 떠있는 다수의 그래픽창들을 한꺼번에 제거하는 방법이 있으면 더 편할텐데요. 오늘은 그러한 팁을 소개해보고자 합니다.
먼저 NG(New Graphics) 체계의 경우부터 보겠습니다. 간단하게 예를 들기 위하여 다음과 같이 WINDOW 함수를 사용하여 NG 체계의 그래픽창들을 세 개 띄워보겠습니다.
w1 = WINDOW()
w2 = WINDOW()
w3 = WINDOW()
물론 이것은 IDL 프롬프트에서의 작업일 수도 있고 프로그램에서의 작업일 수도 있습니다. 어쨌든 이렇게 하면 세 개의 그래픽창들이 뜨게 되는데요. 하나씩 제거할 경우에는 그래픽창 자체의 상단에서 X 버튼을 누르면 됩니다. 하지만 여러 개를 한꺼번에 제거하고자 할 경우에는 바로 IRESET 명령을 사용하면 됩니다. 즉 IDL 커맨드 입력창의 IDL 프롬프트에서 다음과 같이 실행하면 됩니다.
IDL> ireset
그러면 정말로 모든 그래픽창들을 제거할 것이냐고 묻는 팝업창이 뜨게 되고, 여기서 Yes를 눌러주면 모든 그래픽창들을 한꺼번에 없애줍니다. 다만 이렇게 중간에 팝업창이 뜨는 것이 번거롭게 느껴질 수도 있는데요. 따라서 이러한 팝업창조차도 뜨지 않게 하고 싶다면 다음과 같이 /NO_PROMPT 키워드를 함께 사용하면 됩니다.
IDL> ireset, /no_prompt
이렇게 하면 팝업창을 띄우지 않고 곧바로 모든 그래픽창들을 한꺼번에 제거해줍니다. 그리고 IRESET 명령에서 지원되는 키워드는 오직 /NO_PROMPT 하나뿐이기 때문에 다음과 같이 그냥 줄여서 적어도 됩니다.
IDL> ireset, /no
참고로 IRESET 명령은 원래는 iTools에서 사용되도록 만들어진 기능이지만 실제로는 NG 체계에서도 그냥 사용이 가능합니다. 그리고 이 IRESET 명령은 IDL 커맨드 입력창에서 뿐만 아니라 IDL 프로그램 내에서도 사용이 가능합니다. 물론 NG 체계에서 그래픽창들을 한꺼번에 제거하는데 있어서는 IRESET 명령의 사용 외에도 다른 방법(프로그램 내에서도 적용 가능한)도 있습니다. 다음과 같이 GETWINDOWS 함수를 사용하는 방법입니다.
w = GETWINDOWS( )
FOREACH i, w DO i.Close
이것은 GETWINDOWS 함수를 사용하여 현재 존재하는 모든 NG 그래픽창들의 정보를 불러온 다음 각 그래픽창에 대하여 Close 메서드를 적용하여 하나하나 제거하는 과정이라고 보면 됩니다. 이 방법 관련해서는 아래 링크의 내용도 함께 참조해보시면 좋을 것 같습니다.
http://idl.selab.re.kr/?p=5853
다음은 DG(Direct Graphics) 체계의 경우를 보겠습니다. 역시 간단하게 예를 들기 위하여 다음과 같이 WINDOW 프로시저를 사용하여 DG 체계의 그래픽창들을 세 개 띄워보겠습니다.
window, 0
window, 1
window, 2
일단 앞서 소개했던 IRESET 명령은 DG 체계에서는 작동하지 않습니다. 그 대신 별도의 방법이 있는데요. 원래 DG 체계에서는 그래픽창의 제거를 담당하는 WDELETE 명령이 있습니다. 다만 이 명령은 그래픽창의 번호를 지정하여 제거하는 방식으로 사용하거나 아니면 현재 액티브한 그래픽창을 제거하도록 사용해야 합니다. 즉 "한꺼번에" 제거하는 기능 자체는 이 명령에는 내장되어 있지 않습니다. 따라서 DG 그래픽창 N개가 띄워져있는 경우에는 WDELETE 명령도 N회 연속 사용해야 합니다. 여기서는 다음과 같이 3회 연속 사용해야 하겠지요.
IDL> wdelete
IDL> wdelete
IDL> wdelete
물론 좀 더 세련된 방법을 사용하자면 다음과 같이 액티브한 그래픽창들의 정보를 추출하여 반복적으로 제거 작업이 수행되도록 할 수도 있습니다.
IDL> while !d.window ne -1 do wdelete, !d.window
이 방법은 IDL 프로그램 내에서도 사용 가능하고 IDL 커맨드 입력창에서도 사용이 가능합니다. 물론 커맨드 입력창에서 이러한 내용을 필요할 때마다 매번 직접 타이핑해서 실행하는 방법도 있겠지만, 이 내용을 하나의 프로그램으로 만들어놓고 사용하는 방법도 있을 것입니다. 예를 들면 다음과 같이 하나의 프로그램으로 만들어두고 실제로는 wdeleteall_dg라는 명령을 실행하는 방식으로 사용하는 방법이겠이지요.
PRO wdeleteall_dg
while !d.window ne -1 do wdelete, !d.window
END
하여간 DG 체계에서는 이러한 방법이 있고, 제가 아는 한도 내에서는 이게 최선입니다(물론 혹시 제가 모르는 더 좋은 방법이 있을지도 모르겠지만). 참고로 DG 체계에서의 이러한 방법에 관해서는 제가 아래 링크의 내용을 참조하였음을 명시해둡니다.
https://idldatapoint.wordpress.com/2011/11/21/a-small-helpful-routine/