Geometry - 기하학 시스템
~25개 헤더 파일 - 모든 CAD 객체의 기하학적 기반
개요
기하학 시스템은 imengine의 모든 CAD 객체가 사용하는 도형, 텍스트, 변환의 기반입니다. c_geo_item이 최상위 기반 클래스이며, c_view_item을 상속합니다.
c_view_item
↓
c_geo_item
위치, 바운딩박스, 변환, 히트테스트, 직렬화
위치, 바운딩박스, 변환, 히트테스트, 직렬화
↓
c_sch_item
c_board_item
c_geo_text
c_geo_group
도형 클래스
| 도형 | 클래스 | 설명 |
|---|---|---|
| Circle | c_shape_circle | 원. 중심점과 반지름으로 정의됩니다. |
| Ellipse | c_shape_ellipse | 타원. 중심, 장축, 단축, 회전각으로 정의됩니다. |
| Arc | c_shape_arc | 원호. CW(시계방향) 각도 시스템을 사용하며, 3점(start, mid, end)으로 생성합니다. |
| Segment | c_seg | 선분. 시작점과 끝점으로 정의되는 직선 세그먼트입니다. |
| Line | c_shape_line | 선. 폭(width)을 가진 선으로, 배선이나 도형 외곽선에 사용됩니다. |
| Polygon | c_shape_polygon | 다각형. 꼭짓점 목록으로 정의되는 닫힌 영역입니다. |
| RoundRect | c_shape_roundrect | 둥근 모서리 사각형. 모서리 반지름을 지정할 수 있습니다. |
| PolySet | c_shape_polyset | 다각형 집합. Boolean 연산(합집합, 차집합)을 지원합니다. |
| LineChain | c_shape_linechain | 연결된 선분 체인. 열린/닫힌 경로 모두 표현 가능합니다. |
c_geo_text - 텍스트 요소
텍스트는 CAD에서 심볼 이름, 핀 번호, 치수 값 등에 광범위하게 사용됩니다. c_geo_text는 폰트, 정렬, 크기, 회전 등 텍스트 렌더링에 필요한 모든 속성을 관리합니다.
폰트 속성
- 폰트 크기 (height/width)
- 볼드, 이탤릭
- 수평 정렬 (Left/Center/Right)
- 수직 정렬 (Top/Center/Bottom)
변환 속성
- 위치 (x, y)
- 회전각 (degrees)
- 미러링 (flip)
- 가시성 (visible/hidden)
c_geo_group - 그룹화
여러 기하학 요소를 하나의 그룹으로 묶어 일괄 이동, 회전, 복사 등의 변환을 적용할 수 있습니다. 그룹은 중첩(nested group)이 가능합니다.
Arc 규칙
핵심 규칙: Arc 생성은 반드시
SetArc3p(startPt, midPt, endPt)를 사용합니다. SetArcCSE는 내부 swap 문제로 사용 금지입니다.| 항목 | 규칙 |
|---|---|
| 각도 방향 | CW (시계방향). engineDeg = 360 - mathDeg |
| Y축 | 반전: y = cy - r * sin(rad(deg)) |
| 끝 각도 | GetEndAngleDegree()는 ea < sa일 수 있음. effectiveEa = ea < sa ? ea + 360 : ea |
| 생성 방법 | SetArc3p(start, mid, end) 필수. SetArcCSE 금지 |
Intersection - 교차점 계산
lgeo2d 라이브러리는 기하학 요소 간의 교차점을 계산합니다. 오버로드는 Line < Circle < Arc 순서만 존재합니다.
// 올바른 호출 순서 intersect(Line, Circle); // OK - Line < Circle intersect(Line, Arc); // OK - Line < Arc intersect(Circle, Arc); // OK - Circle < Arc // 잘못된 호출 순서 intersect(Circle, Line); // ERROR - 오버로드 없음 intersect(Arc, Line); // ERROR - 오버로드 없음
HV Snaplines
수평(Horizontal)/수직(Vertical) 스냅라인은 CAD 편집 시 요소 정렬을 돕는 시각적 가이드입니다. 마우스 커서가 다른 요소와 수평 또는 수직으로 정렬될 때 자동으로 표시됩니다.
Control Points & Edit Constraints
각 도형은 편집을 위한 컨트롤 포인트를 노출합니다. 사각형의 모서리, 원의 중심과 반지름 핸들, Arc의 시작/중간/끝점 등이 여기에 해당합니다. 편집 제약조건(constraints)은 특정 방향으로만 이동, 각도 스냅 등을 정의합니다.
BGRA Color
imengine은 BGRA 포맷의 32비트 정수로 색상을 표현합니다.
// BGRA 비트 레이아웃 A(31:24) | R(23:16) | G(15:8) | B(7:0) // 변환 함수 (c_color_utils.h) bgraToRGBA(uint32_t bgra); // BGRA → RGBA rgbaToBGRA(uint32_t rgba); // RGBA → BGRA // 비트 연산 하드코딩 금지 - 반드시 변환 함수 사용
Named Color 시스템
Named Color는
[이름] 형식으로 표현됩니다 (예: [JUNCTION]). Color Table 변경 시 캐시된 Named Color를 재취득해야 합니다.| 동작 | 규칙 |
|---|---|
| Lua 저장 | "bgraInt [이름]" 전체 저장 |
| 복원 | [이름] 추출 후 GetNamedColorStr로 현재 색상 재취득 (저장값 직접 사용 금지 - stale) |
| Color Table 변경 | EVT_COLORTABLE_CHANGED 수신 시 캐시된 Named Color 재취득 + RequestRepaint() |