Sangwoo

게시판 답변이 생성됐습니다

15 글 보임 - 316 에서 330 까지 (총 358 중에서)
  • 글쓴이
  • Sangwoo
    회원

    SYMBOL 키워드를 사용해서 어떤 형태의 심볼을 쓸 것인지도 명시가 되어야 합니다. 예를 들어, 원형을 쓸 경우라면 SYMBOL=’circle’과 같은 방식이 되겠죠. 그리고 SYMSIZE 키워드에 부여되는 값은 그 단위가 플롯 자체의 X 또는 Y축 방향 길이의 10%에 해당되는 길이인 것으로 도움말에 나와 있습니다. 이 점을 감안해서 적당한 범위의 값이 되도록 스케일 조정은 알아서 하셔야 합니다.

    답변: IDL save 파일 restore시 발생하는 문제 #1063
    Sangwoo
    회원

    단순히 변수들만 저장된 SAV파일이라면 버전은 상관이 없는 것으로 알고 있습니다. 그 SAV파일이 혹시 생성시 /routines라는 키워드가 사용됨으로써 실행파일 역할까지 하도록 되어 있는 것인지, 아니면 그야말로 변수나 배열 등만 저장된 SAV인지 궁금합니다. 그리고 처음 SAV 파일을 생성할 때 사용된 SAVE 명령의 정확한 내용 및 양쪽 IDL의 버전 번호도 알려주시면 좋겠습니다.

    답변: 오브젝트 그래픽 질문입니다. #1062
    Sangwoo
    회원

    코드로 적어주신 내용을 참조해보면 1d6 정도까지는 잘 되다가 1d7부터 축의 눈금을 제대로 잡지 못하는 현상이 보이는군요. 사실 정상적으로 되어야 하는데 뭔가 필요한 셋팅이 더 있는지도 모르겠습니다. 저도 좀 더 알아봐야 할 것 같습니다. 사실 NG 체계에서는 잘 되는 것으로 봐서는 뭔가 저도 모르는 비밀이 있나봅니다. 참고가 될 것 같아서 NG 체계에서의 테스트 코드를 아래 적어봅니다.

    pl = plot(indgen(101), /nodata, xrange=[0D, 1D]+1D8, xtickformat='(D11.1)’)

    답변: 오브젝트 그래픽 질문입니다. #1058
    Sangwoo
    회원

    처음에 축 객체를 생성했을 때의 스케일이 중간에 축범위를 바꿔줌으로써 조정이 된 상태인데요. OG에서 축의 라벨값들도 사실은 IDLgrText 클래스의 객체들입니다. 그리고 이 텍스트 객체들 역시 그 스케일 조정의 영향을 받습니다. 예를 들면 처음에 축 범위가 0~1이었는데, 이 축을 나중에 0~100의 범위로 조정을 하면, 축 라벨 텍스트들의 크기 역시 영향을 받는단 얘기입니다. 그렇게 되면 사실 축 범위를 바꿀 때마다 라벨 문제의 크기가 자꾸 변하게 되겠죠. 지금도 그런 문제때문에 라벨 문자들의 가로 방향 크기가 너무 커진 경우입니다. 그래서 축 객체 생성후, 라벨 문자 객체의 속성을 조정함으로써, 이와 같은 범위 변화에 관계없이 원래 크기를 유지하도록 따로 설정을 해줘야 합니다. 처음에 축 객체를 생성한 직후에 다음과 같은 문구들을 넣어보세요.

    ax -> GetProperty, TICKTEXT=oTT
    oTT -> SetProperty, RECOMPUTE_DIMENSIONS=2

    그러면 축 라벨 문자들의 크기가 온전하게 유지가 되는 것을 확인할 수 있습니다. 그리고 이외에 추가적인 조언을 드린다면, 지금 그려진 축은 너무 화면에 꽉 차게 그려지고 있는데요. NORM_COORD로 얻어진 tran의 원소값들을 다음과 같이 적당히 조정해보세요. 그러면 좌우에 적당한 여백을 둘 수 있습니다. 이러한 조정값은 그래픽창의 크기 등에 따라서도 다를 수 있기 때문에 이리저리 해보시고 적당한 값을 찾으시면 됩니다.

    tran[1] = tran[1]*0.84
    tran[0] = tran[0]+0.11

    객체 지향 그래픽 체계란게 상당히 많은 부분들까지 프로그래머가 직접 챙겨줘야 하는 경우가 많습니다. 이 경우도 그러한 예라고 보시면 됩니다.

    Sangwoo
    회원

    의도적으로 NaN 값을 사용하려면 !values.f_nan이란 값을 이용하면 됩니다. 예를 들면, a = !values.f_nan이라고 대입하고 a의 값을 출력해보면 NaN이라고 나옵니다. 참고로 무한대에 해당되는 값도 !values.f_infinity란 값으로 사용이 가능합니다.

    Sangwoo
    회원

    올려주신 코드와 유사한 내용을 제가 실행해봤을 때에는 컬러바가 4개 색상들로 잘 나오는 것으로 확인이 되는데요. 사용중이신 colorbar라는 명령은 사실 IDL 기본 라이브러리에 있는 것이 아니고, David Fanning의 Coyote 라이브러리에 포함된 루틴입니다. 그래서 언제적 버전을 받아서 쓰느냐에 따라 약간 기능상의 차이가 있을지는 모르겠습니다. 제가 이 루틴의 가장 최근 버전(2009년 11월 업데이트)을 갖고 테스트해본 바로는 컬러바가 제대로 구현이 됩니다. 이 부분을 일단 확인해보실 필요가 있을 것 같습니다.

    그리고 링크해주신 그림을 봐서는 컬러바를 밖으로 빼는 것보다는 지도 그림 자체를 그릴 때 인위적으로 우측의 여백을 줘야 할 것으로 보입니다. 지도를 그릴 때 사용된 map_set 명령에도 position 키워드가 있을테니 적당히 조절을 하시면 됩니다. 그리고 컬러바 맨위의 숫자가 나오는 것은, 컬러바를 그릴 때 컬러 갯수가 4개이므로 눈금이 5개가 나옵니다. 그런데 ticknames에 부여된 문자값 배열에는 4개의 문자들만 들어가 있기 때문에, 남는 하나를 IDL이 알아서 부여했기 때문입니다. 따라서 마지막 눈금의 문자를 인위적으로 공백과 같은 것으로 지정해주면(ticknames=[annot, ‘ ‘]) 해결됩니다.

    답변: VM 파일에 관한 질문입니다. #1014
    Sangwoo
    회원

    VM으로 실행 가능한 파일을 만들 때 지켜져야 할 순서가 있습니다. 다음과 같은 순서가 지켜졌는지 확인해보시기 바랍니다. 각각의 과정들은 별다른 오류없이 실행되어야 합니다.

    1. 소스코드(.pro 파일)를 컴파일한다.
    2. 커맨드 입력창에서 RESOLVE_ALL 명령을 수행한다.
    3. 다음과 같이 SAVE 명령을 수행한다.
    SAVE, /ROUTINES, FILENAME=’~~~.sav’

    답변: text 첨자 관련 질문 #1013
    Sangwoo
    회원

    언급하신 문자 입력법은 LaTex와 유사한 문자 입력 체계로서, 현재 IDL에서는 New Graphics 체계에서만 적용됩니다. Direct Graphics에서는 적용이 안됩니다. 따라서 플롯의 예를 들면, PLOT 함수를 사용할 때에는 사용 가능하지만, PLOT 프로시저에서는 효과가 없습니다. 아래 두 명령을 실행하여 결과를 비교해보면 확인이 가능합니다.

    p = plot(indgen(11), title=’$\rho$!Dhv’)
    plot, indgen(11), title=’$\rho$!Dhv’

    Sangwoo
    회원

    위의 내용에서 중간에 한 군데가 오타가 나서 정정합니다.

    PRINT, STRLEN(spl[0]) –> PRINT, spl[0]

    Sangwoo
    회원

    블로그에 올리기보단 그냥 여기서 답을 드리는게 나을 것 같아서 적어봅니다. 한국어, 일어, 중국어와 같은 2바이트 유니코드 문자들도 IDL에서 얼마든지 인식이 가능합니다. 예제로 적어놓으신 텍스트의 내용을 담은 원본 텍스트 파일이 있을텐데요. 이 파일로부터 한 줄씩 내용을 읽어서 처리해야 합니다. 일단 첫번째 줄만 읽어서 처리를 해본다고 하면, 다음과 같은 방식의 작업이 이루어져야 합니다. 이 내용에 대한 자세한 설명은 생략합니다.

    ifile = ‘~~.txt’
    nl = FILE_LINES(ifile); 파일내 줄 수 확인
    OPENR, lun, ifile, /GET_LUN
    ss = ”
    READF, lun, ss

    첫번째 줄의 내용은 보면 다음과 같이 되어 있기 때문에 위의 ss라는 변수에도 다음과 같은 내용의 문자값이 들어간 상태입니다.

    140|2013|01|12|だ す|だ こ|こ1210-こわ1500-1558. て1552-1655. こ1650-こゎ1800-こわ2100-こわ2400-|=

    여기서 중간중간에 공백(space)이 존재하는데 이를 마디로 삼아서 분리해내는 작업은 다음과 같이 STRSPLIT 함수를 사용합니다.

    spl = STRSPLIT(ss, ‘ ‘, /EXTRACT)
    HELP, spl

    여기서 HELP의 결과를 보면 spl은 5개의 문자값들을 갖는 배열이 됩니다. 즉, 공백으로 나눠진 마디마디의 문자값들을 담고 있으므로, 가장 첫번째 값인 spl[0]을 출력해보라고 하면 다음과 같이 첫번째 마디의 문자값을 출력할겁니다.

    PRINT, STRLEN(spl[0])
    140|2013|01|12|だ

    여기서 이 문자값의 맨 마지막 부분의 だ라고 된 문자만 따로 추출하려면 STRMID 함수를 다음과 같이 사용합니다.

    extr = STRMID(spl[0], 15)
    PRINT, extra

    여기서는 spl[0]라는 문자에 대하여 16번째(인덱스로는 15)부터 끝까지의 문자들을 모두 뽑아내라는 의미입니다. 물론 16번째부터 몇 글자를 뽑아내라는 의미의 추가인자를 줄 수도 있습니다. 그런데 이 ‘몇 글자’라는 의미가 영문일 경우에는 스펠 하나당 한 개로 간주되지만, 2바이트 유니코드 언어의 경우에는 3개로 간주가 되는 것 같습니다. 그래서 이 추가인자를 사용해서 추출할 경우에는 다음과 같이 적어줘야 합니다.

    extr = STRMID(spl[0], 15, 3)
    PRINT, extra

    결국 이와 같이 추출된 extr이라는 문자값에 대하여 IF문을 사용하여 원하시는 처리를 하면 됩니다. 예를 들면 다음과 같은 처리도 가능하겠죠.

    IF extr EQ ‘だ’ THEN PRINT, ‘OK’
    OK

    이 내용은 한 줄을 처리할 경우인데, 만약 여러 줄을 한꺼번에 처리하려면 nl만큼 반복을 수행하는 반복문이 사용이 되어야 합니다. 그리고 처리가 다 끝난 후에는 파일을 읽기 위하여 열었던 슬롯번호는 닫아줘야 함을 잊지 말아야 합니다.

    FREE_LUN, lun

    Sangwoo
    회원

    우선 후자의 질문에 대해서는 예전 IDL User 게시판에 비슷한 이슈에 관한 글이 있어서 참조를 해보시면 어떨까 합니다. 링크는 아래와 같습니다.

    http://www.spweather.com/idluser/bbs/view.php?id=idltip&page=4&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=100

    그리고 전자의 질문에 대해서는 제가 일어를 써본 적은 없지만 한글, 중국어 등의 아시아 지역 언어들이 다 같은 계열의 문자이므로 마찬가지일 것 같은데요. 인식은 가능하지만 글자의 위치 등에 대해서는 영문과 약간 다르게 생각해야 합니다. 이 문제에 관해서는 제가 나중에 정리해서 제 블로그에 글을 올리고 다시 알려드리겠습니다.

    Sangwoo
    회원

    플롯을 그릴 때 축 자체가 아예 안나오게 하는 방법은 XSTYLE, YSTYLE 키워드의 값을 4로 셋팅하는 것입니다. 이 방법을 사용해보세요.

    PLOT, ~~~~, XSTYLE=4, YSTYLE=4

    Sangwoo
    회원

    아마도 PLOT으로 그려진 XY축 공간안에 이미지가 딱맞게 그려지도록 하기 위하여, PLOT에 이어서 cgImage가 사용된 것 같습니다. 사실 cgImage는 IDL의 기본 라이브러리가 아닌 Coyote 라이브러리에 있는 프로그램인 것으로 아는데, 저는 개인적으로 사용해보지는 않아서 내부적인 과정은 정확히는 모릅니다. 하지만 제 생각에는 cgImage가 사용된 후에 PLOT이 한번 더 사용되어야 할 것 같습니다. 다만, 이 때 다른 인자나 키워드들은 그대로 사용하되 /NOERASE라는 키워드를 추가하면 기존의 그림(여기서는 cgImage로 그려진 이미지일겁니다)을 지우지 않고 플롯을 다시 덧그려주는 역할을 합니다.

    Sangwoo
    회원

    그러시다면 첫번째 댓글의 내용이 정답입니다.

    Sangwoo
    회원

    “hie_read 안에서 프로시저를 끝내는 것”의 의미가 hie_read라는 프로시저 자체를 끝낸다는 것인지 아니면 위의 반복문을 포함하는 몸통 프로시저를 끝낸다는 의미인지 궁금합니다.

15 글 보임 - 316 에서 330 까지 (총 358 중에서)