콘텐츠로 이동

기본 해도 로딩·표시

ENC Kernel SDK 의 가장 기본적인 사용 흐름. Win32 또는 Qt OpenGL 위젯 안에서 셀 한 장을 로딩하여 화면에 표시한다.

  • henc.h 인클루드와 henc.lib 링킹
  • 유효한 OpenGL 컨텍스트 (Win32 wglCreateContext 또는 Qt QOpenGLWidget)
  • data/encoptions.ini 와 S-52 데이터 디렉토리가 실행 경로에 존재
  • S-57 셀 파일 한 장 (예: S57/KR4A4061.000)
#include "henc.h"
#include <stdio.h>
// Win32 + OpenGL 컨텍스트가 이미 준비된 상태로 가정
int main(int argc, char** argv) {
// 1. 라이브러리 초기화 - S-52 데이터 + 사용자 설정 로딩
if (hencInit() != 0) {
fprintf(stderr, "hencInit failed - check encoptions.ini and S-52 data path\n");
return -1;
}
// 2. 뷰 핸들 생성 (멀티 뷰는 hencCreate 를 여러 번 호출)
int view = hencCreate();
if (view < 0) {
hencDeinit();
return -2;
}
// 3. 현재 OpenGL 컨텍스트를 이 뷰에 연결
hencSelect(view);
// 4. 뷰포트 크기 - 윈도우 크기 변경 시 OnSize 에서 다시 호출
hencSetViewport(view, 0, 0, 1024, 768);
// 5. S-57 셀 로딩 (SENC 가 없으면 자동 변환)
if (hencLoad("S57/KR4A4061.000") != 0) {
fprintf(stderr, "chart load failed\n");
hencDelete(view);
hencDeinit();
return -3;
}
// 6. 초기 중심 좌표·줌 설정 - 위경도 단위 (도 단위 decimal)
hencSetCenter(view, 129.42, 35.10); // 부산 인근
hencSetZoom(view, 12.0);
// 7. 렌더링 - 백버퍼에 그린다
hencClearBackground(view);
hencRender(view);
hencSwapBuffer(view); // 더블 버퍼 스왑 → 화면 반영
// ... 응용 메시지 루프 (마우스·키보드 입력 처리, 필요 시 다시 hencRender) ...
// 8. 종료 처리
hencDelete(view); // 뷰 핸들 해제
hencDeinit(); // 라이브러리 + 메모리 정리
return 0;
}
  1. hencInit - 한 번만, 응용 시작 시
  2. hencCreate - 뷰당 한 번, 멀티 뷰는 여러 번
  3. hencSelect - OpenGL 컨텍스트 바인딩
  4. hencSetViewport - 윈도우 크기 동기화
  5. hencLoad - 셀 또는 카탈로그 로딩
  6. hencSetCenter / hencSetZoom - 초기 위치
  7. hencRender + hencSwapBuffer - 매 프레임
  8. hencDelete / hencDeinit - 응용 종료 시
  • hencInit 실패: data/encoptions.ini 경로가 작업 디렉토리 기준 상대경로다. 실행 경로가 다르면 절대경로 사용을 검토.
  • 빈 화면: hencSelect 가 호출되지 않았거나 OpenGL 컨텍스트가 현재 스레드 활성 상태가 아닌 경우. wglMakeCurrenthencSelect 순서 확인.
  • 셀 로딩은 성공했는데 그려지지 않음: 줌 레벨이 셀의 최소·최대 스케일 범위를 벗어났을 가능성. hencSetViewMapByScale 또는 hencSetUseScaleMinMax 로 디버깅.