Architecture
ImEDA의 전체 시스템 아키텍처와 모듈 구조를 설명합니다. imapp(애플리케이션 레이어)과 imengine(CAD 엔진)의 분리 구조, DLL 기반 모듈 시스템, 이벤트 통신 메커니즘을 다룹니다.
전체 구조
ImEDA는 크게 imapp(애플리케이션 계층)과 imengine(CAD 엔진 계층)으로 나뒝니다.
두 계층은 bridge_dll을 통해 연결되며, 각 계층은 독립적으로 빌드되고 DLL 형태로 동적 로딩됩니다.
설계 원칙
위젯 없이도 문서 작업이 100% 정상 동작해야 합니다. 문서와 위젯 사이의 강한 결합은 금지되며,
문서에서 위젯으로는 비동기 이벤트(c_async_event_manager::push()),
위젯에서 문서로는 Lua 콜백을 통해 간접적으로 통신합니다.
기술 스택
| 영역 | 기술 | 용도 |
|---|---|---|
| 언어 | C++20 | 코어 엔진 및 애플리케이션 전체 |
| UI Framework | wxWidgets | 윈도우 관리, Ribbon UI, 네이티브 OS 통합 |
| Immediate UI | ImGui | 위젯, 다이얼로그, Inspector, 도킹 패널 |
| 렌더링 | OpenGL 3.3+ | CAD 뷰 렌더링 (GLSL Shader) |
| 스크립팅 | Lua / Sol2 | Drawing Tool, 자동화, 확장 기능 |
| 데이터베이스 | SQLite3 | 라이브러리 DB (.imslib, .imflib, colortable.db3) |
| 직렬화 | nlohmann/json | 설정 파일, 액션 정의, 이벤트 페이로드 |
| 빌드 | CMake | 크로스플랫폼 빌드 시스템 (Windows/Linux/Mac) |
| AI | LLM API | Datasheet 분석, Symbol-FP 매핑, Design Review |
DLL 모듈 시스템
ImEDA의 imapp 계층은 27개 이상의 DLL로 구성됩니다.
각 DLL은 독립적으로 빌드되며, 런타임에 동적으로 로딩됩니다.
common_dll은 항상 로딩되어 모든 모듈에서 공통 유틸리티를 사용할 수 있습니다.
핵심 모듈
common_dll
공통 기능 모듈 — c_console, c_action_manager, c_msgbox, c_udpmsg, c_paths, c_filesystem, c_mlts 등 기반 유틸리티를 제공합니다.
항상 로딩bridge_dll
imapp과 imengine 사이의 브릿지 — DLL export 함수를 통해 엔진 기능을 애플리케이션에 노출합니다.
엔진 연결dialog_dll
모든 다이얼로그의 기반 — c_imgui_dialog 기반 wxFrame에서 ImGui로 렌더링하며, 네이티브 컨트롤을 사용하지 않습니다.
UIai_dll
AI 기능 모듈 — LLM API 연동, Datasheet 분석, RAG VectorDB, Symbol-FP 매핑 등 AI 관련 서비스를 제공합니다.
AIconverter_dll
포맷 변환 모듈 — KiCad, Altium, Eagle, EasyEDA 등 외부 EDA 포맷의 양방향 변환을 처리합니다.
변환imsexpr_dll
S-Expression 파서 — Snippet(.imsnip) 파싱과 직렬화를 담당합니다. 기존 엔진 파서를 대체합니다.
파서위젯 모듈
각 위젯은 별도의 DLL로 분리되어 독립적으로 개발/배포됩니다.
| 모듈 | 기능 |
|---|---|
| widget_project_dll | 프로젝트 트리 — 파일 관리, 컨텍스트 메뉴, 드래그 앤 드롭 |
| widget_filemgr_dll | 파일 매니저 — 디렉토리 탐색, 파일 열기/삭제 |
| widget_schlibmgr_dll | 심볼 라이브러리 매니저 — .imslib 검색, 미리보기 |
| widget_fplibmgr_dll | 풋프린트 라이브러리 매니저 — .imflib 검색, 미리보기 |
| widget_console_dll | 콘솔 출력 — 로그, 경고, 에러 표시 |
| widget_inspector_dll | Object Inspector — 선택 객체 속성 편집 |
| widget_navigator_dll | 문서 네비게이터 — 전체 보기, 줌/패 제어 |
이벤트 통신
imengine과 imapp 사이의 통신은 이벤트 콜백 메커니즘으로 이루어집니다. 엔진에서 발생한 이벤트는 JSON 페이로드와 함께 애플리케이션으로 전달됩니다.
주요 이벤트
| 이벤트 | 방향 | 용도 |
|---|---|---|
EVT_QUEUE_ACTION | engine → app | 액션 큐에 작업 등록 |
EVT_EXECUTE_ACTION | engine → app | 액션 즉시 실행 |
EVT_SET_MODIFIED | engine → app | 문서 수정 상태 플래그 설정 |
EVT_SET_WINDOW_CURSOR | engine → app | 마우스 커서 변경 |
EVT_SHOW_WAIT_PANEL | engine → app | 대기 패널 표시 |
EVT_HIDE_WAIT_PANEL | engine → app | 대기 패널 숨김 |
EVT_COLORTABLE_CHANGED | engine → app | 색상 테이블 변경 알림 |
DLL Export 함수
엔진 연동에 사용되는 주요 DLL export 함수:
cdf_set_event_callback,
cdf_set_lua_printf_callback,
cdf_sync_paths.
이 함수들은 bridge_dll을 통해 엔진 초기화 시점에 등록됩니다.
빌드 시스템
ImEDA는 CMake 기반 빌드 시스템을 사용하며, Windows/Linux/Mac 크로스플랫폼을 지원합니다.
병렬 빌드(-j8)로 빠른 빌드가 가능합니다.
경로 시스템
모든 경로는 c_paths, 모든 파일 I/O는 c_filesystem을 사용합니다.
직접 하드코딩이나 std::filesystem 사용은 금지됩니다.
| 영역 | 기반 경로 | 용도 | 주요 메서드 |
|---|---|---|---|
| Root | install/ |
읽기 위주 (설정, 데이터, 아이콘) | root_dir(), conf_dir(), data_dir(), icons_dir() |
| User | AppData/Local/ImEDA/ |
읽기/쓰기 (사용자 설정, 임시 파일) | user_local_dir(), user_conf_dir(), user_temp_dir() |
경로 규칙
런타임에 생성되는 파일(위젯 상태, 사용자 설정 등)은 반드시 User 영역에 저장합니다.
Root의 temp_dir()은 엔진/빌드 전용입니다.
새 경로 메서드를 추가할 때는 syncPaths()와 cdf_sync_paths()를 동시에 수정해야 합니다.