Architecture

ImEDA의 전체 시스템 아키텍처와 모듈 구조를 설명합니다. imapp(애플리케이션 레이어)과 imengine(CAD 엔진)의 분리 구조, DLL 기반 모듈 시스템, 이벤트 통신 메커니즘을 다룹니다.

전체 구조

ImEDA는 크게 imapp(애플리케이션 계층)과 imengine(CAD 엔진 계층)으로 나뒝니다. 두 계층은 bridge_dll을 통해 연결되며, 각 계층은 독립적으로 빌드되고 DLL 형태로 동적 로딩됩니다.

Application Layer (imapp)
Workspace
Widgets
Dialogs
Converters
common_dll
dialog_dll
ai_dll
imsexpr_dll
↓ bridge_dll ↓
CAD Engine (imengine)
Document Model
Geometry
GAL Rendering
View System
Lua / Sol2
File I/O
OpenGL 3.3+
SQLite3
OS / Platform

설계 원칙

위젯 없이도 문서 작업이 100% 정상 동작해야 합니다. 문서와 위젯 사이의 강한 결합은 금지되며, 문서에서 위젯으로는 비동기 이벤트(c_async_event_manager::push()), 위젯에서 문서로는 Lua 콜백을 통해 간접적으로 통신합니다.

기술 스택

영역기술용도
언어C++20코어 엔진 및 애플리케이션 전체
UI FrameworkwxWidgets윈도우 관리, Ribbon UI, 네이티브 OS 통합
Immediate UIImGui위젯, 다이얼로그, Inspector, 도킹 패널
렌더링OpenGL 3.3+CAD 뷰 렌더링 (GLSL Shader)
스크립팅Lua / Sol2Drawing Tool, 자동화, 확장 기능
데이터베이스SQLite3라이브러리 DB (.imslib, .imflib, colortable.db3)
직렬화nlohmann/json설정 파일, 액션 정의, 이벤트 페이로드
빌드CMake크로스플랫폼 빌드 시스템 (Windows/Linux/Mac)
AILLM APIDatasheet 분석, 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로 렌더링하며, 네이티브 컨트롤을 사용하지 않습니다.

UI

ai_dll

AI 기능 모듈 — LLM API 연동, Datasheet 분석, RAG VectorDB, Symbol-FP 매핑 등 AI 관련 서비스를 제공합니다.

AI

converter_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_dllObject Inspector — 선택 객체 속성 편집
widget_navigator_dll문서 네비게이터 — 전체 보기, 줌/패 제어

이벤트 통신

imengine과 imapp 사이의 통신은 이벤트 콜백 메커니즘으로 이루어집니다. 엔진에서 발생한 이벤트는 JSON 페이로드와 함께 애플리케이션으로 전달됩니다.

imengine → imapp 이벤트 흐름
c_face::FireEvent(evtName, jsonStr)
s_eventCallback (DLL export)
onEngineEvent() — imapp 처리

주요 이벤트

이벤트방향용도
EVT_QUEUE_ACTIONengine → app액션 큐에 작업 등록
EVT_EXECUTE_ACTIONengine → app액션 즉시 실행
EVT_SET_MODIFIEDengine → app문서 수정 상태 플래그 설정
EVT_SET_WINDOW_CURSORengine → app마우스 커서 변경
EVT_SHOW_WAIT_PANELengine → app대기 패널 표시
EVT_HIDE_WAIT_PANELengine → app대기 패널 숨김
EVT_COLORTABLE_CHANGEDengine → 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)로 빠른 빌드가 가능합니다.

# Incremental build (변경 파일만) make.bat # Clean build (전체 재빌드) build.bat clean

경로 시스템

모든 경로는 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()를 동시에 수정해야 합니다.