IFC |
프로젝트 명 | ||
Facility Safety Management System | |||
작성자 : 유승재 |
작성일 : 20110222 |
문서번호 : | |
1. Industry Foundation Classes 소개 |
BuildingSMART는 건설 정보 공유 및 교환을 위하여 AEC/FM 분야의 산업기술기반의 표준 통합을 목적으로 1994년 9월 결성된 국제적인 비영리단체로서 건설 프로젝트의 전 생명주기의 정보 공유를 위한 산업표준 즉 IFC(Industry Foundation Classes)를 제정하며 현재 전 세계적으로 한국, 미국, 일본, 독일, 영국, 프랑스, 북구 4개 국가, 싱가폴, 이탈리아, 이베리아, 중국, 등의 13개지부 35개 나라의 약 750여개 AEC/FM 관련업체가 분야별로 활동하고 있다. IFC의 목표는 다른 여러 소프트웨어 개발업체들이 개발한 소프트웨어의 상호 호환성을 극대화하여 건물의 디자인, 건설, 운영, 유지 등 전 생명 주기 동안 상호 정보 교환, 생산성, 전달 시간, 가격, 품질 등을 향상시키는데 있다. 그러기 위해서는 각 기업마다 독자적으로 개발하고 관리하던 자료 정의형식이 100% 표준 형식과 전환이 가능하여야 한다. 해외에서는 AutoCAD, Microstation, ArchiCAD 등 범세계적으로 사용되는 주요 CAD 시스템에서 이미 BuildingSMART의 IFC 표준포맷을 지원하고 있고 이에 대한 연구도 계속 활발하게 진행되고 있는 실정이다. 이에 현재 건설산업 분야의 응용프로그램들이 BuildingSMART의 IFC와 자료호환이 가능한지의 여부가 매우 중요한 요소로 작용하고 있으며, 조만간 국제적으로 시행되는 프로젝트 또는 회사간의 자료교환이 IFC를 통해 이루어 질것으로 예상된다. |
2. TNO : IFCEngine v1.03 (build 3365) |
IFC 데이터 모델은 STEP (STandard for the Exchage of Product model data)과 같은EXPRESS모델링 언어를 사용하여 개발되었으며, 수 백 가지의 엔티티들과 열거형들, 프로퍼티 셋, 함수들을 정의하는 스키마 파일이 존재한다. IFC 파일은 이 스키마 파일에 정의된 정보에 의거하여 R/W 되며 이러한 정보는 모두 EXPRESS 모델링 언어로 작성 되어있다.
IFC는 하나의 파일을 여러 종사자들이 공유하여 사용하므로 모든 정보를 이용하는 것이 아닌 자신에게 필요한 정보만을 추출해 내서 사용해야 하는데, 우리는 건물을 3D 형태로 렌더링 하기 위한 정보만을 필요로 하므로 건물의 3D 기하정보를 추출해 내면 된다. 하지만 파일을 읽어내기 위해 EXPRESS 언어를 공부하고 직접 IFC 파일 파서를 제작하는 것은 대단히 많은 비용이 들 것이다.
IFC Engine은 TNO사에서 배포한 IFC파일 R/W 엔진으로 C형태의 API 인터페이스를 제공 한다. 이 엔진을 이용하면 IFC파일 내의 원하는 엔티티 정보를 쉽게 추출 해 낼 수 있다. 아래는 해당 엔진의 API 중 몇 가지를 정리 해 본 것이다.
sdaiOpenModelBN
IFC 파일과 스키마 파일을 연다. 리턴 값으로 model ID 값이 반환되는데 앞으로 이 model ID값으로 IFC 모델에 접근하면 된다.
int sdaiOpenModelBN
(
int repository,
char* fileName,
char* schemaName
);
파라메터 설명
repository
[in] 사용되지 않는다.
fileName
[in] IFC파일의 파일명.
schemaName
[in] 스키마파일의 파일명.
sdaiCloseModel
열었던 IFC 파일을 닫는다. 이전에 파일을 따로 저장하지 않았다면 변경사항은 저장되지 않으니 주의 해야한다.
void sdaiCloseModel
(
int model
);
파라메터 설명
model
[in] 오픈 된 파일을 식별하는 고유한 ID값.
sdaiGetEntity
두번째 인자로 넘어가는 entityName값에 해당하는 요소의 고유한 요소타입ID를 반환한다. 이 값으로 요소들의 인스턴스 타입을 식별한다.
int sdaiGetEntity
(
int model,
char *entityName
);
파라메터 설명
model
[in] 오픈 된 파일을 식별하는 고유한 ID값.
entityName
[in] 문자열로 된 요소의 이름.
sdaiGetEntityExtentBN
IFC model에 속한 하나의 특정 타입은 그 유형의 모든 요소 인스턴스를 보유하고 있는데 타입이 보유하고 있는 요소 인스턴스 집합의 고유 식별 ID를 반환한다.
int * sdaiGetEntityExtentBN
(
int model,
char *entityName
);
파라메터 설명
model
[in] 오픈 된 파일을 식별하는 고유한 ID값.
entityName
[in] 문자열로 된 요소의 이름.
sdaiGetMemberCount
해당 요소 인스턴스 집합의 원소 수를 반환 한다.
int sdaiGetMemberCount
(
int *aggregate
);
파라메터 설명
aggregate
[in] 요소 인스턴스 집합의 고유 식별 ID.
engiGetAggrElement
요소 인스턴스 집합에서 파라메터 elementIndex로 넘어가는 인덱스에 위치한 요소 인스턴스를 얻어 온다.
void * engiGetAggrElement
(
int *aggregate,
int elementIndex,
int valueType,
void *pValue
);
파라메터 설명
aggregate
[in] 요소 인스턴스 집합의 고유 식별 ID.
elementIndex
[in] 요소 인스턴스 집합에서 해당 값의 인덱스에 위치한 요소 인스턴스를 얻어온다. 인덱스의 처음 시작은 0 부터이다.
valueType
[in] 얻어올 값의 타입.
pValue
[out] 이 변수에 요소 인스턴스의 고유한 식별 ID값을 얻어 온다.
sdaiGetInstanceType
요소 인스턴스의 타입을 알아낸다. 반환 값은 해당 요소의 고유한 요소타입ID 값이다.
int sdaiGetInstanceType
(
int instance
);
파라메터 설명
instance
[in] 요소 인스턴스의 고유한 식별 ID값.
sdaiGetAttrBN
요소 인스턴스로부터 특정한 속성 데이터를 반환한다.
void * sdaiGetAttrBN
(
int instance,
char *attributeName,
int valueType,
void *value
);
파라메터 설명
instance
[in] 요소 인스턴스의 고유한 식별 ID값.
attributeName
[in] 요소 인스턴스의 특정한 속성의 이름으로 문자열로 돼있다. 이 속성에 해당하는 값을 얻어 온다. 이 속성은 스키마에 정의 돼있다.
valueType
[in] 얻어올 값의 타입
value
[out] 이 변수에 특정한 속성의 데이터를 얻어 온다.
위의 함수들은 IFC Engine의 API중 극히 일부로 더 자세한 정보는 첨부한 파일을 참고하기 바란다.
아래는 위의 API들을 이용한 간단한 예제이다. 우선 엔진과 함께 배포되는 lib파일을 링크시키고 헤더파일을 프로젝트에 포함시킨다. DLL파일도 실행파일과 동일한 디렉토리에 복사해야 한다.
실행 화면은 위와 같은데 IFC 파일에 존재하는 ‘IFCBEAM’ 요소타입의 요소 인스턴스들을 찾아내 해당 인스턴스의 속성값들을 출력한 것이다.
IFCBEAM의 요소 인스턴스의 속성들, GlobalID, OwnerHistory, Name, Description등은 IFC 구조의 모든 요소타입들이 상속받는 ‘IFCROOT’ 타입에 정의된 속성들로 ‘IFCBEAM’은 물론 모든 요소타입에 존재하는 값이다. ‘IFCROOT’와 ‘IFCBEAM’의 스키마는 다음과 같다.
IfcRoot의 정의
ENTITY IfcRoot
ABSTRACT SUPERTYPE OF (ONEOF
(IfcObjectDefinition
,IfcPropertyDefinition
,IfcRelationship));
GlobalId : IfcGloballyUniqueId;
OwnerHistory : IfcOwnerHistory;
Name : OPTIONAL IfcLabel;
Description : OPTIONAL IfcText;
UNIQUE
UR1 : GlobalId;
END_ENTITY;
GlobalID, OwnerHistory, Name, Description등의 속성을 확인 해 볼 수 있다.
IFCBEAM의 정의
ENTITY IfcBeam
SUBTYPE OF (IfcBuildingElement);
END_ENTITY;
BEAM은 ‘IfcBuildingElement’의 서브타입 즉, ‘IfcBuildingElement’을 상속 한 타입이다.
IfcBuildingElement의 정의
ENTITY IfcBuildingElement
ABSTRACT SUPERTYPE OF (ONEOF
(IfcBeam
,IfcBuildingElementComponent
,IfcBuildingElementProxy
,IfcColumn
,IfcCovering
,IfcCurtainWall
,IfcDoor
,IfcFooting
,IfcMember
,IfcPile
,IfcPlate
,IfcRailing
,IfcRamp
,IfcRampFlight
,IfcRoof
,IfcSlab
,IfcStair
,IfcStairFlight
,IfcWall
,IfcWindow))
SUBTYPE OF (IfcElement);
END_ENTITY;
‘IfcBuildingElement’타입은 또다시 ‘IfcElement’타입을 상속하고 있고. 계속 따라가다 보면 결국 ‘IfcRoot’를 상속하고 있음을 알 수 있다. 구조는 다음과 같다.
|
|
이와 같이 IFC의 요소들은 개체지향적으로 설계되어 있다.
다음은 예제에 대한 설명이다. 먼저 IFC 파일과 스키마파일을 열자.
void CIFCFileReadeingDlg::OpenIFCFile(string fileName)
{
char fileStr[256+1];
strcpy( fileStr, fileName.c_str() );
this->ifcModel = sdaiOpenModelBN(0, fileStr, "IFC2X3_TC1.exp");
}
위의 메소드는 sdaiOpenModelBN 을 호출해서 IFC파일과 스키마파일을 열고 있고 해당 IFC 파일의 고유 식별값인 IFC model ID 값를 반환 받고 있다. 이 model ID값은 클래스 맴버로 저장 해 두고 있다.
void CIFCFileReadeingDlg::ReadingIFCFile(void)
{
int object, * objects, noObjects;
int entityType, entityTypeFromInstance;
//
// IFCBEAM의고유한요소타입ID를반환받는데
// 이걸로요소인스턴스들의타입을식별한다.
//
entityType = sdaiGetEntity(this->ifcModel, "IFCBEAM");
//
// 파일안의하나의특정타입은그유형의모든인스턴스를보유하고있는데
// 타입이보유한인스턴스집합의고유식별ID를반환한다.
//
objects = sdaiGetEntityExtentBN(this->ifcModel, "IFCBEAM");
//
// 해당인스턴스집합의원소수를반환한다.
//
noObjects = sdaiGetMemberCount(objects);
//
// 인스턴스집합의인스턴스들을차례로방문하여
// 인스턴스의데이터를얻어온다.
//
for ( int i = 0; i < noObjects; i++ )
{
//
// 인스턴스집합에서인덱스i번째의인스턴스를얻어온다.
//
engiGetAggrElement(objects, i, sdaiINSTANCE, &object);
//
// 얻어온인스턴스의타입을얻는다.
// 그리고그타입이내가원하는(IFCBEAM) 타입인지검사하고
// 아니면에러를발생시킨다.
//
entityTypeFromInstance = sdaiGetInstanceType(object);
ASSERT(entityType == entityTypeFromInstance);
//
// 인스턴스로부터원하는데이터를얻어낸다.
//
char* instGlobalID = 0; //인스턴스식별값
char* instOwnerHistory = 0; //오너정보
char* instName = 0; //이름
char* instDescription = 0; //설명
sdaiGetAttrBN(object, "GlobalId", sdaiSTRING, &instGlobalID);
sdaiGetAttrBN(object, "OwnerHistory", sdaiSTRING, &instOwnerHistory);
sdaiGetAttrBN(object, "Name", sdaiSTRING, &instName);
sdaiGetAttrBN(object, "Description", sdaiSTRING, &instDescription);
//
// 얻어온데이터를리스트뷰컨트롤에뿌린다.
//
ctrlListView.InsertItem ( i, ( instGlobalID == 0 ) ?
"null" : instGlobalID );
ctrlListView.SetItemText( i, 1, ( instOwnerHistory == 0 ) ?
"null" : instOwnerHistory );
ctrlListView.SetItemText( i, 2, ( instName == 0 ) ?
"null" : instName );
ctrlListView.SetItemText( i, 3, ( instDescription == 0 ) ?
"null" : instDescription );
}
}
위의 함수는 위에서 설명한 API함수들을 이용해 IFCBEAM의 요소들을 얻어내고 그 속성 값들을 리스트 뷰에 출력하도록 한다.
void CIFCFileReadeingDlg::OnClose()
{
// TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.
sdaiCloseModel( this->ifcModel );
CDialog::OnClose();
}
사용을 마쳤으면 파일을 닫아 주어야 한다.
TNO IFCEngine v1.03 (build 3365) 기술문서.doc