파라솔리드
3D 솔리드 모델링 커널은 2개의 상업용 커널이 존재한다. ACIS와 PARASOLID. ACIS 커널은 대표적으로 AutoCAD와 SolidWorks 제품이 사용하고 있고 PARASOLID는 Catia와 MicroStation이 사용하고 있다.
Parasolid는 소프트웨어 용용 프로그램에서 3D 모델의 생성, 편집, 분석 및 시각화에 필요한 핵심 기능을 제공한다.
Parasolid for App
어플리케이션에서 파리솔리드 커널을 사용하기 위해서는 PK interface를 활용 해야 한다.

- Frustrum : 메모리 관리 및 데이터 관리
- PMARK 롤백
- 트랜잭션 관리
- GO (Graphic Output) : Frustrum을 이용하여 시각화 담당
- PK_SESSION_register_frustrum
- PK_TOPOL_render_line
Parasolid의 자료 구조
파라솔리드의 엔티티는 크게 3가지 메인 그룹으로 나눌 수 있다. 모든 모델은 기하 정보와 토폴로지 정보, 2개의 정보를 갖는다.
Geometry (기하) : 기하 요소의 좌표 정보를 담고 있다. (외형적 / 물리적 정보)
Topology (위상) : 여러 가지 기하 요소간의 연결성. 즉, 물체의 각각 다른 부분간의 관계 정보를 표현한다.
Other Entities : group, attribute


BODY


Acorn Body : 면에 수직인 종 철근 (일명 점 철근)
Wire Body : 선 철근
Sheet Body : 면으로 된 Body
Solid Body : Free Edge나 Non-manifold Edge가 없고 모든 경계가 항상 솔리드 내부와 접촉하고 있는 바디. (기초, 기둥 등 주요 부재)
EDGE

Loop를 구성하는 각각의 선
- 하나의 Edge는 반드시 두개의 Face와 만난다
- Edge는 하나의 Curve를 갖는다
- 하나의 Edge는 2개의 Loop에 소속된다
LOOP

Face의 외곽을 둘러싸고 있는 경계선
- 한 개 또는 여러 개의 Loop가 하나의 Face를 정의
- 내부에 구멍이 없을 때에는 하나의 Loop로 Face를 정의 하지만 내부에 구멍이 있으면 구멍의 개수만큼 Loop가 더 필요
- 외부 Loop의 방향 : 플레밍의 오른손 법칙 (엄지 손가락이 Solid 외부를 향함)
- Face는 Loop의 진행 방향을 기준으로 왼쪽에 있다
FIN

방향성을 가진 Edge
- 한 Edge는 한 개 혹은 여러 개의 Fin을 가질 수 있다
- Fin의 집합이 Loop를 이룬다
- 기본적으로 Loop의 방향과 Fin의 방향은 일치한다. (단, 내부에 Hole이 존재하거나 Boolean 연산이 발생했을 경우는 달라질 수 있다)
Topology
여러 가지 기하 요소간의 연결성, 즉 모델의 각각 다른 부분간의 관계 정보를 표현 함.
- 모델을 구성하는 하위 개체 간의 상호 연결 관계
- 내부적 / 논리적 정보

Face F1은 Loop L1(External Loop)과 L2(Internal Loop) 2개의 루프를 갖음
Face F2는 Loop L3 1개의 루프를 갖음
Loop L1은 E1, E2, E3, E4의 Edge 정보와 방향을 갖고
Loop L3는 E6, E7, MinusE2, E5의 Edge 정보와 방향을 갖음
Loop L2의 방향은 Edge를 따라 진행했을 때 Face가 왼쪽에 존재하도록 시계 방향을 갖음
Edge의 방향
Edge의 방향성을 알기 위해서는 FIN 정보를 이용해야 한다. 보통의 경우 Fin의 방향은 Loop의 방향과 같다.

Face의 Normal이 Solid의 바깥쪽을 향하도록 Loop의 방향은 반시계 방향(CCW)이 된다. 여기서, Open Circle 타입인 Circular Edge의 Curve 방향도 (실제는 FIN의 방향) 루프의 방향과 일치한다. 따라서, 이와 같은 상황에서는 Curve의 방향과 Edge의 방향은 같다.

만약, 기존 Solid 객체를 원형 Solid 객체로 Boolean 연산을 수행했을 때는 Curve의 방향과 Edge의 방향이 서로 다르다. Loop의 방향의 CCW이 되고 원형 Solid 객체의 Loop도 CCW이기 때문에 Boolean 연산된 부분의 Edge의 Curve 방향은 노란색 Edge의 FIN의 방향과 반대가 된다.
ISO View의 Model 좌표 (실제 적용 사례)
터널의 공동구를 터널 단면과 Boolean 연산을 수행하게 되면 위의 그림 처럼 Curve의 방향과 Loop의 방향이 다르게 된다.

- 치수선의 시작점과 끝점 위치의 Edge 후보를 계산
- Edge 후보 중 사용자가 Picking한 위치와 가장 가까운 Edge 선택
- 2D Edge의 Param 값 계산( 직선: 거리, 곡선: 라디안 각)
- 골조라인 추출시 2D Edge 정보에 저장해 두었던 Body 번호와 Body의 Edge Index를 활용하여 CAD 세션에서 실제 모델 정보를 가져옴
- 실제 모델의 Edge의 FIN 방향이 Curve의 방향과 같은지 다른지 판단 (e.g 위 모델의 공동구와 터널 라이닝 부분의 Boolean 연산에 의해 Curve의 방향이 FIN 방향과 다름)
- Curve의 방향에 따라 Param이 계산되므로 Orientation에 따라 Param을 재 계산해 줌
실제 적용된 코드는 다음과 같다.
MArrayi arEdge;
if (!pCADSession->GetEdgeArrayFromBody(aBodies[nKeyIndex], arEdge))
return false;
if (arEdge.GetSize() - 1 < nIndex)
nIndex = arEdge.GetSize() - 1;
int nSelectedEdge = arEdge[nIndex];
BOOL bOrientation = TRUE;
if (pCADSession->GetEdgeOrient(nSelectedEdge, bOrientation) && !bOrientation)
{
_CAD_EDGE_TYPE eType = pCADSession->GetEdgeType(nSelectedEdge);
if (eType == CET_CIRCLE || eType == CET_ELLIPSE)
{
///##Curve의 방향과 Edge의 방향이 다를 경우 Curve의 방향으로 계산해야 됨..
EdgeInfo clone_eInfo = edgeInfo;
std::swap(clone_eInfo.dSttParam, clone_eInfo.dEndParam);
dTotalParam = clone_eInfo.dEndParam - clone_eInfo.dSttParam;
dInsertParam = clone_eInfo.dSttParam + dTotalParam * dRatio;
if (dRatio == 1.0)
dInsertParam = clone_eInfo.dEndParam;
}
}