기본 해도 로딩·표시
ENC Kernel SDK 의 가장 기본적인 사용 흐름. Win32 또는 Qt OpenGL 위젯 안에서 셀 한 장을 로딩하여 화면에 표시한다.
사전 조건
섹션 제목: “사전 조건”henc.h인클루드와henc.lib링킹- 유효한 OpenGL 컨텍스트 (Win32
wglCreateContext또는 QtQOpenGLWidget) 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;}흐름 요약
섹션 제목: “흐름 요약”- hencInit - 한 번만, 응용 시작 시
- hencCreate - 뷰당 한 번, 멀티 뷰는 여러 번
- hencSelect - OpenGL 컨텍스트 바인딩
- hencSetViewport - 윈도우 크기 동기화
- hencLoad - 셀 또는 카탈로그 로딩
- hencSetCenter / hencSetZoom - 초기 위치
- hencRender + hencSwapBuffer - 매 프레임
- hencDelete / hencDeinit - 응용 종료 시
자주 마주치는 문제
섹션 제목: “자주 마주치는 문제”hencInit실패:data/encoptions.ini경로가 작업 디렉토리 기준 상대경로다. 실행 경로가 다르면 절대경로 사용을 검토.- 빈 화면:
hencSelect가 호출되지 않았거나 OpenGL 컨텍스트가 현재 스레드 활성 상태가 아닌 경우.wglMakeCurrent후hencSelect순서 확인. - 셀 로딩은 성공했는데 그려지지 않음: 줌 레벨이 셀의 최소·최대 스케일 범위를 벗어났을 가능성. hencSetViewMapByScale 또는 hencSetUseScaleMinMax 로 디버깅.