게시물 제목을 좀 짧게 축약해서 쓰느라 정확한 의미 전달이 다소 애매할 수도 있는데요. 오늘 언급하고자 하는 내용이 구체적으로 어떤 것이냐 하면, 32비트 OS용 IDL에서만 사용 가능한 기능을 64비트 OS용 IDL에서 사용하는 방법입니다. 이 내용은 최근에 IDL 본사인 Harris사의 블로그에 올라온 내용을 참조하였습니다. 참고를 위하여 이 원문 링크도 함께 걸어놓습니다.
요즘 많이 사용되는 OS들이 주로 64비트 기반인 경우가 많습니다. 따라서 IDL 사용자들도 64비트 OS에 64비트용 IDL을 설치해서 사용하는 경우가 더 많아지는 추세입니다. 그런데 32비트 OS용 IDL에서만 지원되던 기능들 중 64비트 OS용 IDL에서는 지원이 되지 않는 것들이 간혹 있습니다. 물론 이러한 경우는 몇 개 되지는 않습니다. IDL 도움말에서 About IDL -> IDL Feature Support 섹션을 보면 확인이 가능합니다. 그 중 대표적인 것이 DXF 형식의 파일에 대한 접근 기능인데요. 이 기능은 32비트 윈도우즈용 IDL에서만 지원되던 기능입니다. 따라서 64비트 윈도우즈용 IDL에서는 기본적으로 이 기능을 사용할 수가 없습니다. 이 기능을 사용하려면 IDLffDXF 객체를 생성해야 하는데, 이를 위한 다음과 같은 작업을 64비트 윈도우즈용 IDL에서 실행해보면 다음과 같이 에러가 발생하게 됩니다.
IDL> heart = obj_new('idlffdxf', filepath('heart.dxf', subdir = ['data']))
% OBJ_NEW: Dynamically loadable module is unavailable on this platform: DXF.
% Execution halted at: $MAIN$
물론 방법이 아예 없는 것은 아닌데, 가장 먼저 떠올릴 수 있는 방법은 32비트 모드용 IDL 세션을 따로 열고 그 안에서 위의 작업을 수행하는 것입니다. 즉, 64비트 윈도우즈용 IDL을 설치하면 32비트 모드 전용 IDL을 실행할 수 있는 기능도 함께 설치가 되기 때문입니다. 그런데 굳이 이렇게 32비트 모드 전용 IDL 세션을 따로 띄우지 않고, 그냥 64비트용 IDL 세션에서 바로 해결하는 방법이 있습니다. 바로 IDL-IDL 브릿지 기능을 활용하는 것입니다. IDL-IDL 브릿지 기능은 현재의 IDL 세션과 독립적으로 돌아가는 IDL 프로세스를 생성하는 기능으로서, IDL_IDLBRIDGE 함수를 사용하여 독립 프로세스를 생성하는 방식입니다. 다음과 같이 이 함수를 사용하여 독립적인 IDL 프로세스를 생성하되, OPS라는 키워드를 사용하여 32비트 기반의 프로세스를 생성하는 것이 가장 먼저 필요합니다.
IDL> b = idl_idlbridge(ops = 32)
그리고 이 프로세스내에서 IDLffDXF 개체 생성 및 기타 필요한 작업들을 수행하면 됩니다. 다음은 IDL의 설치 디렉토리내에 이미 존재하는 heart.dxf라는 파일을 열고 이 안에 담긴 폴리곤 데이터를 추출하여 IDLgrPolygon 객체로서 가시화하는 과정입니다. 여기서는 독립 프로세스상에서 실행되어야 할 작업 내용들을 IDL-IDL 브릿지 객체에 Execute 메서드를 사용하여 전달하는 방식이 사용되고 있다는 점을 유념해야 합니다.
IDL> command = "heart = obj_new('idlffdxf', filepath('heart.dxf', subdir = ['examples','data']))"
IDL> IDL> b->execute, command
IDL> IDL> b->execute, "heartTypes = heart->getcontents()"
IDL> IDL> b->execute, "tissue = heart->getentity(heartTypes[1])"
IDL> IDL> b->execute, "connectivity = *tissue.connectivity"
IDL> IDL> b->execute, "vertices = *tissue.vertices"
IDL> IDL> vertices = b.getvar('vertices')
IDL> IDL> connectivity = b.getvar('connectivity')
IDL> IDL> poly = idlgrpolygon(vertices, poly = connectivity, style = 2, color = !color.red)
IDL> IDL> xobjview, poly
이 과정들이 모두 실행되면 다음과 같은 XOBJVIEW 인터페이스상에서 이 폴리곤 객체를 볼 수 있게 됩니다.
위 예제에서는 DXF 파일 접근이라는 32비트 IDL 전용 기능을 64비트용 IDL에서 사용하는 방법을 소개하였습니다. 그리고 이를 위하여 IDL-IDL 브릿지 기능이 핵심 역할을 하였으며, 구체적으로는 IDL_IDLBRIDGE 함수로 생성된 독립 프로세스 객체에 수행 명령들을 Execute 메서드로 전달하는 방식이 사용되었다는 점을 주목하면 됩니다. IDL_IDLBRIDGE 함수에 관한 좀 더 구체적인 내용은 IDL 도움말을 참조하시기 바랍니다. IDL-IDL 브릿지 기능도 물론 사용 빈도수가 높은 편은 아니지만 방대한 작업을 수행하는데있어서 나름 유용한 해결책이 될 수 있으므로 관심을 가져보는 것도 좋을 것 같습니다.
그리고 위의 예제와 같이 64비트용 IDL에서 32비트용 IDL 세션을 생성하는 것은 가능하지만, 반대로 32비트용 IDL에서 64비트용 IDL 세션을 생성하는 것은 당연히(!) 불가능합니다. 그리고 64비트용 IDL이라 하더라도 OS의 종류에 따라서는 32비트용 IDL 세션을 생성하는 것이 불가능할 경우도 있습니다. 예를 들어 Mac OS X El Capitan에서 사용되는 64비트 IDL에서는 32비트용 세션의 생성이 아예 불가능합니다. 이와 같이 OS의 특성을 타는 부분도 있다는 점을 염두에 둬야 합니다. 따라서 오늘 소개해드린 이 내용은 사실상 윈도우즈용 IDL과 가장 연관성이 깊은 이슈라고 봐도 무리가 없을 것 같습니다.
'IDL > General' 카테고리의 다른 글
IDL 관련 주요 웹 링크 정리 (2016년 7월 기준) (0) | 2016.07.19 |
---|---|
외부 라이브러리 설치 및 경로 설정 (0) | 2016.07.07 |
Windows 10용 IDL에서 그림 저장 문제 (0) | 2016.04.18 |
IDL on Mac OS X 10.11 (El Capitan) (0) | 2015.11.27 |
IDL 8.5 출시 (0) | 2015.08.24 |