浏览代码

Merge branch 'master' of https://github.com/assimp/assimp

Kim Kulling 10 年之前
父节点
当前提交
56e8dc5a43

+ 13 - 5
.travis.yml

@@ -15,12 +15,12 @@ env:
   matrix:
   matrix:
     - LINUX=1 TRAVIS_NO_EXPORT=YES
     - LINUX=1 TRAVIS_NO_EXPORT=YES
     - LINUX=1 TRAVIS_NO_EXPORT=NO
     - LINUX=1 TRAVIS_NO_EXPORT=NO
-    - LINUX=1 TRAVIS_STATIC_BUILD=ON
-    - LINUX=1 TRAVIS_STATIC_BUILD=OFF
+    - LINUX=1 SHARED_BUILD=ON
+    - LINUX=1 SHARED_BUILD=OFF
     - WINDOWS=1 TRAVIS_NO_EXPORT=YES
     - WINDOWS=1 TRAVIS_NO_EXPORT=YES
     - WINDOWS=1 TRAVIS_NO_EXPORT=NO
     - WINDOWS=1 TRAVIS_NO_EXPORT=NO
-    - WINDOWS=1 TRAVIS_STATIC_BUILD=ON
-    - WINDOWS=1 TRAVIS_STATIC_BUILD=OFF
+    - WINDOWS=1 SHARED_BUILD=ON
+    - WINDOWS=1 SHARED_BUILD=OFF
     - ANDROID=1
     - ANDROID=1
 
 
 language: cpp
 language: cpp
@@ -35,10 +35,18 @@ install:
 script:
 script:
   - if [ $ANDROID ]; then 
   - if [ $ANDROID ]; then 
     ant -v -Dmy.dir=${TRAVIS_BUILD_DIR} -f ${TRAVIS_BUILD_DIR}/port/jassimp/build.xml ndk-jni ; 
     ant -v -Dmy.dir=${TRAVIS_BUILD_DIR} -f ${TRAVIS_BUILD_DIR}/port/jassimp/build.xml ndk-jni ; 
+    elif [ $WINDOWS -a $CC = "gcc" ]; then
+    sudo sh -c "wget http://source.winehq.org/git/wine.git/commitdiff_plain/86781a6a524fa336f893ffd0a87373ffd306913c?hp=076edfe9d4b6cd39b6cf41b9f1d3e18688cc8673 -O - | patch -p 1 -d /usr/x86_64-w64-mingw32" ;
+    sudo sh -c "wget https://www.winehq.org/pipermail/wine-patches/2012-February/111438.html -O - | patch -p 1 -d /usr/x86_64-w64-mingw32" ;
+    cmake -G "Unix Makefiles" -DASSIMP_NO_EXPORT=$TRAVIS_NO_EXPORT -DBUILD_SHARED_LIBS=$SHARED_BUILD -DCMAKE_TOOLCHAIN_FILE=cmake-modules/MinGW_x86_64.cmake ;
+    cmake --build . ;
+    make install ;
+    elif [ $WINDOWS ]; then
+    echo "Skip compile with non-gcc setting." ;
     elif [ $RESERVED ]; then
     elif [ $RESERVED ]; then
     echo "Reserved condition" ;
     echo "Reserved condition" ;
     else
     else
-    cmake -G "Unix Makefiles" -DASSIMP_ENABLE_BOOST_WORKAROUND=YES -DASSIMP_NO_EXPORT=$TRAVIS_NO_EXPORT -STATIC_BUILD=$TRAVIS_STATIC_BUILD ;
+    cmake -G "Unix Makefiles" -DASSIMP_ENABLE_BOOST_WORKAROUND=YES -DASSIMP_NO_EXPORT=$TRAVIS_NO_EXPORT -DBUILD_SHARED_LIBS=$SHARED_BUILD ;
     make ;
     make ;
     sudo make install ;
     sudo make install ;
     sudo ldconfig ;
     sudo ldconfig ;

+ 6 - 3
CMakeLists.txt

@@ -1,6 +1,12 @@
 cmake_minimum_required( VERSION 2.8 )
 cmake_minimum_required( VERSION 2.8 )
 PROJECT( Assimp )
 PROJECT( Assimp )
 
 
+option(BUILD_SHARED_LIBS "Build package with shared libraries." ON)
+if(NOT BUILD_SHARED_LIBS)
+        #set(CMAKE_EXE_LINKER_FLAGS "-static")
+	set(LINK_SEARCH_START_STATIC TRUE)
+endif(NOT BUILD_SHARED_LIBS)
+
 # Define here the needed parameters
 # Define here the needed parameters
 set (ASSIMP_VERSION_MAJOR 3)
 set (ASSIMP_VERSION_MAJOR 3)
 set (ASSIMP_VERSION_MINOR 1)
 set (ASSIMP_VERSION_MINOR 1)
@@ -88,9 +94,6 @@ SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE PATH
 
 
 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfitx for lib, samples and tools")
 SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfitx for lib, samples and tools")
 
 
-# Allow the user to build a shared or static library
-option ( BUILD_SHARED_LIBS "Build a shared version of the library" ON )
-
 # Only generate this target if no higher-level project already has
 # Only generate this target if no higher-level project already has
 IF (NOT TARGET uninstall)
 IF (NOT TARGET uninstall)
     # add make uninstall capability
     # add make uninstall capability

+ 16 - 0
cmake-modules/MinGW_x86_64.cmake

@@ -0,0 +1,16 @@
+# this one sets internal to crosscompile (in theory)
+SET(CMAKE_SYSTEM_NAME Windows)
+
+# the minimalistic settings
+SET(CMAKE_C_COMPILER "/usr/bin/x86_64-w64-mingw32-gcc")
+SET(CMAKE_CXX_COMPILER "/usr/bin/x86_64-w64-mingw32-g++")
+SET(CMAKE_RC_COMPILER "/usr/bin/x86_64-w64-mingw32-windres")
+
+# where is the target (so called staging) environment
+SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
+
+# search for programs in the build host directories (default BOTH)
+#SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+# for libraries and headers in the target directories
+SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

+ 6 - 2
code/COBLoader.cpp

@@ -148,13 +148,17 @@ void COBImporter::InternReadFile( const std::string& pFile,
 	}
 	}
 
 
 	DefaultLogger::get()->info("File format tag: "+std::string(head+9,6));
 	DefaultLogger::get()->info("File format tag: "+std::string(head+9,6));
-	void (COBImporter::* load)(Scene&,StreamReaderLE*)= head[15]=='A'?&COBImporter::ReadAsciiFile:&COBImporter::ReadBinaryFile;
 	if (head[16]!='L') {
 	if (head[16]!='L') {
 		ThrowException("File is big-endian, which is not supported");
 		ThrowException("File is big-endian, which is not supported");
 	}
 	}
 	
 	
 	// load data into intermediate structures
 	// load data into intermediate structures
-	(this->*load)(scene,stream.get());
+	if (head[15]=='A') {
+		ReadAsciiFile(scene, stream.get());
+	}
+	else {
+		ReadBinaryFile(scene, stream.get());
+	}
 	if(scene.nodes.empty()) {
 	if(scene.nodes.empty()) {
 		ThrowException("No nodes loaded");
 		ThrowException("No nodes loaded");
 	}
 	}

+ 95 - 76
code/IFCGeometry.cpp

@@ -522,43 +522,23 @@ IfcMatrix3 DerivePlaneCoordinateSpace(const TempMesh& curmesh, bool& ok, IfcVect
 	return m;
 	return m;
 }
 }
 
 
-
-// ------------------------------------------------------------------------------------------------
-void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& result, 
-	ConversionData& conv, bool collect_openings)
+// Extrudes the given polygon along the direction, converts it into an opening or applies all openings as necessary.
+void ProcessExtrudedArea(const IfcExtrudedAreaSolid& solid, const TempMesh& curve,
+	const IfcVector3& extrusionDir, TempMesh& result, ConversionData &conv, bool collect_openings)
 {
 {
-	TempMesh meshout;
-	
-	// First read the profile description
-	if(!ProcessProfile(*solid.SweptArea,meshout,conv) || meshout.verts.size()<=1) {
-		return;
-	}
-
-	IfcVector3 dir;
-	ConvertDirection(dir,solid.ExtrudedDirection);
-
-	dir *= solid.Depth; /*
-	if(conv.collect_openings && !conv.apply_openings) {
-		dir *= 1000.0;
-	} */
-
-	// Outline: assuming that `meshout.verts` is now a list of vertex points forming 
-	// the underlying profile, extrude along the given axis, forming new
-	// triangles.
-	
-	std::vector<IfcVector3>& in = meshout.verts;
-	const size_t size=in.size();
-
-	const bool has_area = solid.SweptArea->ProfileType == "AREA" && size>2;
-	if(solid.Depth < 1e-6) {
-		if(has_area) {
-			result = meshout;
+	// Outline: 'curve' is now a list of vertex points forming the underlying profile, extrude along the given axis, 
+	// forming new triangles.
+	const bool has_area = solid.SweptArea->ProfileType == "AREA" && curve.verts.size() > 2;
+	if( solid.Depth < 1e-6 ) {
+		if( has_area ) {
+			result.Append(curve);
 		}
 		}
 		return;
 		return;
 	}
 	}
 
 
-	result.verts.reserve(size*(has_area?4:2));
-	result.vertcnt.reserve(meshout.vertcnt.size()+2);
+	result.verts.reserve(curve.verts.size()*(has_area ? 4 : 2));
+	result.vertcnt.reserve(curve.verts.size() + 2);
+	std::vector<IfcVector3> in = curve.verts;
 
 
 	// First step: transform all vertices into the target coordinate space
 	// First step: transform all vertices into the target coordinate space
 	IfcMatrix4 trafo;
 	IfcMatrix4 trafo;
@@ -566,7 +546,7 @@ void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& resul
 
 
 	IfcVector3 vmin, vmax;
 	IfcVector3 vmin, vmax;
 	MinMaxChooser<IfcVector3>()(vmin, vmax);
 	MinMaxChooser<IfcVector3>()(vmin, vmax);
-	BOOST_FOREACH(IfcVector3& v,in) {
+	BOOST_FOREACH(IfcVector3& v, in) {
 		v *= trafo;
 		v *= trafo;
 
 
 		vmin = std::min(vmin, v);
 		vmin = std::min(vmin, v);
@@ -575,93 +555,91 @@ void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& resul
 
 
 	vmax -= vmin;
 	vmax -= vmin;
 	const IfcFloat diag = vmax.Length();
 	const IfcFloat diag = vmax.Length();
-	
-	IfcVector3 min = in[0];
-	dir *= IfcMatrix3(trafo);
+	IfcVector3 dir = IfcMatrix3(trafo) * extrusionDir;
 
 
 	// reverse profile polygon if it's winded in the wrong direction in relation to the extrusion direction
 	// reverse profile polygon if it's winded in the wrong direction in relation to the extrusion direction
-	IfcVector3 profileNormal = TempMesh::ComputePolygonNormal( in.data(), in.size());
+	IfcVector3 profileNormal = TempMesh::ComputePolygonNormal(in.data(), in.size());
 	if( profileNormal * dir < 0.0 )
 	if( profileNormal * dir < 0.0 )
-		std::reverse( in.begin(), in.end());
+		std::reverse(in.begin(), in.end());
 
 
 	std::vector<IfcVector3> nors;
 	std::vector<IfcVector3> nors;
 	const bool openings = !!conv.apply_openings && conv.apply_openings->size();
 	const bool openings = !!conv.apply_openings && conv.apply_openings->size();
-	
+
 	// Compute the normal vectors for all opening polygons as a prerequisite
 	// Compute the normal vectors for all opening polygons as a prerequisite
 	// to TryAddOpenings_Poly2Tri()
 	// to TryAddOpenings_Poly2Tri()
 	// XXX this belongs into the aforementioned function
 	// XXX this belongs into the aforementioned function
-	if (openings) {
+	if( openings ) {
 
 
-		if (!conv.settings.useCustomTriangulation) {	         
+		if( !conv.settings.useCustomTriangulation ) {
 			// it is essential to apply the openings in the correct spatial order. The direction	 
 			// it is essential to apply the openings in the correct spatial order. The direction	 
 			// doesn't matter, but we would screw up if we started with e.g. a door in between	 
 			// doesn't matter, but we would screw up if we started with e.g. a door in between	 
 			// two windows.	 
 			// two windows.	 
-			std::sort(conv.apply_openings->begin(),conv.apply_openings->end(),
-				TempOpening::DistanceSorter(min));	 
+			std::sort(conv.apply_openings->begin(), conv.apply_openings->end(), TempOpening::DistanceSorter(in[0]));
 		}
 		}
-	
+
 		nors.reserve(conv.apply_openings->size());
 		nors.reserve(conv.apply_openings->size());
-		BOOST_FOREACH(TempOpening& t,*conv.apply_openings) {
+		BOOST_FOREACH(TempOpening& t, *conv.apply_openings) {
 			TempMesh& bounds = *t.profileMesh.get();
 			TempMesh& bounds = *t.profileMesh.get();
-		
-			if (bounds.verts.size() <= 2) {
+
+			if( bounds.verts.size() <= 2 ) {
 				nors.push_back(IfcVector3());
 				nors.push_back(IfcVector3());
 				continue;
 				continue;
 			}
 			}
-			nors.push_back(((bounds.verts[2]-bounds.verts[0])^(bounds.verts[1]-bounds.verts[0]) ).Normalize());
+			nors.push_back(((bounds.verts[2] - bounds.verts[0]) ^ (bounds.verts[1] - bounds.verts[0])).Normalize());
 		}
 		}
 	}
 	}
-	
+
 
 
 	TempMesh temp;
 	TempMesh temp;
 	TempMesh& curmesh = openings ? temp : result;
 	TempMesh& curmesh = openings ? temp : result;
 	std::vector<IfcVector3>& out = curmesh.verts;
 	std::vector<IfcVector3>& out = curmesh.verts;
- 
+
 	size_t sides_with_openings = 0;
 	size_t sides_with_openings = 0;
-	for(size_t i = 0; i < size; ++i) {
-		const size_t next = (i+1)%size;
+	for( size_t i = 0; i < in.size(); ++i ) {
+		const size_t next = (i + 1) % in.size();
 
 
 		curmesh.vertcnt.push_back(4);
 		curmesh.vertcnt.push_back(4);
-		
+
 		out.push_back(in[i]);
 		out.push_back(in[i]);
 		out.push_back(in[next]);
 		out.push_back(in[next]);
-		out.push_back(in[next]+dir);
-		out.push_back(in[i]+dir);
+		out.push_back(in[next] + dir);
+		out.push_back(in[i] + dir);
 
 
-		if(openings) {
-			if((in[i]-in[next]).Length() > diag * 0.1 && GenerateOpenings(*conv.apply_openings,nors,temp,true, true, dir)) {
+		if( openings ) {
+			if( (in[i] - in[next]).Length() > diag * 0.1 && GenerateOpenings(*conv.apply_openings, nors, temp, true, true, dir) ) {
 				++sides_with_openings;
 				++sides_with_openings;
 			}
 			}
-			
+
 			result.Append(temp);
 			result.Append(temp);
 			temp.Clear();
 			temp.Clear();
 		}
 		}
 	}
 	}
 
 
-	if(openings) {
+	if( openings ) {
 		BOOST_FOREACH(TempOpening& opening, *conv.apply_openings) {
 		BOOST_FOREACH(TempOpening& opening, *conv.apply_openings) {
-			if (!opening.wallPoints.empty()) {
+			if( !opening.wallPoints.empty() ) {
 				IFCImporter::LogError("failed to generate all window caps");
 				IFCImporter::LogError("failed to generate all window caps");
 			}
 			}
 			opening.wallPoints.clear();
 			opening.wallPoints.clear();
 		}
 		}
 	}
 	}
-	
+
 	size_t sides_with_v_openings = 0;
 	size_t sides_with_v_openings = 0;
-	if(has_area) {
+	if( has_area ) {
 
 
-		for(size_t n = 0; n < 2; ++n) {
+		for( size_t n = 0; n < 2; ++n ) {
 			if( n > 0 ) {
 			if( n > 0 ) {
-				for(size_t i = 0; i < size; ++i ) 
-					out.push_back(in[i]+dir);
-			} else {
-				for(size_t i = size; i--; )
+				for( size_t i = 0; i < in.size(); ++i )
+					out.push_back(in[i] + dir);
+			}
+			else {
+				for( size_t i = in.size(); i--; )
 					out.push_back(in[i]);
 					out.push_back(in[i]);
 			}
 			}
 
 
-			curmesh.vertcnt.push_back(size);
-			if(openings && size > 2) {
-				if(GenerateOpenings(*conv.apply_openings,nors,temp,true, true, dir)) {
+			curmesh.vertcnt.push_back(in.size());
+			if( openings && in.size() > 2 ) {
+				if( GenerateOpenings(*conv.apply_openings, nors, temp, true, true, dir) ) {
 					++sides_with_v_openings;
 					++sides_with_v_openings;
 				}
 				}
 
 
@@ -671,7 +649,7 @@ void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& resul
 		}
 		}
 	}
 	}
 
 
-	if(openings && ((sides_with_openings == 1 && sides_with_openings) || (sides_with_v_openings == 2 && sides_with_v_openings))) {
+	if( openings && ((sides_with_openings == 1 && sides_with_openings) || (sides_with_v_openings == 2 && sides_with_v_openings)) ) {
 		IFCImporter::LogWarn("failed to resolve all openings, presumably their topology is not supported by Assimp");
 		IFCImporter::LogWarn("failed to resolve all openings, presumably their topology is not supported by Assimp");
 	}
 	}
 
 
@@ -679,17 +657,58 @@ void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& resul
 
 
 	// If this is an opening element, store both the extruded mesh and the 2D profile mesh
 	// If this is an opening element, store both the extruded mesh and the 2D profile mesh
 	// it was created from. Return an empty mesh to the caller.
 	// it was created from. Return an empty mesh to the caller.
-	if(collect_openings && !result.IsEmpty()) {
+	if( collect_openings && !result.IsEmpty() ) {
 		ai_assert(conv.collect_openings);
 		ai_assert(conv.collect_openings);
 		boost::shared_ptr<TempMesh> profile = boost::shared_ptr<TempMesh>(new TempMesh());
 		boost::shared_ptr<TempMesh> profile = boost::shared_ptr<TempMesh>(new TempMesh());
 		profile->Swap(result);
 		profile->Swap(result);
 
 
 		boost::shared_ptr<TempMesh> profile2D = boost::shared_ptr<TempMesh>(new TempMesh());
 		boost::shared_ptr<TempMesh> profile2D = boost::shared_ptr<TempMesh>(new TempMesh());
-		profile2D->Swap(meshout);
-		conv.collect_openings->push_back(TempOpening(&solid,dir,profile, profile2D));
+		profile2D->verts.insert(profile2D->verts.end(), in.begin(), in.end());
+		profile2D->vertcnt.push_back(in.size());
+		conv.collect_openings->push_back(TempOpening(&solid, dir, profile, profile2D));
 
 
 		ai_assert(result.IsEmpty());
 		ai_assert(result.IsEmpty());
-	} 
+	}
+}
+
+// ------------------------------------------------------------------------------------------------
+void ProcessExtrudedAreaSolid(const IfcExtrudedAreaSolid& solid, TempMesh& result, 
+	ConversionData& conv, bool collect_openings)
+{
+	TempMesh meshout;
+	
+	// First read the profile description. 
+	if(!ProcessProfile(*solid.SweptArea,meshout,conv) || meshout.verts.size()<=1) {
+		return;
+	}
+
+	IfcVector3 dir;
+	ConvertDirection(dir,solid.ExtrudedDirection);
+	dir *= solid.Depth;
+
+	// Some profiles bring their own holes, for which we need to provide a container. This all is somewhat backwards, 
+	// and there's still so many corner cases uncovered - we really need a generic solution to all of this hole carving.
+	std::vector<TempOpening> fisherPriceMyFirstOpenings;
+	std::vector<TempOpening>* oldApplyOpenings = conv.apply_openings;
+	if( const IfcArbitraryProfileDefWithVoids* const cprofile = solid.SweptArea->ToPtr<IfcArbitraryProfileDefWithVoids>() ) {
+		if( !cprofile->InnerCurves.empty() ) {
+			// read all inner curves and extrude them to form proper openings. 
+			std::vector<TempOpening>* oldCollectOpenings = conv.collect_openings;
+			conv.collect_openings = &fisherPriceMyFirstOpenings;
+
+			BOOST_FOREACH(const IfcCurve* curve, cprofile->InnerCurves) {
+				TempMesh curveMesh, tempMesh;
+				ProcessCurve(*curve, curveMesh, conv);
+				ProcessExtrudedArea(solid, curveMesh, dir, tempMesh, conv, true);
+			}
+			// and then apply those to the geometry we're about to generate
+			conv.apply_openings = conv.collect_openings;
+			conv.collect_openings = oldCollectOpenings;
+		}
+	}
+
+	ProcessExtrudedArea(solid, meshout, dir, result, conv, collect_openings);
+	conv.apply_openings = oldApplyOpenings;
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
@@ -784,7 +803,7 @@ bool ProcessGeometricItem(const IfcRepresentationItem& geo, unsigned int matid,
 	meshtmp->RemoveDegenerates();
 	meshtmp->RemoveDegenerates();
 
 
 	if(fix_orientation) {
 	if(fix_orientation) {
-		meshtmp->FixupFaceOrientation();
+//		meshtmp->FixupFaceOrientation();
 	}
 	}
 
 
 	aiMesh* const mesh = meshtmp->ToMesh();
 	aiMesh* const mesh = meshtmp->ToMesh();

文件差异内容过多而无法显示
+ 1091 - 1464
code/IFCReaderGen.cpp


文件差异内容过多而无法显示
+ 1278 - 1270
code/IFCReaderGen.h


+ 1 - 0
code/IFCUtil.h

@@ -271,6 +271,7 @@ IfcFloat ConvertSIPrefix(const std::string& prefix);
 
 
 // IFCProfile.cpp
 // IFCProfile.cpp
 bool ProcessProfile(const IfcProfileDef& prof, TempMesh& meshout, ConversionData& conv);
 bool ProcessProfile(const IfcProfileDef& prof, TempMesh& meshout, ConversionData& conv);
+bool ProcessCurve(const IfcCurve& curve,  TempMesh& meshout, ConversionData& conv);
 
 
 // IFCMaterial.cpp
 // IFCMaterial.cpp
 unsigned int ProcessMaterials(uint64_t id, unsigned int prevMatId, ConversionData& conv, bool forceDefaultMat);
 unsigned int ProcessMaterials(uint64_t id, unsigned int prevMatId, ConversionData& conv, bool forceDefaultMat);

+ 3 - 1
code/SceneCombiner.cpp

@@ -1023,7 +1023,9 @@ void SceneCombiner::CopyScene(aiScene** _dest,const aiScene* src,bool allocate)
 	dest->mFlags = src->mFlags;
 	dest->mFlags = src->mFlags;
 
 
 	// source private data might be NULL if the scene is user-allocated (i.e. for use with the export API)
 	// source private data might be NULL if the scene is user-allocated (i.e. for use with the export API)
-	ScenePriv(dest)->mPPStepsApplied = ScenePriv(src) ? ScenePriv(src)->mPPStepsApplied : 0;
+	if (dest->mPrivate != NULL) {
+		ScenePriv(dest)->mPPStepsApplied = ScenePriv(src) ? ScenePriv(src)->mPPStepsApplied : 0;
+	}
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------

+ 3 - 2
scripts/IFCImporter/ExpressReader.py

@@ -44,6 +44,7 @@
 entities and data types contained"""
 entities and data types contained"""
 
 
 import sys, os, re
 import sys, os, re
+from collections import OrderedDict
 
 
 re_match_entity = re.compile(r"""
 re_match_entity = re.compile(r"""
 ENTITY\s+(\w+)\s*                                    # 'ENTITY foo'
 ENTITY\s+(\w+)\s*                                    # 'ENTITY foo'
@@ -68,8 +69,8 @@ re_match_field = re.compile(r"""
 
 
 class Schema:
 class Schema:
     def __init__(self):
     def __init__(self):
-        self.entities = {}
-        self.types = {}
+        self.entities = OrderedDict()
+        self.types = OrderedDict()
 
 
 class Entity:
 class Entity:
     def __init__(self,name,parent,members):
     def __init__(self,name,parent,members):

+ 5 - 4
scripts/IFCImporter/entitylist.txt

@@ -1,16 +1,17 @@
-# ============================================================================== 
+# ==============================================================================
 # List of IFC structures needed by Assimp
 # List of IFC structures needed by Assimp
-# ============================================================================== 
+# ==============================================================================
 # use genentitylist.sh to update this list
 # use genentitylist.sh to update this list
 
 
-# This machine-generated list is not complete, it lacks many intermediate 
+# This machine-generated list is not complete, it lacks many intermediate
 # classes in the inheritance hierarchy. Those are magically augmented by the
 # classes in the inheritance hierarchy. Those are magically augmented by the
-# code generator. Also, the names of all used entities need to be present 
+# code generator. Also, the names of all used entities need to be present
 # in the source code for this to work.
 # in the source code for this to work.
 
 
 IfcAnnotation
 IfcAnnotation
 IfcArbitraryClosedProfileDef
 IfcArbitraryClosedProfileDef
 IfcArbitraryOpenProfileDef
 IfcArbitraryOpenProfileDef
+IfcArbitraryProfileDefWithVoids
 IfcAxis1Placement
 IfcAxis1Placement
 IfcAxis2Placement
 IfcAxis2Placement
 IfcAxis2Placement2D
 IfcAxis2Placement2D

+ 9571 - 0
scripts/IFCImporter/schema.exp

@@ -0,0 +1,9571 @@
+(*
+Copyright by:
+International Alliance for Interoperability, 1996-2005
+
+All rights reserved. No part of this documentation may be
+reproduced, stored in a retrieval system, or transmitted
+in any form or by any means, without the prior written
+permission of the owner.
+
+Contents:
+full IFC object model EXPRESS definitions for the IFC2x Edition 3 final version
+
+
+- express longform distribution
+- compiled for EXPRESS version 1 technical corrigendum 2
+
+Issue date:
+December 15, 2005
+
+Development Team:
+Modeling Support Group of the 
+International Alliance for Interoperability
+compiled by Thomas Liebich [email protected]
+*)
+SCHEMA IFC2X3;
+
+TYPE IfcAbsorbedDoseMeasure = REAL;
+END_TYPE;
+
+TYPE IfcAccelerationMeasure = REAL;
+END_TYPE;
+
+TYPE IfcAmountOfSubstanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcAngularVelocityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcAreaMeasure = REAL;
+END_TYPE;
+
+TYPE IfcBoolean = BOOLEAN;
+END_TYPE;
+
+TYPE IfcBoxAlignment = IfcLabel;
+ WHERE
+	WR1 : SELF IN ['top-left', 'top-middle', 'top-right', 'middle-left', 'center', 'middle-right', 'bottom-left', 'bottom-middle', 'bottom-right'];
+END_TYPE;
+
+TYPE IfcComplexNumber = ARRAY [1:2] OF REAL;
+END_TYPE;
+
+TYPE IfcCompoundPlaneAngleMeasure = LIST [3:3] OF INTEGER;
+ WHERE
+	WR1 : { -360 <= SELF[1] < 360 };
+	WR2 : { -60 <= SELF[2] < 60 };
+	WR3 : { -60 <= SELF[3] < 60 };
+	WR4 : ((SELF[1] >= 0) AND (SELF[2] >= 0) AND (SELF[3] >= 0)) OR ((SELF[1] <= 0) AND (SELF[2] <= 0) AND (SELF[3] <= 0));
+END_TYPE;
+
+TYPE IfcContextDependentMeasure = REAL;
+END_TYPE;
+
+TYPE IfcCountMeasure = NUMBER;
+END_TYPE;
+
+TYPE IfcCurvatureMeasure = REAL;
+END_TYPE;
+
+TYPE IfcDayInMonthNumber = INTEGER;
+END_TYPE;
+
+TYPE IfcDaylightSavingHour = INTEGER;
+ WHERE
+	WR1 : { 0 <= SELF <= 2 };
+END_TYPE;
+
+TYPE IfcDescriptiveMeasure = STRING;
+END_TYPE;
+
+TYPE IfcDimensionCount = INTEGER;
+ WHERE
+	WR1 : { 0 < SELF <= 3 };
+END_TYPE;
+
+TYPE IfcDoseEquivalentMeasure = REAL;
+END_TYPE;
+
+TYPE IfcDynamicViscosityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricCapacitanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricChargeMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricConductanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricCurrentMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricResistanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcElectricVoltageMeasure = REAL;
+END_TYPE;
+
+TYPE IfcEnergyMeasure = REAL;
+END_TYPE;
+
+TYPE IfcFontStyle = STRING;
+ WHERE
+	WR1 : SELF IN ['normal','italic','oblique'];
+END_TYPE;
+
+TYPE IfcFontVariant = STRING;
+ WHERE
+	WR1 : SELF IN ['normal','small-caps'];
+END_TYPE;
+
+TYPE IfcFontWeight = STRING;
+ WHERE
+	WR1 : SELF IN ['normal','small-caps','100','200','300','400','500','600','700','800','900'];
+END_TYPE;
+
+TYPE IfcForceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcFrequencyMeasure = REAL;
+END_TYPE;
+
+TYPE IfcGloballyUniqueId = STRING(22) FIXED;
+END_TYPE;
+
+TYPE IfcHeatFluxDensityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcHeatingValueMeasure = REAL;
+ WHERE
+	WR1 : SELF > 0.;
+END_TYPE;
+
+TYPE IfcHourInDay = INTEGER;
+ WHERE
+	WR1 : { 0 <= SELF < 24 };
+END_TYPE;
+
+TYPE IfcIdentifier = STRING;
+END_TYPE;
+
+TYPE IfcIlluminanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcInductanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcInteger = INTEGER;
+END_TYPE;
+
+TYPE IfcIntegerCountRateMeasure = INTEGER;
+END_TYPE;
+
+TYPE IfcIonConcentrationMeasure = REAL;
+END_TYPE;
+
+TYPE IfcIsothermalMoistureCapacityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcKinematicViscosityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLabel = STRING;
+END_TYPE;
+
+TYPE IfcLengthMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLinearForceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLinearMomentMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLinearStiffnessMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLinearVelocityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLogical = LOGICAL;
+END_TYPE;
+
+TYPE IfcLuminousFluxMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLuminousIntensityDistributionMeasure = REAL;
+END_TYPE;
+
+TYPE IfcLuminousIntensityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMagneticFluxDensityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMagneticFluxMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMassDensityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMassFlowRateMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMassMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMassPerLengthMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMinuteInHour = INTEGER;
+ WHERE
+	WR1 : {0 <= SELF <= 59 };
+END_TYPE;
+
+TYPE IfcModulusOfElasticityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcModulusOfLinearSubgradeReactionMeasure = REAL;
+END_TYPE;
+
+TYPE IfcModulusOfRotationalSubgradeReactionMeasure = REAL;
+END_TYPE;
+
+TYPE IfcModulusOfSubgradeReactionMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMoistureDiffusivityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMolecularWeightMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMomentOfInertiaMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMonetaryMeasure = REAL;
+END_TYPE;
+
+TYPE IfcMonthInYearNumber = INTEGER;
+ WHERE
+	WR1 : { 1<= SELF <= 12 };
+END_TYPE;
+
+TYPE IfcNormalisedRatioMeasure = IfcRatioMeasure;
+ WHERE
+	WR1 : {0.0 <= SELF <= 1.0};
+END_TYPE;
+
+TYPE IfcNumericMeasure = NUMBER;
+END_TYPE;
+
+TYPE IfcPHMeasure = REAL;
+ WHERE
+	WR21 : {0.0 <= SELF <= 14.0};
+END_TYPE;
+
+TYPE IfcParameterValue = REAL;
+END_TYPE;
+
+TYPE IfcPlanarForceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcPlaneAngleMeasure = REAL;
+END_TYPE;
+
+TYPE IfcPositiveLengthMeasure = IfcLengthMeasure;
+ WHERE
+	WR1 : SELF > 0.;
+END_TYPE;
+
+TYPE IfcPositivePlaneAngleMeasure = IfcPlaneAngleMeasure;
+ WHERE
+	WR1 : SELF > 0.;
+END_TYPE;
+
+TYPE IfcPositiveRatioMeasure = IfcRatioMeasure;
+ WHERE
+	WR1 : SELF > 0.;
+END_TYPE;
+
+TYPE IfcPowerMeasure = REAL;
+END_TYPE;
+
+TYPE IfcPresentableText = STRING;
+END_TYPE;
+
+TYPE IfcPressureMeasure = REAL;
+END_TYPE;
+
+TYPE IfcRadioActivityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcRatioMeasure = REAL;
+END_TYPE;
+
+TYPE IfcReal = REAL;
+END_TYPE;
+
+TYPE IfcRotationalFrequencyMeasure = REAL;
+END_TYPE;
+
+TYPE IfcRotationalMassMeasure = REAL;
+END_TYPE;
+
+TYPE IfcRotationalStiffnessMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSecondInMinute = REAL;
+ WHERE
+	WR1 : { 0. <= SELF < 60. };
+END_TYPE;
+
+TYPE IfcSectionModulusMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSectionalAreaIntegralMeasure = REAL;
+END_TYPE;
+
+TYPE IfcShearModulusMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSolidAngleMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSoundPowerMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSoundPressureMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSpecificHeatCapacityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcSpecularExponent = REAL;
+END_TYPE;
+
+TYPE IfcSpecularRoughness = REAL;
+ WHERE
+	WR1 : {0.0 <= SELF <= 1.0};
+END_TYPE;
+
+TYPE IfcTemperatureGradientMeasure = REAL;
+END_TYPE;
+
+TYPE IfcText = STRING;
+END_TYPE;
+
+TYPE IfcTextAlignment = STRING;
+ WHERE
+	WR1 : SELF IN ['left', 'right', 'center', 'justify'];
+END_TYPE;
+
+TYPE IfcTextDecoration = STRING;
+ WHERE
+	WR1 : SELF IN ['none', 'underline', 'overline', 'line-through', 'blink'];
+END_TYPE;
+
+TYPE IfcTextFontName = STRING;
+END_TYPE;
+
+TYPE IfcTextTransformation = STRING;
+ WHERE
+	WR1 : SELF IN ['capitalize', 'uppercase', 'lowercase', 'none'];
+END_TYPE;
+
+TYPE IfcThermalAdmittanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcThermalConductivityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcThermalExpansionCoefficientMeasure = REAL;
+END_TYPE;
+
+TYPE IfcThermalResistanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcThermalTransmittanceMeasure = REAL;
+END_TYPE;
+
+TYPE IfcThermodynamicTemperatureMeasure = REAL;
+END_TYPE;
+
+TYPE IfcTimeMeasure = REAL;
+END_TYPE;
+
+TYPE IfcTimeStamp = INTEGER;
+END_TYPE;
+
+TYPE IfcTorqueMeasure = REAL;
+END_TYPE;
+
+TYPE IfcVaporPermeabilityMeasure = REAL;
+END_TYPE;
+
+TYPE IfcVolumeMeasure = REAL;
+END_TYPE;
+
+TYPE IfcVolumetricFlowRateMeasure = REAL;
+END_TYPE;
+
+TYPE IfcWarpingConstantMeasure = REAL;
+END_TYPE;
+
+TYPE IfcWarpingMomentMeasure = REAL;
+END_TYPE;
+
+TYPE IfcYearNumber = INTEGER;
+END_TYPE;
+
+TYPE IfcActionSourceTypeEnum = ENUMERATION OF
+	(DEAD_LOAD_G
+	,COMPLETION_G1
+	,LIVE_LOAD_Q
+	,SNOW_S
+	,WIND_W
+	,PRESTRESSING_P
+	,SETTLEMENT_U
+	,TEMPERATURE_T
+	,EARTHQUAKE_E
+	,FIRE
+	,IMPULSE
+	,IMPACT
+	,TRANSPORT
+	,ERECTION
+	,PROPPING
+	,SYSTEM_IMPERFECTION
+	,SHRINKAGE
+	,CREEP
+	,LACK_OF_FIT
+	,BUOYANCY
+	,ICE
+	,CURRENT
+	,WAVE
+	,RAIN
+	,BRAKES
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcActionTypeEnum = ENUMERATION OF
+	(PERMANENT_G
+	,VARIABLE_Q
+	,EXTRAORDINARY_A
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcActuatorTypeEnum = ENUMERATION OF
+	(ELECTRICACTUATOR
+	,HANDOPERATEDACTUATOR
+	,HYDRAULICACTUATOR
+	,PNEUMATICACTUATOR
+	,THERMOSTATICACTUATOR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAddressTypeEnum = ENUMERATION OF
+	(OFFICE
+	,SITE
+	,HOME
+	,DISTRIBUTIONPOINT
+	,USERDEFINED);
+END_TYPE;
+
+TYPE IfcAheadOrBehind = ENUMERATION OF
+	(AHEAD
+	,BEHIND);
+END_TYPE;
+
+TYPE IfcAirTerminalBoxTypeEnum = ENUMERATION OF
+	(CONSTANTFLOW
+	,VARIABLEFLOWPRESSUREDEPENDANT
+	,VARIABLEFLOWPRESSUREINDEPENDANT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAirTerminalTypeEnum = ENUMERATION OF
+	(GRILLE
+	,REGISTER
+	,DIFFUSER
+	,EYEBALL
+	,IRIS
+	,LINEARGRILLE
+	,LINEARDIFFUSER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAirToAirHeatRecoveryTypeEnum = ENUMERATION OF
+	(FIXEDPLATECOUNTERFLOWEXCHANGER
+	,FIXEDPLATECROSSFLOWEXCHANGER
+	,FIXEDPLATEPARALLELFLOWEXCHANGER
+	,ROTARYWHEEL
+	,RUNAROUNDCOILLOOP
+	,HEATPIPE
+	,TWINTOWERENTHALPYRECOVERYLOOPS
+	,THERMOSIPHONSEALEDTUBEHEATEXCHANGERS
+	,THERMOSIPHONCOILTYPEHEATEXCHANGERS
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAlarmTypeEnum = ENUMERATION OF
+	(BELL
+	,BREAKGLASSBUTTON
+	,LIGHT
+	,MANUALPULLBOX
+	,SIREN
+	,WHISTLE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAnalysisModelTypeEnum = ENUMERATION OF
+	(IN_PLANE_LOADING_2D
+	,OUT_PLANE_LOADING_2D
+	,LOADING_3D
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcAnalysisTheoryTypeEnum = ENUMERATION OF
+	(FIRST_ORDER_THEORY
+	,SECOND_ORDER_THEORY
+	,THIRD_ORDER_THEORY
+	,FULL_NONLINEAR_THEORY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcArithmeticOperatorEnum = ENUMERATION OF
+	(ADD
+	,DIVIDE
+	,MULTIPLY
+	,SUBTRACT);
+END_TYPE;
+
+TYPE IfcAssemblyPlaceEnum = ENUMERATION OF
+	(SITE
+	,FACTORY
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcBSplineCurveForm = ENUMERATION OF
+	(POLYLINE_FORM
+	,CIRCULAR_ARC
+	,ELLIPTIC_ARC
+	,PARABOLIC_ARC
+	,HYPERBOLIC_ARC
+	,UNSPECIFIED);
+END_TYPE;
+
+TYPE IfcBeamTypeEnum = ENUMERATION OF
+	(BEAM
+	,JOIST
+	,LINTEL
+	,T_BEAM
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcBenchmarkEnum = ENUMERATION OF
+	(GREATERTHAN
+	,GREATERTHANOREQUALTO
+	,LESSTHAN
+	,LESSTHANOREQUALTO
+	,EQUALTO
+	,NOTEQUALTO);
+END_TYPE;
+
+TYPE IfcBoilerTypeEnum = ENUMERATION OF
+	(WATER
+	,STEAM
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcBooleanOperator = ENUMERATION OF
+	(UNION
+	,INTERSECTION
+	,DIFFERENCE);
+END_TYPE;
+
+TYPE IfcBuildingElementProxyTypeEnum = ENUMERATION OF
+	(USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCableCarrierFittingTypeEnum = ENUMERATION OF
+	(BEND
+	,CROSS
+	,REDUCER
+	,TEE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCableCarrierSegmentTypeEnum = ENUMERATION OF
+	(CABLELADDERSEGMENT
+	,CABLETRAYSEGMENT
+	,CABLETRUNKINGSEGMENT
+	,CONDUITSEGMENT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCableSegmentTypeEnum = ENUMERATION OF
+	(CABLESEGMENT
+	,CONDUCTORSEGMENT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcChangeActionEnum = ENUMERATION OF
+	(NOCHANGE
+	,MODIFIED
+	,ADDED
+	,DELETED
+	,MODIFIEDADDED
+	,MODIFIEDDELETED);
+END_TYPE;
+
+TYPE IfcChillerTypeEnum = ENUMERATION OF
+	(AIRCOOLED
+	,WATERCOOLED
+	,HEATRECOVERY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCoilTypeEnum = ENUMERATION OF
+	(DXCOOLINGCOIL
+	,WATERCOOLINGCOIL
+	,STEAMHEATINGCOIL
+	,WATERHEATINGCOIL
+	,ELECTRICHEATINGCOIL
+	,GASHEATINGCOIL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcColumnTypeEnum = ENUMERATION OF
+	(COLUMN
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCompressorTypeEnum = ENUMERATION OF
+	(DYNAMIC
+	,RECIPROCATING
+	,ROTARY
+	,SCROLL
+	,TROCHOIDAL
+	,SINGLESTAGE
+	,BOOSTER
+	,OPENTYPE
+	,HERMETIC
+	,SEMIHERMETIC
+	,WELDEDSHELLHERMETIC
+	,ROLLINGPISTON
+	,ROTARYVANE
+	,SINGLESCREW
+	,TWINSCREW
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCondenserTypeEnum = ENUMERATION OF
+	(WATERCOOLEDSHELLTUBE
+	,WATERCOOLEDSHELLCOIL
+	,WATERCOOLEDTUBEINTUBE
+	,WATERCOOLEDBRAZEDPLATE
+	,AIRCOOLED
+	,EVAPORATIVECOOLED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcConnectionTypeEnum = ENUMERATION OF
+	(ATPATH
+	,ATSTART
+	,ATEND
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcConstraintEnum = ENUMERATION OF
+	(HARD
+	,SOFT
+	,ADVISORY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcControllerTypeEnum = ENUMERATION OF
+	(FLOATING
+	,PROPORTIONAL
+	,PROPORTIONALINTEGRAL
+	,PROPORTIONALINTEGRALDERIVATIVE
+	,TIMEDTWOPOSITION
+	,TWOPOSITION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCooledBeamTypeEnum = ENUMERATION OF
+	(ACTIVE
+	,PASSIVE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCoolingTowerTypeEnum = ENUMERATION OF
+	(NATURALDRAFT
+	,MECHANICALINDUCEDDRAFT
+	,MECHANICALFORCEDDRAFT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCostScheduleTypeEnum = ENUMERATION OF
+	(BUDGET
+	,COSTPLAN
+	,ESTIMATE
+	,TENDER
+	,PRICEDBILLOFQUANTITIES
+	,UNPRICEDBILLOFQUANTITIES
+	,SCHEDULEOFRATES
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCoveringTypeEnum = ENUMERATION OF
+	(CEILING
+	,FLOORING
+	,CLADDING
+	,ROOFING
+	,INSULATION
+	,MEMBRANE
+	,SLEEVING
+	,WRAPPING
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcCurrencyEnum = ENUMERATION OF
+	(AED
+	,AES
+	,ATS
+	,AUD
+	,BBD
+	,BEG
+	,BGL
+	,BHD
+	,BMD
+	,BND
+	,BRL
+	,BSD
+	,BWP
+	,BZD
+	,CAD
+	,CBD
+	,CHF
+	,CLP
+	,CNY
+	,CYS
+	,CZK
+	,DDP
+	,DEM
+	,DKK
+	,EGL
+	,EST
+	,EUR
+	,FAK
+	,FIM
+	,FJD
+	,FKP
+	,FRF
+	,GBP
+	,GIP
+	,GMD
+	,GRX
+	,HKD
+	,HUF
+	,ICK
+	,IDR
+	,ILS
+	,INR
+	,IRP
+	,ITL
+	,JMD
+	,JOD
+	,JPY
+	,KES
+	,KRW
+	,KWD
+	,KYD
+	,LKR
+	,LUF
+	,MTL
+	,MUR
+	,MXN
+	,MYR
+	,NLG
+	,NZD
+	,OMR
+	,PGK
+	,PHP
+	,PKR
+	,PLN
+	,PTN
+	,QAR
+	,RUR
+	,SAR
+	,SCR
+	,SEK
+	,SGD
+	,SKP
+	,THB
+	,TRL
+	,TTD
+	,TWD
+	,USD
+	,VEB
+	,VND
+	,XEU
+	,ZAR
+	,ZWD
+	,NOK);
+END_TYPE;
+
+TYPE IfcCurtainWallTypeEnum = ENUMERATION OF
+	(USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDamperTypeEnum = ENUMERATION OF
+	(CONTROLDAMPER
+	,FIREDAMPER
+	,SMOKEDAMPER
+	,FIRESMOKEDAMPER
+	,BACKDRAFTDAMPER
+	,RELIEFDAMPER
+	,BLASTDAMPER
+	,GRAVITYDAMPER
+	,GRAVITYRELIEFDAMPER
+	,BALANCINGDAMPER
+	,FUMEHOODEXHAUST
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDataOriginEnum = ENUMERATION OF
+	(MEASURED
+	,PREDICTED
+	,SIMULATED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDerivedUnitEnum = ENUMERATION OF
+	(ANGULARVELOCITYUNIT
+	,COMPOUNDPLANEANGLEUNIT
+	,DYNAMICVISCOSITYUNIT
+	,HEATFLUXDENSITYUNIT
+	,INTEGERCOUNTRATEUNIT
+	,ISOTHERMALMOISTURECAPACITYUNIT
+	,KINEMATICVISCOSITYUNIT
+	,LINEARVELOCITYUNIT
+	,MASSDENSITYUNIT
+	,MASSFLOWRATEUNIT
+	,MOISTUREDIFFUSIVITYUNIT
+	,MOLECULARWEIGHTUNIT
+	,SPECIFICHEATCAPACITYUNIT
+	,THERMALADMITTANCEUNIT
+	,THERMALCONDUCTANCEUNIT
+	,THERMALRESISTANCEUNIT
+	,THERMALTRANSMITTANCEUNIT
+	,VAPORPERMEABILITYUNIT
+	,VOLUMETRICFLOWRATEUNIT
+	,ROTATIONALFREQUENCYUNIT
+	,TORQUEUNIT
+	,MOMENTOFINERTIAUNIT
+	,LINEARMOMENTUNIT
+	,LINEARFORCEUNIT
+	,PLANARFORCEUNIT
+	,MODULUSOFELASTICITYUNIT
+	,SHEARMODULUSUNIT
+	,LINEARSTIFFNESSUNIT
+	,ROTATIONALSTIFFNESSUNIT
+	,MODULUSOFSUBGRADEREACTIONUNIT
+	,ACCELERATIONUNIT
+	,CURVATUREUNIT
+	,HEATINGVALUEUNIT
+	,IONCONCENTRATIONUNIT
+	,LUMINOUSINTENSITYDISTRIBUTIONUNIT
+	,MASSPERLENGTHUNIT
+	,MODULUSOFLINEARSUBGRADEREACTIONUNIT
+	,MODULUSOFROTATIONALSUBGRADEREACTIONUNIT
+	,PHUNIT
+	,ROTATIONALMASSUNIT
+	,SECTIONAREAINTEGRALUNIT
+	,SECTIONMODULUSUNIT
+	,SOUNDPOWERUNIT
+	,SOUNDPRESSUREUNIT
+	,TEMPERATUREGRADIENTUNIT
+	,THERMALEXPANSIONCOEFFICIENTUNIT
+	,WARPINGCONSTANTUNIT
+	,WARPINGMOMENTUNIT
+	,USERDEFINED);
+END_TYPE;
+
+TYPE IfcDimensionExtentUsage = ENUMERATION OF
+	(ORIGIN
+	,TARGET);
+END_TYPE;
+
+TYPE IfcDirectionSenseEnum = ENUMERATION OF
+	(POSITIVE
+	,NEGATIVE);
+END_TYPE;
+
+TYPE IfcDistributionChamberElementTypeEnum = ENUMERATION OF
+	(FORMEDDUCT
+	,INSPECTIONCHAMBER
+	,INSPECTIONPIT
+	,MANHOLE
+	,METERCHAMBER
+	,SUMP
+	,TRENCH
+	,VALVECHAMBER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDocumentConfidentialityEnum = ENUMERATION OF
+	(PUBLIC
+	,RESTRICTED
+	,CONFIDENTIAL
+	,PERSONAL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDocumentStatusEnum = ENUMERATION OF
+	(DRAFT
+	,FINALDRAFT
+	,FINAL
+	,REVISION
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDoorPanelOperationEnum = ENUMERATION OF
+	(SWINGING
+	,DOUBLE_ACTING
+	,SLIDING
+	,FOLDING
+	,REVOLVING
+	,ROLLINGUP
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDoorPanelPositionEnum = ENUMERATION OF
+	(LEFT
+	,MIDDLE
+	,RIGHT
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDoorStyleConstructionEnum = ENUMERATION OF
+	(ALUMINIUM
+	,HIGH_GRADE_STEEL
+	,STEEL
+	,WOOD
+	,ALUMINIUM_WOOD
+	,ALUMINIUM_PLASTIC
+	,PLASTIC
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDoorStyleOperationEnum = ENUMERATION OF
+	(SINGLE_SWING_LEFT
+	,SINGLE_SWING_RIGHT
+	,DOUBLE_DOOR_SINGLE_SWING
+	,DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT
+	,DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT
+	,DOUBLE_SWING_LEFT
+	,DOUBLE_SWING_RIGHT
+	,DOUBLE_DOOR_DOUBLE_SWING
+	,SLIDING_TO_LEFT
+	,SLIDING_TO_RIGHT
+	,DOUBLE_DOOR_SLIDING
+	,FOLDING_TO_LEFT
+	,FOLDING_TO_RIGHT
+	,DOUBLE_DOOR_FOLDING
+	,REVOLVING
+	,ROLLINGUP
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDuctFittingTypeEnum = ENUMERATION OF
+	(BEND
+	,CONNECTOR
+	,ENTRY
+	,EXIT
+	,JUNCTION
+	,OBSTRUCTION
+	,TRANSITION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDuctSegmentTypeEnum = ENUMERATION OF
+	(RIGIDSEGMENT
+	,FLEXIBLESEGMENT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcDuctSilencerTypeEnum = ENUMERATION OF
+	(FLATOVAL
+	,RECTANGULAR
+	,ROUND
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricApplianceTypeEnum = ENUMERATION OF
+	(COMPUTER
+	,DIRECTWATERHEATER
+	,DISHWASHER
+	,ELECTRICCOOKER
+	,ELECTRICHEATER
+	,FACSIMILE
+	,FREESTANDINGFAN
+	,FREEZER
+	,FRIDGE_FREEZER
+	,HANDDRYER
+	,INDIRECTWATERHEATER
+	,MICROWAVE
+	,PHOTOCOPIER
+	,PRINTER
+	,REFRIGERATOR
+	,RADIANTHEATER
+	,SCANNER
+	,TELEPHONE
+	,TUMBLEDRYER
+	,TV
+	,VENDINGMACHINE
+	,WASHINGMACHINE
+	,WATERHEATER
+	,WATERCOOLER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricCurrentEnum = ENUMERATION OF
+	(ALTERNATING
+	,DIRECT
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricDistributionPointFunctionEnum = ENUMERATION OF
+	(ALARMPANEL
+	,CONSUMERUNIT
+	,CONTROLPANEL
+	,DISTRIBUTIONBOARD
+	,GASDETECTORPANEL
+	,INDICATORPANEL
+	,MIMICPANEL
+	,MOTORCONTROLCENTRE
+	,SWITCHBOARD
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricFlowStorageDeviceTypeEnum = ENUMERATION OF
+	(BATTERY
+	,CAPACITORBANK
+	,HARMONICFILTER
+	,INDUCTORBANK
+	,UPS
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricGeneratorTypeEnum = ENUMERATION OF
+	(USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricHeaterTypeEnum = ENUMERATION OF
+	(ELECTRICPOINTHEATER
+	,ELECTRICCABLEHEATER
+	,ELECTRICMATHEATER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricMotorTypeEnum = ENUMERATION OF
+	(DC
+	,INDUCTION
+	,POLYPHASE
+	,RELUCTANCESYNCHRONOUS
+	,SYNCHRONOUS
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElectricTimeControlTypeEnum = ENUMERATION OF
+	(TIMECLOCK
+	,TIMEDELAY
+	,RELAY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElementAssemblyTypeEnum = ENUMERATION OF
+	(ACCESSORY_ASSEMBLY
+	,ARCH
+	,BEAM_GRID
+	,BRACED_FRAME
+	,GIRDER
+	,REINFORCEMENT_UNIT
+	,RIGID_FRAME
+	,SLAB_FIELD
+	,TRUSS
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcElementCompositionEnum = ENUMERATION OF
+	(COMPLEX
+	,ELEMENT
+	,PARTIAL);
+END_TYPE;
+
+TYPE IfcEnergySequenceEnum = ENUMERATION OF
+	(PRIMARY
+	,SECONDARY
+	,TERTIARY
+	,AUXILIARY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcEnvironmentalImpactCategoryEnum = ENUMERATION OF
+	(COMBINEDVALUE
+	,DISPOSAL
+	,EXTRACTION
+	,INSTALLATION
+	,MANUFACTURE
+	,TRANSPORTATION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcEvaporativeCoolerTypeEnum = ENUMERATION OF
+	(DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER
+	,DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER
+	,DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER
+	,DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER
+	,DIRECTEVAPORATIVEAIRWASHER
+	,INDIRECTEVAPORATIVEPACKAGEAIRCOOLER
+	,INDIRECTEVAPORATIVEWETCOIL
+	,INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER
+	,INDIRECTDIRECTCOMBINATION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcEvaporatorTypeEnum = ENUMERATION OF
+	(DIRECTEXPANSIONSHELLANDTUBE
+	,DIRECTEXPANSIONTUBEINTUBE
+	,DIRECTEXPANSIONBRAZEDPLATE
+	,FLOODEDSHELLANDTUBE
+	,SHELLANDCOIL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFanTypeEnum = ENUMERATION OF
+	(CENTRIFUGALFORWARDCURVED
+	,CENTRIFUGALRADIAL
+	,CENTRIFUGALBACKWARDINCLINEDCURVED
+	,CENTRIFUGALAIRFOIL
+	,TUBEAXIAL
+	,VANEAXIAL
+	,PROPELLORAXIAL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFilterTypeEnum = ENUMERATION OF
+	(AIRPARTICLEFILTER
+	,ODORFILTER
+	,OILFILTER
+	,STRAINER
+	,WATERFILTER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFireSuppressionTerminalTypeEnum = ENUMERATION OF
+	(BREECHINGINLET
+	,FIREHYDRANT
+	,HOSEREEL
+	,SPRINKLER
+	,SPRINKLERDEFLECTOR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFlowDirectionEnum = ENUMERATION OF
+	(SOURCE
+	,SINK
+	,SOURCEANDSINK
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFlowInstrumentTypeEnum = ENUMERATION OF
+	(PRESSUREGAUGE
+	,THERMOMETER
+	,AMMETER
+	,FREQUENCYMETER
+	,POWERFACTORMETER
+	,PHASEANGLEMETER
+	,VOLTMETER_PEAK
+	,VOLTMETER_RMS
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFlowMeterTypeEnum = ENUMERATION OF
+	(ELECTRICMETER
+	,ENERGYMETER
+	,FLOWMETER
+	,GASMETER
+	,OILMETER
+	,WATERMETER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcFootingTypeEnum = ENUMERATION OF
+	(FOOTING_BEAM
+	,PAD_FOOTING
+	,PILE_CAP
+	,STRIP_FOOTING
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcGasTerminalTypeEnum = ENUMERATION OF
+	(GASAPPLIANCE
+	,GASBOOSTER
+	,GASBURNER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcGeometricProjectionEnum = ENUMERATION OF
+	(GRAPH_VIEW
+	,SKETCH_VIEW
+	,MODEL_VIEW
+	,PLAN_VIEW
+	,REFLECTED_PLAN_VIEW
+	,SECTION_VIEW
+	,ELEVATION_VIEW
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcGlobalOrLocalEnum = ENUMERATION OF
+	(GLOBAL_COORDS
+	,LOCAL_COORDS);
+END_TYPE;
+
+TYPE IfcHeatExchangerTypeEnum = ENUMERATION OF
+	(PLATE
+	,SHELLANDTUBE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcHumidifierTypeEnum = ENUMERATION OF
+	(STEAMINJECTION
+	,ADIABATICAIRWASHER
+	,ADIABATICPAN
+	,ADIABATICWETTEDELEMENT
+	,ADIABATICATOMIZING
+	,ADIABATICULTRASONIC
+	,ADIABATICRIGIDMEDIA
+	,ADIABATICCOMPRESSEDAIRNOZZLE
+	,ASSISTEDELECTRIC
+	,ASSISTEDNATURALGAS
+	,ASSISTEDPROPANE
+	,ASSISTEDBUTANE
+	,ASSISTEDSTEAM
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcInternalOrExternalEnum = ENUMERATION OF
+	(INTERNAL
+	,EXTERNAL
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcInventoryTypeEnum = ENUMERATION OF
+	(ASSETINVENTORY
+	,SPACEINVENTORY
+	,FURNITUREINVENTORY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcJunctionBoxTypeEnum = ENUMERATION OF
+	(USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLampTypeEnum = ENUMERATION OF
+	(COMPACTFLUORESCENT
+	,FLUORESCENT
+	,HIGHPRESSUREMERCURY
+	,HIGHPRESSURESODIUM
+	,METALHALIDE
+	,TUNGSTENFILAMENT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLayerSetDirectionEnum = ENUMERATION OF
+	(AXIS1
+	,AXIS2
+	,AXIS3);
+END_TYPE;
+
+TYPE IfcLightDistributionCurveEnum = ENUMERATION OF
+	(TYPE_A
+	,TYPE_B
+	,TYPE_C
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLightEmissionSourceEnum = ENUMERATION OF
+	(COMPACTFLUORESCENT
+	,FLUORESCENT
+	,HIGHPRESSUREMERCURY
+	,HIGHPRESSURESODIUM
+	,LIGHTEMITTINGDIODE
+	,LOWPRESSURESODIUM
+	,LOWVOLTAGEHALOGEN
+	,MAINVOLTAGEHALOGEN
+	,METALHALIDE
+	,TUNGSTENFILAMENT
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLightFixtureTypeEnum = ENUMERATION OF
+	(POINTSOURCE
+	,DIRECTIONSOURCE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLoadGroupTypeEnum = ENUMERATION OF
+	(LOAD_GROUP
+	,LOAD_CASE
+	,LOAD_COMBINATION_GROUP
+	,LOAD_COMBINATION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcLogicalOperatorEnum = ENUMERATION OF
+	(LOGICALAND
+	,LOGICALOR);
+END_TYPE;
+
+TYPE IfcMemberTypeEnum = ENUMERATION OF
+	(BRACE
+	,CHORD
+	,COLLAR
+	,MEMBER
+	,MULLION
+	,PLATE
+	,POST
+	,PURLIN
+	,RAFTER
+	,STRINGER
+	,STRUT
+	,STUD
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcMotorConnectionTypeEnum = ENUMERATION OF
+	(BELTDRIVE
+	,COUPLING
+	,DIRECTDRIVE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcNullStyle = ENUMERATION OF
+	(NULL);
+END_TYPE;
+
+TYPE IfcObjectTypeEnum = ENUMERATION OF
+	(PRODUCT
+	,PROCESS
+	,CONTROL
+	,RESOURCE
+	,ACTOR
+	,GROUP
+	,PROJECT
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcObjectiveEnum = ENUMERATION OF
+	(CODECOMPLIANCE
+	,DESIGNINTENT
+	,HEALTHANDSAFETY
+	,REQUIREMENT
+	,SPECIFICATION
+	,TRIGGERCONDITION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcOccupantTypeEnum = ENUMERATION OF
+	(ASSIGNEE
+	,ASSIGNOR
+	,LESSEE
+	,LESSOR
+	,LETTINGAGENT
+	,OWNER
+	,TENANT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcOutletTypeEnum = ENUMERATION OF
+	(AUDIOVISUALOUTLET
+	,COMMUNICATIONSOUTLET
+	,POWEROUTLET
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPermeableCoveringOperationEnum = ENUMERATION OF
+	(GRILL
+	,LOUVER
+	,SCREEN
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPhysicalOrVirtualEnum = ENUMERATION OF
+	(PHYSICAL
+	,VIRTUAL
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPileConstructionEnum = ENUMERATION OF
+	(CAST_IN_PLACE
+	,COMPOSITE
+	,PRECAST_CONCRETE
+	,PREFAB_STEEL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPileTypeEnum = ENUMERATION OF
+	(COHESION
+	,FRICTION
+	,SUPPORT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPipeFittingTypeEnum = ENUMERATION OF
+	(BEND
+	,CONNECTOR
+	,ENTRY
+	,EXIT
+	,JUNCTION
+	,OBSTRUCTION
+	,TRANSITION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPipeSegmentTypeEnum = ENUMERATION OF
+	(FLEXIBLESEGMENT
+	,RIGIDSEGMENT
+	,GUTTER
+	,SPOOL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPlateTypeEnum = ENUMERATION OF
+	(CURTAIN_PANEL
+	,SHEET
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcProcedureTypeEnum = ENUMERATION OF
+	(ADVICE_CAUTION
+	,ADVICE_NOTE
+	,ADVICE_WARNING
+	,CALIBRATION
+	,DIAGNOSTIC
+	,SHUTDOWN
+	,STARTUP
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcProfileTypeEnum = ENUMERATION OF
+	(CURVE
+	,AREA);
+END_TYPE;
+
+TYPE IfcProjectOrderRecordTypeEnum = ENUMERATION OF
+	(CHANGE
+	,MAINTENANCE
+	,MOVE
+	,PURCHASE
+	,WORK
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcProjectOrderTypeEnum = ENUMERATION OF
+	(CHANGEORDER
+	,MAINTENANCEWORKORDER
+	,MOVEORDER
+	,PURCHASEORDER
+	,WORKORDER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcProjectedOrTrueLengthEnum = ENUMERATION OF
+	(PROJECTED_LENGTH
+	,TRUE_LENGTH);
+END_TYPE;
+
+TYPE IfcPropertySourceEnum = ENUMERATION OF
+	(DESIGN
+	,DESIGNMAXIMUM
+	,DESIGNMINIMUM
+	,SIMULATED
+	,ASBUILT
+	,COMMISSIONING
+	,MEASURED
+	,USERDEFINED
+	,NOTKNOWN);
+END_TYPE;
+
+TYPE IfcProtectiveDeviceTypeEnum = ENUMERATION OF
+	(FUSEDISCONNECTOR
+	,CIRCUITBREAKER
+	,EARTHFAILUREDEVICE
+	,RESIDUALCURRENTCIRCUITBREAKER
+	,RESIDUALCURRENTSWITCH
+	,VARISTOR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcPumpTypeEnum = ENUMERATION OF
+	(CIRCULATOR
+	,ENDSUCTION
+	,SPLITCASE
+	,VERTICALINLINE
+	,VERTICALTURBINE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcRailingTypeEnum = ENUMERATION OF
+	(HANDRAIL
+	,GUARDRAIL
+	,BALUSTRADE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcRampFlightTypeEnum = ENUMERATION OF
+	(STRAIGHT
+	,SPIRAL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcRampTypeEnum = ENUMERATION OF
+	(STRAIGHT_RUN_RAMP
+	,TWO_STRAIGHT_RUN_RAMP
+	,QUARTER_TURN_RAMP
+	,TWO_QUARTER_TURN_RAMP
+	,HALF_TURN_RAMP
+	,SPIRAL_RAMP
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcReflectanceMethodEnum = ENUMERATION OF
+	(BLINN
+	,FLAT
+	,GLASS
+	,MATT
+	,METAL
+	,MIRROR
+	,PHONG
+	,PLASTIC
+	,STRAUSS
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcReinforcingBarRoleEnum = ENUMERATION OF
+	(MAIN
+	,SHEAR
+	,LIGATURE
+	,STUD
+	,PUNCHING
+	,EDGE
+	,RING
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcReinforcingBarSurfaceEnum = ENUMERATION OF
+	(PLAIN
+	,TEXTURED);
+END_TYPE;
+
+TYPE IfcResourceConsumptionEnum = ENUMERATION OF
+	(CONSUMED
+	,PARTIALLYCONSUMED
+	,NOTCONSUMED
+	,OCCUPIED
+	,PARTIALLYOCCUPIED
+	,NOTOCCUPIED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcRibPlateDirectionEnum = ENUMERATION OF
+	(DIRECTION_X
+	,DIRECTION_Y);
+END_TYPE;
+
+TYPE IfcRoleEnum = ENUMERATION OF
+	(SUPPLIER
+	,MANUFACTURER
+	,CONTRACTOR
+	,SUBCONTRACTOR
+	,ARCHITECT
+	,STRUCTURALENGINEER
+	,COSTENGINEER
+	,CLIENT
+	,BUILDINGOWNER
+	,BUILDINGOPERATOR
+	,MECHANICALENGINEER
+	,ELECTRICALENGINEER
+	,PROJECTMANAGER
+	,FACILITIESMANAGER
+	,CIVILENGINEER
+	,COMISSIONINGENGINEER
+	,ENGINEER
+	,OWNER
+	,CONSULTANT
+	,CONSTRUCTIONMANAGER
+	,FIELDCONSTRUCTIONMANAGER
+	,RESELLER
+	,USERDEFINED);
+END_TYPE;
+
+TYPE IfcRoofTypeEnum = ENUMERATION OF
+	(FLAT_ROOF
+	,SHED_ROOF
+	,GABLE_ROOF
+	,HIP_ROOF
+	,HIPPED_GABLE_ROOF
+	,GAMBREL_ROOF
+	,MANSARD_ROOF
+	,BARREL_ROOF
+	,RAINBOW_ROOF
+	,BUTTERFLY_ROOF
+	,PAVILION_ROOF
+	,DOME_ROOF
+	,FREEFORM
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSIPrefix = ENUMERATION OF
+	(EXA
+	,PETA
+	,TERA
+	,GIGA
+	,MEGA
+	,KILO
+	,HECTO
+	,DECA
+	,DECI
+	,CENTI
+	,MILLI
+	,MICRO
+	,NANO
+	,PICO
+	,FEMTO
+	,ATTO);
+END_TYPE;
+
+TYPE IfcSIUnitName = ENUMERATION OF
+	(AMPERE
+	,BECQUEREL
+	,CANDELA
+	,COULOMB
+	,CUBIC_METRE
+	,DEGREE_CELSIUS
+	,FARAD
+	,GRAM
+	,GRAY
+	,HENRY
+	,HERTZ
+	,JOULE
+	,KELVIN
+	,LUMEN
+	,LUX
+	,METRE
+	,MOLE
+	,NEWTON
+	,OHM
+	,PASCAL
+	,RADIAN
+	,SECOND
+	,SIEMENS
+	,SIEVERT
+	,SQUARE_METRE
+	,STERADIAN
+	,TESLA
+	,VOLT
+	,WATT
+	,WEBER);
+END_TYPE;
+
+TYPE IfcSanitaryTerminalTypeEnum = ENUMERATION OF
+	(BATH
+	,BIDET
+	,CISTERN
+	,SHOWER
+	,SINK
+	,SANITARYFOUNTAIN
+	,TOILETPAN
+	,URINAL
+	,WASHHANDBASIN
+	,WCSEAT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSectionTypeEnum = ENUMERATION OF
+	(UNIFORM
+	,TAPERED);
+END_TYPE;
+
+TYPE IfcSensorTypeEnum = ENUMERATION OF
+	(CO2SENSOR
+	,FIRESENSOR
+	,FLOWSENSOR
+	,GASSENSOR
+	,HEATSENSOR
+	,HUMIDITYSENSOR
+	,LIGHTSENSOR
+	,MOISTURESENSOR
+	,MOVEMENTSENSOR
+	,PRESSURESENSOR
+	,SMOKESENSOR
+	,SOUNDSENSOR
+	,TEMPERATURESENSOR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSequenceEnum = ENUMERATION OF
+	(START_START
+	,START_FINISH
+	,FINISH_START
+	,FINISH_FINISH
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcServiceLifeFactorTypeEnum = ENUMERATION OF
+	(A_QUALITYOFCOMPONENTS
+	,B_DESIGNLEVEL
+	,C_WORKEXECUTIONLEVEL
+	,D_INDOORENVIRONMENT
+	,E_OUTDOORENVIRONMENT
+	,F_INUSECONDITIONS
+	,G_MAINTENANCELEVEL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcServiceLifeTypeEnum = ENUMERATION OF
+	(ACTUALSERVICELIFE
+	,EXPECTEDSERVICELIFE
+	,OPTIMISTICREFERENCESERVICELIFE
+	,PESSIMISTICREFERENCESERVICELIFE
+	,REFERENCESERVICELIFE);
+END_TYPE;
+
+TYPE IfcSlabTypeEnum = ENUMERATION OF
+	(FLOOR
+	,ROOF
+	,LANDING
+	,BASESLAB
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSoundScaleEnum = ENUMERATION OF
+	(DBA
+	,DBB
+	,DBC
+	,NC
+	,NR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSpaceHeaterTypeEnum = ENUMERATION OF
+	(SECTIONALRADIATOR
+	,PANELRADIATOR
+	,TUBULARRADIATOR
+	,CONVECTOR
+	,BASEBOARDHEATER
+	,FINNEDTUBEUNIT
+	,UNITHEATER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSpaceTypeEnum = ENUMERATION OF
+	(USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcStackTerminalTypeEnum = ENUMERATION OF
+	(BIRDCAGE
+	,COWL
+	,RAINWATERHOPPER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcStairFlightTypeEnum = ENUMERATION OF
+	(STRAIGHT
+	,WINDER
+	,SPIRAL
+	,CURVED
+	,FREEFORM
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcStairTypeEnum = ENUMERATION OF
+	(STRAIGHT_RUN_STAIR
+	,TWO_STRAIGHT_RUN_STAIR
+	,QUARTER_WINDING_STAIR
+	,QUARTER_TURN_STAIR
+	,HALF_WINDING_STAIR
+	,HALF_TURN_STAIR
+	,TWO_QUARTER_WINDING_STAIR
+	,TWO_QUARTER_TURN_STAIR
+	,THREE_QUARTER_WINDING_STAIR
+	,THREE_QUARTER_TURN_STAIR
+	,SPIRAL_STAIR
+	,DOUBLE_RETURN_STAIR
+	,CURVED_RUN_STAIR
+	,TWO_CURVED_RUN_STAIR
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcStateEnum = ENUMERATION OF
+	(READWRITE
+	,READONLY
+	,LOCKED
+	,READWRITELOCKED
+	,READONLYLOCKED);
+END_TYPE;
+
+TYPE IfcStructuralCurveTypeEnum = ENUMERATION OF
+	(RIGID_JOINED_MEMBER
+	,PIN_JOINED_MEMBER
+	,CABLE
+	,TENSION_MEMBER
+	,COMPRESSION_MEMBER
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcStructuralSurfaceTypeEnum = ENUMERATION OF
+	(BENDING_ELEMENT
+	,MEMBRANE_ELEMENT
+	,SHELL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSurfaceSide = ENUMERATION OF
+	(POSITIVE
+	,NEGATIVE
+	,BOTH);
+END_TYPE;
+
+TYPE IfcSurfaceTextureEnum = ENUMERATION OF
+	(BUMP
+	,OPACITY
+	,REFLECTION
+	,SELFILLUMINATION
+	,SHININESS
+	,SPECULAR
+	,TEXTURE
+	,TRANSPARENCYMAP
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcSwitchingDeviceTypeEnum = ENUMERATION OF
+	(CONTACTOR
+	,EMERGENCYSTOP
+	,STARTER
+	,SWITCHDISCONNECTOR
+	,TOGGLESWITCH
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTankTypeEnum = ENUMERATION OF
+	(PREFORMED
+	,SECTIONAL
+	,EXPANSION
+	,PRESSUREVESSEL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTendonTypeEnum = ENUMERATION OF
+	(STRAND
+	,WIRE
+	,BAR
+	,COATED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTextPath = ENUMERATION OF
+	(LEFT
+	,RIGHT
+	,UP
+	,DOWN);
+END_TYPE;
+
+TYPE IfcThermalLoadSourceEnum = ENUMERATION OF
+	(PEOPLE
+	,LIGHTING
+	,EQUIPMENT
+	,VENTILATIONINDOORAIR
+	,VENTILATIONOUTSIDEAIR
+	,RECIRCULATEDAIR
+	,EXHAUSTAIR
+	,AIREXCHANGERATE
+	,DRYBULBTEMPERATURE
+	,RELATIVEHUMIDITY
+	,INFILTRATION
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcThermalLoadTypeEnum = ENUMERATION OF
+	(SENSIBLE
+	,LATENT
+	,RADIANT
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTimeSeriesDataTypeEnum = ENUMERATION OF
+	(CONTINUOUS
+	,DISCRETE
+	,DISCRETEBINARY
+	,PIECEWISEBINARY
+	,PIECEWISECONSTANT
+	,PIECEWISECONTINUOUS
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTimeSeriesScheduleTypeEnum = ENUMERATION OF
+	(ANNUAL
+	,MONTHLY
+	,WEEKLY
+	,DAILY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTransformerTypeEnum = ENUMERATION OF
+	(CURRENT
+	,FREQUENCY
+	,VOLTAGE
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTransitionCode = ENUMERATION OF
+	(DISCONTINUOUS
+	,CONTINUOUS
+	,CONTSAMEGRADIENT
+	,CONTSAMEGRADIENTSAMECURVATURE);
+END_TYPE;
+
+TYPE IfcTransportElementTypeEnum = ENUMERATION OF
+	(ELEVATOR
+	,ESCALATOR
+	,MOVINGWALKWAY
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcTrimmingPreference = ENUMERATION OF
+	(CARTESIAN
+	,PARAMETER
+	,UNSPECIFIED);
+END_TYPE;
+
+TYPE IfcTubeBundleTypeEnum = ENUMERATION OF
+	(FINNED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcUnitEnum = ENUMERATION OF
+	(ABSORBEDDOSEUNIT
+	,AMOUNTOFSUBSTANCEUNIT
+	,AREAUNIT
+	,DOSEEQUIVALENTUNIT
+	,ELECTRICCAPACITANCEUNIT
+	,ELECTRICCHARGEUNIT
+	,ELECTRICCONDUCTANCEUNIT
+	,ELECTRICCURRENTUNIT
+	,ELECTRICRESISTANCEUNIT
+	,ELECTRICVOLTAGEUNIT
+	,ENERGYUNIT
+	,FORCEUNIT
+	,FREQUENCYUNIT
+	,ILLUMINANCEUNIT
+	,INDUCTANCEUNIT
+	,LENGTHUNIT
+	,LUMINOUSFLUXUNIT
+	,LUMINOUSINTENSITYUNIT
+	,MAGNETICFLUXDENSITYUNIT
+	,MAGNETICFLUXUNIT
+	,MASSUNIT
+	,PLANEANGLEUNIT
+	,POWERUNIT
+	,PRESSUREUNIT
+	,RADIOACTIVITYUNIT
+	,SOLIDANGLEUNIT
+	,THERMODYNAMICTEMPERATUREUNIT
+	,TIMEUNIT
+	,VOLUMEUNIT
+	,USERDEFINED);
+END_TYPE;
+
+TYPE IfcUnitaryEquipmentTypeEnum = ENUMERATION OF
+	(AIRHANDLER
+	,AIRCONDITIONINGUNIT
+	,SPLITSYSTEM
+	,ROOFTOPUNIT
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcValveTypeEnum = ENUMERATION OF
+	(AIRRELEASE
+	,ANTIVACUUM
+	,CHANGEOVER
+	,CHECK
+	,COMMISSIONING
+	,DIVERTING
+	,DRAWOFFCOCK
+	,DOUBLECHECK
+	,DOUBLEREGULATING
+	,FAUCET
+	,FLUSHING
+	,GASCOCK
+	,GASTAP
+	,ISOLATING
+	,MIXING
+	,PRESSUREREDUCING
+	,PRESSURERELIEF
+	,REGULATING
+	,SAFETYCUTOFF
+	,STEAMTRAP
+	,STOPCOCK
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcVibrationIsolatorTypeEnum = ENUMERATION OF
+	(COMPRESSION
+	,SPRING
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWallTypeEnum = ENUMERATION OF
+	(STANDARD
+	,POLYGONAL
+	,SHEAR
+	,ELEMENTEDWALL
+	,PLUMBINGWALL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWasteTerminalTypeEnum = ENUMERATION OF
+	(FLOORTRAP
+	,FLOORWASTE
+	,GULLYSUMP
+	,GULLYTRAP
+	,GREASEINTERCEPTOR
+	,OILINTERCEPTOR
+	,PETROLINTERCEPTOR
+	,ROOFDRAIN
+	,WASTEDISPOSALUNIT
+	,WASTETRAP
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWindowPanelOperationEnum = ENUMERATION OF
+	(SIDEHUNGRIGHTHAND
+	,SIDEHUNGLEFTHAND
+	,TILTANDTURNRIGHTHAND
+	,TILTANDTURNLEFTHAND
+	,TOPHUNG
+	,BOTTOMHUNG
+	,PIVOTHORIZONTAL
+	,PIVOTVERTICAL
+	,SLIDINGHORIZONTAL
+	,SLIDINGVERTICAL
+	,REMOVABLECASEMENT
+	,FIXEDCASEMENT
+	,OTHEROPERATION
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWindowPanelPositionEnum = ENUMERATION OF
+	(LEFT
+	,MIDDLE
+	,RIGHT
+	,BOTTOM
+	,TOP
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWindowStyleConstructionEnum = ENUMERATION OF
+	(ALUMINIUM
+	,HIGH_GRADE_STEEL
+	,STEEL
+	,WOOD
+	,ALUMINIUM_WOOD
+	,PLASTIC
+	,OTHER_CONSTRUCTION
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWindowStyleOperationEnum = ENUMERATION OF
+	(SINGLE_PANEL
+	,DOUBLE_PANEL_VERTICAL
+	,DOUBLE_PANEL_HORIZONTAL
+	,TRIPLE_PANEL_VERTICAL
+	,TRIPLE_PANEL_BOTTOM
+	,TRIPLE_PANEL_TOP
+	,TRIPLE_PANEL_LEFT
+	,TRIPLE_PANEL_RIGHT
+	,TRIPLE_PANEL_HORIZONTAL
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcWorkControlTypeEnum = ENUMERATION OF
+	(ACTUAL
+	,BASELINE
+	,PLANNED
+	,USERDEFINED
+	,NOTDEFINED);
+END_TYPE;
+
+TYPE IfcActorSelect = SELECT
+	(IfcOrganization
+	,IfcPerson
+	,IfcPersonAndOrganization);
+END_TYPE;
+
+TYPE IfcAppliedValueSelect = SELECT
+	(IfcRatioMeasure
+	,IfcMeasureWithUnit
+	,IfcMonetaryMeasure);
+END_TYPE;
+
+TYPE IfcAxis2Placement = SELECT
+	(IfcAxis2Placement2D
+	,IfcAxis2Placement3D);
+END_TYPE;
+
+TYPE IfcBooleanOperand = SELECT
+	(IfcSolidModel
+	,IfcHalfSpaceSolid
+	,IfcBooleanResult
+	,IfcCsgPrimitive3D);
+END_TYPE;
+
+TYPE IfcCharacterStyleSelect = SELECT
+	(IfcTextStyleForDefinedFont);
+END_TYPE;
+
+TYPE IfcClassificationNotationSelect = SELECT
+	(IfcClassificationNotation
+	,IfcClassificationReference);
+END_TYPE;
+
+TYPE IfcColour = SELECT
+	(IfcColourSpecification
+	,IfcPreDefinedColour);
+END_TYPE;
+
+TYPE IfcColourOrFactor = SELECT
+	(IfcColourRgb
+	,IfcNormalisedRatioMeasure);
+END_TYPE;
+
+TYPE IfcConditionCriterionSelect = SELECT
+	(IfcLabel
+	,IfcMeasureWithUnit);
+END_TYPE;
+
+TYPE IfcCsgSelect = SELECT
+	(IfcBooleanResult
+	,IfcCsgPrimitive3D);
+END_TYPE;
+
+TYPE IfcCurveFontOrScaledCurveFontSelect = SELECT
+	(IfcCurveStyleFontSelect
+	,IfcCurveStyleFontAndScaling);
+END_TYPE;
+
+TYPE IfcCurveOrEdgeCurve = SELECT
+	(IfcBoundedCurve
+	,IfcEdgeCurve);
+END_TYPE;
+
+TYPE IfcCurveStyleFontSelect = SELECT
+	(IfcPreDefinedCurveFont
+	,IfcCurveStyleFont);
+END_TYPE;
+
+TYPE IfcDateTimeSelect = SELECT
+	(IfcCalendarDate
+	,IfcLocalTime
+	,IfcDateAndTime);
+END_TYPE;
+
+TYPE IfcDefinedSymbolSelect = SELECT
+	(IfcPreDefinedSymbol
+	,IfcExternallyDefinedSymbol);
+END_TYPE;
+
+TYPE IfcDerivedMeasureValue = SELECT
+	(IfcVolumetricFlowRateMeasure
+	,IfcTimeStamp
+	,IfcThermalTransmittanceMeasure
+	,IfcThermalResistanceMeasure
+	,IfcThermalAdmittanceMeasure
+	,IfcPressureMeasure
+	,IfcPowerMeasure
+	,IfcMassFlowRateMeasure
+	,IfcMassDensityMeasure
+	,IfcLinearVelocityMeasure
+	,IfcKinematicViscosityMeasure
+	,IfcIntegerCountRateMeasure
+	,IfcHeatFluxDensityMeasure
+	,IfcFrequencyMeasure
+	,IfcEnergyMeasure
+	,IfcElectricVoltageMeasure
+	,IfcDynamicViscosityMeasure
+	,IfcCompoundPlaneAngleMeasure
+	,IfcAngularVelocityMeasure
+	,IfcThermalConductivityMeasure
+	,IfcMolecularWeightMeasure
+	,IfcVaporPermeabilityMeasure
+	,IfcMoistureDiffusivityMeasure
+	,IfcIsothermalMoistureCapacityMeasure
+	,IfcSpecificHeatCapacityMeasure
+	,IfcMonetaryMeasure
+	,IfcMagneticFluxDensityMeasure
+	,IfcMagneticFluxMeasure
+	,IfcLuminousFluxMeasure
+	,IfcForceMeasure
+	,IfcInductanceMeasure
+	,IfcIlluminanceMeasure
+	,IfcElectricResistanceMeasure
+	,IfcElectricConductanceMeasure
+	,IfcElectricChargeMeasure
+	,IfcDoseEquivalentMeasure
+	,IfcElectricCapacitanceMeasure
+	,IfcAbsorbedDoseMeasure
+	,IfcRadioActivityMeasure
+	,IfcRotationalFrequencyMeasure
+	,IfcTorqueMeasure
+	,IfcAccelerationMeasure
+	,IfcLinearForceMeasure
+	,IfcLinearStiffnessMeasure
+	,IfcModulusOfSubgradeReactionMeasure
+	,IfcModulusOfElasticityMeasure
+	,IfcMomentOfInertiaMeasure
+	,IfcPlanarForceMeasure
+	,IfcRotationalStiffnessMeasure
+	,IfcShearModulusMeasure
+	,IfcLinearMomentMeasure
+	,IfcLuminousIntensityDistributionMeasure
+	,IfcCurvatureMeasure
+	,IfcMassPerLengthMeasure
+	,IfcModulusOfLinearSubgradeReactionMeasure
+	,IfcModulusOfRotationalSubgradeReactionMeasure
+	,IfcRotationalMassMeasure
+	,IfcSectionalAreaIntegralMeasure
+	,IfcSectionModulusMeasure
+	,IfcTemperatureGradientMeasure
+	,IfcThermalExpansionCoefficientMeasure
+	,IfcWarpingConstantMeasure
+	,IfcWarpingMomentMeasure
+	,IfcSoundPowerMeasure
+	,IfcSoundPressureMeasure
+	,IfcHeatingValueMeasure
+	,IfcPHMeasure
+	,IfcIonConcentrationMeasure);
+END_TYPE;
+
+TYPE IfcDocumentSelect = SELECT
+	(IfcDocumentReference
+	,IfcDocumentInformation);
+END_TYPE;
+
+TYPE IfcDraughtingCalloutElement = SELECT
+	(IfcAnnotationCurveOccurrence
+	,IfcAnnotationTextOccurrence
+	,IfcAnnotationSymbolOccurrence);
+END_TYPE;
+
+TYPE IfcFillAreaStyleTileShapeSelect = SELECT
+	(IfcFillAreaStyleTileSymbolWithStyle);
+END_TYPE;
+
+TYPE IfcFillStyleSelect = SELECT
+	(IfcFillAreaStyleHatching
+	,IfcFillAreaStyleTiles
+	,IfcColour
+	,IfcExternallyDefinedHatchStyle);
+END_TYPE;
+
+TYPE IfcGeometricSetSelect = SELECT
+	(IfcPoint
+	,IfcCurve
+	,IfcSurface);
+END_TYPE;
+
+TYPE IfcHatchLineDistanceSelect = SELECT
+	(IfcOneDirectionRepeatFactor
+	,IfcPositiveLengthMeasure);
+END_TYPE;
+
+TYPE IfcLayeredItem = SELECT
+	(IfcRepresentationItem
+	,IfcRepresentation);
+END_TYPE;
+
+TYPE IfcLibrarySelect = SELECT
+	(IfcLibraryReference
+	,IfcLibraryInformation);
+END_TYPE;
+
+TYPE IfcLightDistributionDataSourceSelect = SELECT
+	(IfcExternalReference
+	,IfcLightIntensityDistribution);
+END_TYPE;
+
+TYPE IfcMaterialSelect = SELECT
+	(IfcMaterial
+	,IfcMaterialList
+	,IfcMaterialLayerSetUsage
+	,IfcMaterialLayerSet
+	,IfcMaterialLayer);
+END_TYPE;
+
+TYPE IfcMeasureValue = SELECT
+	(IfcVolumeMeasure
+	,IfcTimeMeasure
+	,IfcThermodynamicTemperatureMeasure
+	,IfcSolidAngleMeasure
+	,IfcPositiveRatioMeasure
+	,IfcRatioMeasure
+	,IfcPositivePlaneAngleMeasure
+	,IfcPlaneAngleMeasure
+	,IfcParameterValue
+	,IfcNumericMeasure
+	,IfcMassMeasure
+	,IfcPositiveLengthMeasure
+	,IfcLengthMeasure
+	,IfcElectricCurrentMeasure
+	,IfcDescriptiveMeasure
+	,IfcCountMeasure
+	,IfcContextDependentMeasure
+	,IfcAreaMeasure
+	,IfcAmountOfSubstanceMeasure
+	,IfcLuminousIntensityMeasure
+	,IfcNormalisedRatioMeasure
+	,IfcComplexNumber);
+END_TYPE;
+
+TYPE IfcMetricValueSelect = SELECT
+	(IfcDateTimeSelect
+	,IfcMeasureWithUnit
+	,IfcTable
+	,IfcText
+	,IfcTimeSeries
+	,IfcCostValue);
+END_TYPE;
+
+TYPE IfcObjectReferenceSelect = SELECT
+	(IfcMaterial
+	,IfcPerson
+	,IfcDateAndTime
+	,IfcMaterialList
+	,IfcOrganization
+	,IfcCalendarDate
+	,IfcLocalTime
+	,IfcPersonAndOrganization
+	,IfcMaterialLayer
+	,IfcExternalReference
+	,IfcTimeSeries
+	,IfcAddress
+	,IfcAppliedValue);
+END_TYPE;
+
+TYPE IfcOrientationSelect = SELECT
+	(IfcPlaneAngleMeasure
+	,IfcDirection);
+END_TYPE;
+
+TYPE IfcPointOrVertexPoint = SELECT
+	(IfcPoint
+	,IfcVertexPoint);
+END_TYPE;
+
+TYPE IfcPresentationStyleSelect = SELECT
+	(IfcNullStyle
+	,IfcCurveStyle
+	,IfcSymbolStyle
+	,IfcFillAreaStyle
+	,IfcTextStyle
+	,IfcSurfaceStyle);
+END_TYPE;
+
+TYPE IfcShell = SELECT
+	(IfcClosedShell
+	,IfcOpenShell);
+END_TYPE;
+
+TYPE IfcSimpleValue = SELECT
+	(IfcInteger
+	,IfcReal
+	,IfcBoolean
+	,IfcIdentifier
+	,IfcText
+	,IfcLabel
+	,IfcLogical);
+END_TYPE;
+
+TYPE IfcSizeSelect = SELECT
+	(IfcRatioMeasure
+	,IfcLengthMeasure
+	,IfcDescriptiveMeasure
+	,IfcPositiveLengthMeasure
+	,IfcNormalisedRatioMeasure
+	,IfcPositiveRatioMeasure);
+END_TYPE;
+
+TYPE IfcSpecularHighlightSelect = SELECT
+	(IfcSpecularExponent
+	,IfcSpecularRoughness);
+END_TYPE;
+
+TYPE IfcStructuralActivityAssignmentSelect = SELECT
+	(IfcStructuralItem
+	,IfcElement);
+END_TYPE;
+
+TYPE IfcSurfaceOrFaceSurface = SELECT
+	(IfcSurface
+	,IfcFaceSurface
+	,IfcFaceBasedSurfaceModel);
+END_TYPE;
+
+TYPE IfcSurfaceStyleElementSelect = SELECT
+	(IfcSurfaceStyleShading
+	,IfcSurfaceStyleLighting
+	,IfcSurfaceStyleWithTextures
+	,IfcExternallyDefinedSurfaceStyle
+	,IfcSurfaceStyleRefraction);
+END_TYPE;
+
+TYPE IfcSymbolStyleSelect = SELECT
+	(IfcColour);
+END_TYPE;
+
+TYPE IfcTextFontSelect = SELECT
+	(IfcPreDefinedTextFont
+	,IfcExternallyDefinedTextFont);
+END_TYPE;
+
+TYPE IfcTextStyleSelect = SELECT
+	(IfcTextStyleWithBoxCharacteristics
+	,IfcTextStyleTextModel);
+END_TYPE;
+
+TYPE IfcTrimmingSelect = SELECT
+	(IfcCartesianPoint
+	,IfcParameterValue);
+END_TYPE;
+
+TYPE IfcUnit = SELECT
+	(IfcDerivedUnit
+	,IfcNamedUnit
+	,IfcMonetaryUnit);
+END_TYPE;
+
+TYPE IfcValue = SELECT
+	(IfcMeasureValue
+	,IfcSimpleValue
+	,IfcDerivedMeasureValue);
+END_TYPE;
+
+TYPE IfcVectorOrDirection = SELECT
+	(IfcDirection
+	,IfcVector);
+END_TYPE;
+
+ENTITY Ifc2DCompositeCurve
+ SUBTYPE OF (IfcCompositeCurve);
+ WHERE
+	WR1 : SELF\IfcCompositeCurve.ClosedCurve;
+	WR2 : SELF\IfcCurve.Dim = 2;
+END_ENTITY;
+
+ENTITY IfcActionRequest
+ SUBTYPE OF (IfcControl);
+	RequestID : IfcIdentifier;
+ UNIQUE
+	UR2 : RequestID;
+END_ENTITY;
+
+ENTITY IfcActor
+ SUPERTYPE OF (ONEOF
+	(IfcOccupant))
+ SUBTYPE OF (IfcObject);
+	TheActor : IfcActorSelect;
+ INVERSE
+	IsActingUpon : SET [0:?] OF IfcRelAssignsToActor FOR RelatingActor;
+END_ENTITY;
+
+ENTITY IfcActorRole;
+	Role : IfcRoleEnum;
+	UserDefinedRole : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+ WHERE
+	WR1 : (Role <> IfcRoleEnum.USERDEFINED) OR
+            ((Role = IfcRoleEnum.USERDEFINED) AND
+              EXISTS(SELF.UserDefinedRole));
+END_ENTITY;
+
+ENTITY IfcActuatorType
+ SUBTYPE OF (IfcDistributionControlElementType);
+	PredefinedType : IfcActuatorTypeEnum;
+END_ENTITY;
+
+ENTITY IfcAddress
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPostalAddress
+	,IfcTelecomAddress));
+	Purpose : OPTIONAL IfcAddressTypeEnum;
+	Description : OPTIONAL IfcText;
+	UserDefinedPurpose : OPTIONAL IfcLabel;
+ INVERSE
+	OfPerson : SET [0:?] OF IfcPerson FOR Addresses;
+	OfOrganization : SET [0:?] OF IfcOrganization FOR Addresses;
+ WHERE
+	WR1 : (NOT(EXISTS(Purpose))) OR
+            ((Purpose <> IfcAddressTypeEnum.USERDEFINED) OR
+            ((Purpose = IfcAddressTypeEnum.USERDEFINED) AND
+              EXISTS(SELF.UserDefinedPurpose)));
+END_ENTITY;
+
+ENTITY IfcAirTerminalBoxType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcAirTerminalBoxTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcAirTerminalBoxTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcAirTerminalBoxTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcAirTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcAirTerminalTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcAirTerminalTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcAirTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcAirToAirHeatRecoveryType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcAirToAirHeatRecoveryTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcAlarmType
+ SUBTYPE OF (IfcDistributionControlElementType);
+	PredefinedType : IfcAlarmTypeEnum;
+END_ENTITY;
+
+ENTITY IfcAngularDimension
+ SUBTYPE OF (IfcDimensionCurveDirectedCallout);
+END_ENTITY;
+
+ENTITY IfcAnnotation
+ SUBTYPE OF (IfcProduct);
+ INVERSE
+	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
+END_ENTITY;
+
+ENTITY IfcAnnotationCurveOccurrence
+ SUPERTYPE OF (ONEOF
+	(IfcDimensionCurve
+	,IfcProjectionCurve))
+ SUBTYPE OF (IfcAnnotationOccurrence);
+ WHERE
+	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
+             ('IFC2X3.IFCCURVE' IN TYPEOF (SELF\IfcStyledItem.Item));
+END_ENTITY;
+
+ENTITY IfcAnnotationFillArea
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	OuterBoundary : IfcCurve;
+	InnerBoundaries : OPTIONAL SET [1:?] OF IfcCurve;
+END_ENTITY;
+
+ENTITY IfcAnnotationFillAreaOccurrence
+ SUBTYPE OF (IfcAnnotationOccurrence);
+	FillStyleTarget : OPTIONAL IfcPoint;
+	GlobalOrLocal : OPTIONAL IfcGlobalOrLocalEnum;
+ WHERE
+	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
+             ('IFC2X3.IFCANNOTATIONFILLAREA' IN TYPEOF (SELF\IfcStyledItem.Item));
+END_ENTITY;
+
+ENTITY IfcAnnotationOccurrence
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAnnotationCurveOccurrence
+	,IfcAnnotationFillAreaOccurrence
+	,IfcAnnotationSurfaceOccurrence
+	,IfcAnnotationSymbolOccurrence
+	,IfcAnnotationTextOccurrence))
+ SUBTYPE OF (IfcStyledItem);
+END_ENTITY;
+
+ENTITY IfcAnnotationSurface
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Item : IfcGeometricRepresentationItem;
+	TextureCoordinates : OPTIONAL IfcTextureCoordinate;
+ WHERE
+	WR01 : SIZEOF([
+               'IFC2X3.IFCSURFACE',
+               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
+               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
+               'IFC2X3.IFCSOLIDMODEL',
+               'IFC2X3.IFCBOOLEANRESULT',
+               'IFC2X3.IFCCSGPRIMITIVE3D'] 
+              * TYPEOF(Item)
+               ) >= 1;
+END_ENTITY;
+
+ENTITY IfcAnnotationSurfaceOccurrence
+ SUBTYPE OF (IfcAnnotationOccurrence);
+ WHERE
+	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR 
+             (SIZEOF(
+              ['IFC2X3.IFCSURFACE',
+               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
+               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
+               'IFC2X3.IFCSOLIDMODEL'] *
+              TYPEOF(SELF\IfcStyledItem.Item)) > 0);
+END_ENTITY;
+
+ENTITY IfcAnnotationSymbolOccurrence
+ SUPERTYPE OF (ONEOF
+	(IfcTerminatorSymbol))
+ SUBTYPE OF (IfcAnnotationOccurrence);
+ WHERE
+	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
+             ('IFC2X3.IFCDEFINEDSYMBOL' IN TYPEOF (SELF\IfcStyledItem.Item));
+END_ENTITY;
+
+ENTITY IfcAnnotationTextOccurrence
+ SUBTYPE OF (IfcAnnotationOccurrence);
+ WHERE
+	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
+             ('IFC2X3.IFCTEXTLITERAL' IN TYPEOF (SELF\IfcStyledItem.Item));
+END_ENTITY;
+
+ENTITY IfcApplication;
+	ApplicationDeveloper : IfcOrganization;
+	Version : IfcLabel;
+	ApplicationFullName : IfcLabel;
+	ApplicationIdentifier : IfcIdentifier;
+ UNIQUE
+	UR1 : ApplicationIdentifier;
+	UR2 : ApplicationFullName, Version;
+END_ENTITY;
+
+ENTITY IfcAppliedValue
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCostValue
+	,IfcEnvironmentalImpactValue));
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	AppliedValue : OPTIONAL IfcAppliedValueSelect;
+	UnitBasis : OPTIONAL IfcMeasureWithUnit;
+	ApplicableDate : OPTIONAL IfcDateTimeSelect;
+	FixedUntilDate : OPTIONAL IfcDateTimeSelect;
+ INVERSE
+	ValuesReferenced : SET [0:?] OF IfcReferencesValueDocument FOR ReferencingValues;
+	ValueOfComponents : SET [0:?] OF IfcAppliedValueRelationship FOR ComponentOfTotal;
+	IsComponentIn : SET [0:?] OF IfcAppliedValueRelationship FOR Components;
+ WHERE
+	WR1 : EXISTS (AppliedValue) OR 
+            EXISTS (ValueOfComponents);
+END_ENTITY;
+
+ENTITY IfcAppliedValueRelationship;
+	ComponentOfTotal : IfcAppliedValue;
+	Components : SET [1:?] OF IfcAppliedValue;
+	ArithmeticOperator : IfcArithmeticOperatorEnum;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcApproval;
+	Description : OPTIONAL IfcText;
+	ApprovalDateTime : IfcDateTimeSelect;
+	ApprovalStatus : OPTIONAL IfcLabel;
+	ApprovalLevel : OPTIONAL IfcLabel;
+	ApprovalQualifier : OPTIONAL IfcText;
+	Name : IfcLabel;
+	Identifier : IfcIdentifier;
+ INVERSE
+	Actors : SET [0:?] OF IfcApprovalActorRelationship FOR Approval;
+	IsRelatedWith : SET [0:?] OF IfcApprovalRelationship FOR RelatedApproval;
+	Relates : SET [0:?] OF IfcApprovalRelationship FOR RelatingApproval;
+END_ENTITY;
+
+ENTITY IfcApprovalActorRelationship;
+	Actor : IfcActorSelect;
+	Approval : IfcApproval;
+	Role : IfcActorRole;
+END_ENTITY;
+
+ENTITY IfcApprovalPropertyRelationship;
+	ApprovedProperties : SET [1:?] OF IfcProperty;
+	Approval : IfcApproval;
+END_ENTITY;
+
+ENTITY IfcApprovalRelationship;
+	RelatedApproval : IfcApproval;
+	RelatingApproval : IfcApproval;
+	Description : OPTIONAL IfcText;
+	Name : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcArbitraryClosedProfileDef
+ SUPERTYPE OF (ONEOF
+	(IfcArbitraryProfileDefWithVoids))
+ SUBTYPE OF (IfcProfileDef);
+	OuterCurve : IfcCurve;
+ WHERE
+	WR1 : OuterCurve.Dim = 2;
+	WR2 : NOT('IFC2X3.IFCLINE' IN TYPEOF(OuterCurve));
+	WR3 : NOT('IFC2X3.IFCOFFSETCURVE2D' IN TYPEOF(OuterCurve));
+END_ENTITY;
+
+ENTITY IfcArbitraryOpenProfileDef
+ SUPERTYPE OF (ONEOF
+	(IfcCenterLineProfileDef))
+ SUBTYPE OF (IfcProfileDef);
+	Curve : IfcBoundedCurve;
+ WHERE
+	WR11 : ('IFC2X3.IFCCENTERLINEPROFILEDEF' IN TYPEOF(SELF)) OR 
+              (SELF\IfcProfileDef.ProfileType = IfcProfileTypeEnum.CURVE);
+	WR12 : Curve.Dim = 2;
+END_ENTITY;
+
+ENTITY IfcArbitraryProfileDefWithVoids
+ SUBTYPE OF (IfcArbitraryClosedProfileDef);
+	InnerCurves : SET [1:?] OF IfcCurve;
+ WHERE
+	WR1 : SELF\IfcProfileDef.ProfileType = AREA;
+	WR2 : SIZEOF(QUERY(temp <* InnerCurves | temp.Dim <> 2)) = 0;
+	WR3 : SIZEOF(QUERY(temp <* InnerCurves | 'IFC2X3.IFCLINE' IN TYPEOF(temp))) = 0;
+END_ENTITY;
+
+ENTITY IfcAsset
+ SUBTYPE OF (IfcGroup);
+	AssetID : IfcIdentifier;
+	OriginalValue : IfcCostValue;
+	CurrentValue : IfcCostValue;
+	TotalReplacementCost : IfcCostValue;
+	Owner : IfcActorSelect;
+	User : IfcActorSelect;
+	ResponsiblePerson : IfcPerson;
+	IncorporationDate : IfcCalendarDate;
+	DepreciatedValue : IfcCostValue;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects | NOT('IFC2X3.IFCELEMENT' IN TYPEOF(Temp)))) = 0;
+END_ENTITY;
+
+ENTITY IfcAsymmetricIShapeProfileDef
+ SUBTYPE OF (IfcIShapeProfileDef);
+	TopFlangeWidth : IfcPositiveLengthMeasure;
+	TopFlangeThickness : OPTIONAL IfcPositiveLengthMeasure;
+	TopFlangeFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcAxis1Placement
+ SUBTYPE OF (IfcPlacement);
+	Axis : OPTIONAL IfcDirection;
+ DERIVE
+	Z : IfcDirection := NVL (IfcNormalise(Axis), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
+ WHERE
+	WR1 : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
+	WR2 : SELF\IfcPlacement.Location.Dim = 3;
+END_ENTITY;
+
+ENTITY IfcAxis2Placement2D
+ SUBTYPE OF (IfcPlacement);
+	RefDirection : OPTIONAL IfcDirection;
+ DERIVE
+	P : LIST [2:2] OF IfcDirection := IfcBuild2Axes(RefDirection);
+ WHERE
+	WR1 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 2);
+	WR2 : SELF\IfcPlacement.Location.Dim = 2;
+END_ENTITY;
+
+ENTITY IfcAxis2Placement3D
+ SUBTYPE OF (IfcPlacement);
+	Axis : OPTIONAL IfcDirection;
+	RefDirection : OPTIONAL IfcDirection;
+ DERIVE
+	P : LIST [3:3] OF IfcDirection := IfcBuildAxes(Axis, RefDirection);
+ WHERE
+	WR1 : SELF\IfcPlacement.Location.Dim = 3;
+	WR2 : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
+	WR3 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 3);
+	WR4 : (NOT (EXISTS (Axis))) OR (NOT (EXISTS (RefDirection))) OR (IfcCrossProduct(Axis,RefDirection).Magnitude > 0.0);
+	WR5 : NOT ((EXISTS (Axis)) XOR (EXISTS (RefDirection)));
+END_ENTITY;
+
+ENTITY IfcBSplineCurve
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBezierCurve))
+ SUBTYPE OF (IfcBoundedCurve);
+	Degree : INTEGER;
+	ControlPointsList : LIST [2:?] OF IfcCartesianPoint;
+	CurveForm : IfcBSplineCurveForm;
+	ClosedCurve : LOGICAL;
+	SelfIntersect : LOGICAL;
+ DERIVE
+	ControlPoints : ARRAY [0:255] OF IfcCartesianPoint := IfcListToArray(ControlPointsList,0,UpperIndexOnControlPoints);
+	UpperIndexOnControlPoints : INTEGER := (SIZEOF(ControlPointsList) - 1);
+ WHERE
+	WR41 : SIZEOF(QUERY(Temp <* ControlPointsList |
+               Temp.Dim <> ControlPointsList[1].Dim))
+             = 0;
+END_ENTITY;
+
+ENTITY IfcBeam
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcBeamType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcBeamTypeEnum;
+END_ENTITY;
+
+ENTITY IfcBezierCurve
+ SUPERTYPE OF (ONEOF
+	(IfcRationalBezierCurve))
+ SUBTYPE OF (IfcBSplineCurve);
+END_ENTITY;
+
+ENTITY IfcBlobTexture
+ SUBTYPE OF (IfcSurfaceTexture);
+	RasterFormat : IfcIdentifier;
+	RasterCode : BOOLEAN;
+ WHERE
+	WR11 : SELF.RasterFormat IN ['BMP', 'JPG', 'GIF', 'PNG'];
+END_ENTITY;
+
+ENTITY IfcBlock
+ SUBTYPE OF (IfcCsgPrimitive3D);
+	XLength : IfcPositiveLengthMeasure;
+	YLength : IfcPositiveLengthMeasure;
+	ZLength : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcBoilerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcBoilerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcBoilerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcBoilerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcBooleanClippingResult
+ SUBTYPE OF (IfcBooleanResult);
+ WHERE
+	WR1 : ('IFC2X3.IFCSWEPTAREASOLID' IN TYPEOF(FirstOperand)) OR ('IFC2X3.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(FirstOperand));
+	WR2 : ('IFC2X3.IFCHALFSPACESOLID' IN TYPEOF(SecondOperand));
+	WR3 : Operator = DIFFERENCE;
+END_ENTITY;
+
+ENTITY IfcBooleanResult
+ SUPERTYPE OF (ONEOF
+	(IfcBooleanClippingResult))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Operator : IfcBooleanOperator;
+	FirstOperand : IfcBooleanOperand;
+	SecondOperand : IfcBooleanOperand;
+ DERIVE
+	Dim : IfcDimensionCount := FirstOperand.Dim;
+ WHERE
+	WR1 : FirstOperand.Dim = SecondOperand.Dim;
+END_ENTITY;
+
+ENTITY IfcBoundaryCondition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBoundaryEdgeCondition
+	,IfcBoundaryFaceCondition
+	,IfcBoundaryNodeCondition));
+	Name : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcBoundaryEdgeCondition
+ SUBTYPE OF (IfcBoundaryCondition);
+	LinearStiffnessByLengthX : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
+	LinearStiffnessByLengthY : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
+	LinearStiffnessByLengthZ : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
+	RotationalStiffnessByLengthX : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
+	RotationalStiffnessByLengthY : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
+	RotationalStiffnessByLengthZ : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
+END_ENTITY;
+
+ENTITY IfcBoundaryFaceCondition
+ SUBTYPE OF (IfcBoundaryCondition);
+	LinearStiffnessByAreaX : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
+	LinearStiffnessByAreaY : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
+	LinearStiffnessByAreaZ : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
+END_ENTITY;
+
+ENTITY IfcBoundaryNodeCondition
+ SUPERTYPE OF (ONEOF
+	(IfcBoundaryNodeConditionWarping))
+ SUBTYPE OF (IfcBoundaryCondition);
+	LinearStiffnessX : OPTIONAL IfcLinearStiffnessMeasure;
+	LinearStiffnessY : OPTIONAL IfcLinearStiffnessMeasure;
+	LinearStiffnessZ : OPTIONAL IfcLinearStiffnessMeasure;
+	RotationalStiffnessX : OPTIONAL IfcRotationalStiffnessMeasure;
+	RotationalStiffnessY : OPTIONAL IfcRotationalStiffnessMeasure;
+	RotationalStiffnessZ : OPTIONAL IfcRotationalStiffnessMeasure;
+END_ENTITY;
+
+ENTITY IfcBoundaryNodeConditionWarping
+ SUBTYPE OF (IfcBoundaryNodeCondition);
+	WarpingStiffness : OPTIONAL IfcWarpingMomentMeasure;
+END_ENTITY;
+
+ENTITY IfcBoundedCurve
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBSplineCurve
+	,IfcCompositeCurve
+	,IfcPolyline
+	,IfcTrimmedCurve))
+ SUBTYPE OF (IfcCurve);
+END_ENTITY;
+
+ENTITY IfcBoundedSurface
+ SUPERTYPE OF (ONEOF
+	(IfcCurveBoundedPlane
+	,IfcRectangularTrimmedSurface))
+ SUBTYPE OF (IfcSurface);
+END_ENTITY;
+
+ENTITY IfcBoundingBox
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Corner : IfcCartesianPoint;
+	XDim : IfcPositiveLengthMeasure;
+	YDim : IfcPositiveLengthMeasure;
+	ZDim : IfcPositiveLengthMeasure;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcBoxedHalfSpace
+ SUBTYPE OF (IfcHalfSpaceSolid);
+	Enclosure : IfcBoundingBox;
+ WHERE
+	WR1 : NOT ('IFC2X3.IFCCURVEBOUNDEDPLANE' IN TYPEOF(SELF\IfcHalfSpaceSolid.BaseSurface));
+END_ENTITY;
+
+ENTITY IfcBuilding
+ SUBTYPE OF (IfcSpatialStructureElement);
+	ElevationOfRefHeight : OPTIONAL IfcLengthMeasure;
+	ElevationOfTerrain : OPTIONAL IfcLengthMeasure;
+	BuildingAddress : OPTIONAL IfcPostalAddress;
+END_ENTITY;
+
+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;
+
+ENTITY IfcBuildingElementComponent
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBuildingElementPart
+	,IfcReinforcingElement))
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcBuildingElementPart
+ SUBTYPE OF (IfcBuildingElementComponent);
+END_ENTITY;
+
+ENTITY IfcBuildingElementProxy
+ SUBTYPE OF (IfcBuildingElement);
+	CompositionType : OPTIONAL IfcElementCompositionEnum;
+ WHERE
+	WR1 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcBuildingElementProxyType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcBuildingElementProxyTypeEnum;
+END_ENTITY;
+
+ENTITY IfcBuildingElementType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBeamType
+	,IfcBuildingElementProxyType
+	,IfcColumnType
+	,IfcCoveringType
+	,IfcCurtainWallType
+	,IfcMemberType
+	,IfcPlateType
+	,IfcRailingType
+	,IfcRampFlightType
+	,IfcSlabType
+	,IfcStairFlightType
+	,IfcWallType))
+ SUBTYPE OF (IfcElementType);
+END_ENTITY;
+
+ENTITY IfcBuildingStorey
+ SUBTYPE OF (IfcSpatialStructureElement);
+	Elevation : OPTIONAL IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcCShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Depth : IfcPositiveLengthMeasure;
+	Width : IfcPositiveLengthMeasure;
+	WallThickness : IfcPositiveLengthMeasure;
+	Girth : IfcPositiveLengthMeasure;
+	InternalFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR1 : Girth < (Depth / 2.);
+	WR2 : NOT(EXISTS(InternalFilletRadius)) OR
+            ((InternalFilletRadius <= Width/2.) AND (InternalFilletRadius <= Depth/2.));
+	WR3 : (WallThickness < Width/2.) AND (WallThickness < Depth/2.);
+END_ENTITY;
+
+ENTITY IfcCableCarrierFittingType
+ SUBTYPE OF (IfcFlowFittingType);
+	PredefinedType : IfcCableCarrierFittingTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCableCarrierFittingTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCableCarrierFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCableCarrierSegmentType
+ SUBTYPE OF (IfcFlowSegmentType);
+	PredefinedType : IfcCableCarrierSegmentTypeEnum;
+END_ENTITY;
+
+ENTITY IfcCableSegmentType
+ SUBTYPE OF (IfcFlowSegmentType);
+	PredefinedType : IfcCableSegmentTypeEnum;
+END_ENTITY;
+
+ENTITY IfcCalendarDate;
+	DayComponent : IfcDayInMonthNumber;
+	MonthComponent : IfcMonthInYearNumber;
+	YearComponent : IfcYearNumber;
+ WHERE
+	WR21 : IfcValidCalendarDate (SELF);
+END_ENTITY;
+
+ENTITY IfcCartesianPoint
+ SUBTYPE OF (IfcPoint);
+	Coordinates : LIST [1:3] OF IfcLengthMeasure;
+ DERIVE
+	Dim : IfcDimensionCount := HIINDEX(Coordinates);
+ WHERE
+	WR1 : HIINDEX(Coordinates) >= 2;
+END_ENTITY;
+
+ENTITY IfcCartesianTransformationOperator
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCartesianTransformationOperator2D
+	,IfcCartesianTransformationOperator3D))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Axis1 : OPTIONAL IfcDirection;
+	Axis2 : OPTIONAL IfcDirection;
+	LocalOrigin : IfcCartesianPoint;
+	Scale : OPTIONAL REAL;
+ DERIVE
+	Scl : REAL := NVL(Scale, 1.0);
+	Dim : IfcDimensionCount := LocalOrigin.Dim;
+ WHERE
+	WR1 : Scl > 0.0;
+END_ENTITY;
+
+ENTITY IfcCartesianTransformationOperator2D
+ SUPERTYPE OF (ONEOF
+	(IfcCartesianTransformationOperator2DnonUniform))
+ SUBTYPE OF (IfcCartesianTransformationOperator);
+ DERIVE
+	U : LIST [2:2] OF IfcDirection := IfcBaseAxis(2,SELF\IfcCartesianTransformationOperator.Axis1,
+          SELF\IfcCartesianTransformationOperator.Axis2,?);
+ WHERE
+	WR1 : SELF\IfcCartesianTransformationOperator.Dim = 2;
+	WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
+            (SELF\IfcCartesianTransformationOperator.Axis1.Dim = 2);
+	WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
+            (SELF\IfcCartesianTransformationOperator.Axis2.Dim = 2);
+END_ENTITY;
+
+ENTITY IfcCartesianTransformationOperator2DnonUniform
+ SUBTYPE OF (IfcCartesianTransformationOperator2D);
+	Scale2 : OPTIONAL REAL;
+ DERIVE
+	Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
+ WHERE
+	WR1 : Scl2 > 0.0;
+END_ENTITY;
+
+ENTITY IfcCartesianTransformationOperator3D
+ SUPERTYPE OF (ONEOF
+	(IfcCartesianTransformationOperator3DnonUniform))
+ SUBTYPE OF (IfcCartesianTransformationOperator);
+	Axis3 : OPTIONAL IfcDirection;
+ DERIVE
+	U : LIST [3:3] OF IfcDirection := IfcBaseAxis(3,SELF\IfcCartesianTransformationOperator.Axis1,
+              SELF\IfcCartesianTransformationOperator.Axis2,Axis3);
+ WHERE
+	WR1 : SELF\IfcCartesianTransformationOperator.Dim = 3;
+	WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
+            (SELF\IfcCartesianTransformationOperator.Axis1.Dim = 3);
+	WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
+            (SELF\IfcCartesianTransformationOperator.Axis2.Dim = 3);
+	WR4 : NOT(EXISTS(Axis3)) OR (Axis3.Dim = 3);
+END_ENTITY;
+
+ENTITY IfcCartesianTransformationOperator3DnonUniform
+ SUBTYPE OF (IfcCartesianTransformationOperator3D);
+	Scale2 : OPTIONAL REAL;
+	Scale3 : OPTIONAL REAL;
+ DERIVE
+	Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
+	Scl3 : REAL := NVL(Scale3, SELF\IfcCartesianTransformationOperator.Scl);
+ WHERE
+	WR1 : Scl2 > 0.0;
+	WR2 : Scl3 > 0.0;
+END_ENTITY;
+
+ENTITY IfcCenterLineProfileDef
+ SUBTYPE OF (IfcArbitraryOpenProfileDef);
+	Thickness : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcChamferEdgeFeature
+ SUBTYPE OF (IfcEdgeFeature);
+	Width : OPTIONAL IfcPositiveLengthMeasure;
+	Height : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcChillerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcChillerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcChillerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcChillerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCircle
+ SUBTYPE OF (IfcConic);
+	Radius : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcCircleHollowProfileDef
+ SUBTYPE OF (IfcCircleProfileDef);
+	WallThickness : IfcPositiveLengthMeasure;
+ WHERE
+	WR1 : WallThickness < SELF\IfcCircleProfileDef.Radius;
+END_ENTITY;
+
+ENTITY IfcCircleProfileDef
+ SUPERTYPE OF (ONEOF
+	(IfcCircleHollowProfileDef))
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Radius : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcClassification;
+	Source : IfcLabel;
+	Edition : IfcLabel;
+	EditionDate : OPTIONAL IfcCalendarDate;
+	Name : IfcLabel;
+ INVERSE
+	Contains : SET [0:?] OF IfcClassificationItem FOR ItemOf;
+END_ENTITY;
+
+ENTITY IfcClassificationItem;
+	Notation : IfcClassificationNotationFacet;
+	ItemOf : OPTIONAL IfcClassification;
+	Title : IfcLabel;
+ INVERSE
+	IsClassifiedItemIn : SET [0:1] OF IfcClassificationItemRelationship FOR RelatedItems;
+	IsClassifyingItemIn : SET [0:1] OF IfcClassificationItemRelationship FOR RelatingItem;
+END_ENTITY;
+
+ENTITY IfcClassificationItemRelationship;
+	RelatingItem : IfcClassificationItem;
+	RelatedItems : SET [1:?] OF IfcClassificationItem;
+END_ENTITY;
+
+ENTITY IfcClassificationNotation;
+	NotationFacets : SET [1:?] OF IfcClassificationNotationFacet;
+END_ENTITY;
+
+ENTITY IfcClassificationNotationFacet;
+	NotationValue : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcClassificationReference
+ SUBTYPE OF (IfcExternalReference);
+	ReferencedSource : OPTIONAL IfcClassification;
+END_ENTITY;
+
+ENTITY IfcClosedShell
+ SUBTYPE OF (IfcConnectedFaceSet);
+END_ENTITY;
+
+ENTITY IfcCoilType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcCoilTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCoilTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCoilTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcColourRgb
+ SUBTYPE OF (IfcColourSpecification);
+	Red : IfcNormalisedRatioMeasure;
+	Green : IfcNormalisedRatioMeasure;
+	Blue : IfcNormalisedRatioMeasure;
+END_ENTITY;
+
+ENTITY IfcColourSpecification
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcColourRgb));
+	Name : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcColumn
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcColumnType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcColumnTypeEnum;
+END_ENTITY;
+
+ENTITY IfcComplexProperty
+ SUBTYPE OF (IfcProperty);
+	UsageName : IfcIdentifier;
+	HasProperties : SET [1:?] OF IfcProperty;
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* HasProperties | SELF :=: temp)) = 0;
+	WR22 : IfcUniquePropertyName(HasProperties);
+END_ENTITY;
+
+ENTITY IfcCompositeCurve
+ SUPERTYPE OF (ONEOF
+	(Ifc2DCompositeCurve))
+ SUBTYPE OF (IfcBoundedCurve);
+	Segments : LIST [1:?] OF IfcCompositeCurveSegment;
+	SelfIntersect : LOGICAL;
+ DERIVE
+	NSegments : INTEGER := SIZEOF(Segments);
+	ClosedCurve : LOGICAL := Segments[NSegments].Transition <> Discontinuous;
+ WHERE
+	WR41 : ((NOT ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 1)) OR ((ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 0));
+	WR42 : SIZEOF( QUERY( Temp <* Segments | Temp.Dim <> Segments[1].Dim)) = 0;
+END_ENTITY;
+
+ENTITY IfcCompositeCurveSegment
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Transition : IfcTransitionCode;
+	SameSense : BOOLEAN;
+	ParentCurve : IfcCurve;
+ DERIVE
+	Dim : IfcDimensionCount := ParentCurve.Dim;
+ INVERSE
+	UsingCurves : SET [1:?] OF IfcCompositeCurve FOR Segments;
+ WHERE
+	WR1 : ('IFC2X3.IFCBOUNDEDCURVE' IN TYPEOF(ParentCurve));
+END_ENTITY;
+
+ENTITY IfcCompositeProfileDef
+ SUBTYPE OF (IfcProfileDef);
+	Profiles : SET [2:?] OF IfcProfileDef;
+	Label : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : SIZEOF(QUERY(temp <* Profiles | temp.ProfileType <> Profiles[1].ProfileType)) = 0;
+	WR2 : SIZEOF(QUERY(temp <* Profiles | 'IFC2X3.IFCCOMPOSITEPROFILEDEF' IN TYPEOF(temp))) = 0;
+END_ENTITY;
+
+ENTITY IfcCompressorType
+ SUBTYPE OF (IfcFlowMovingDeviceType);
+	PredefinedType : IfcCompressorTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCompressorTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCompressorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCondenserType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcCondenserTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCondenserTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCondenserTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCondition
+ SUBTYPE OF (IfcGroup);
+END_ENTITY;
+
+ENTITY IfcConditionCriterion
+ SUBTYPE OF (IfcControl);
+	Criterion : IfcConditionCriterionSelect;
+	CriterionDateTime : IfcDateTimeSelect;
+ WHERE
+	WR1 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcConic
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCircle
+	,IfcEllipse))
+ SUBTYPE OF (IfcCurve);
+	Position : IfcAxis2Placement;
+END_ENTITY;
+
+ENTITY IfcConnectedFaceSet
+ SUPERTYPE OF (ONEOF
+	(IfcClosedShell
+	,IfcOpenShell))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+	CfsFaces : SET [1:?] OF IfcFace;
+END_ENTITY;
+
+ENTITY IfcConnectionCurveGeometry
+ SUBTYPE OF (IfcConnectionGeometry);
+	CurveOnRelatingElement : IfcCurveOrEdgeCurve;
+	CurveOnRelatedElement : OPTIONAL IfcCurveOrEdgeCurve;
+END_ENTITY;
+
+ENTITY IfcConnectionGeometry
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcConnectionCurveGeometry
+	,IfcConnectionPointGeometry
+	,IfcConnectionPortGeometry
+	,IfcConnectionSurfaceGeometry));
+END_ENTITY;
+
+ENTITY IfcConnectionPointEccentricity
+ SUBTYPE OF (IfcConnectionPointGeometry);
+	EccentricityInX : OPTIONAL IfcLengthMeasure;
+	EccentricityInY : OPTIONAL IfcLengthMeasure;
+	EccentricityInZ : OPTIONAL IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcConnectionPointGeometry
+ SUPERTYPE OF (ONEOF
+	(IfcConnectionPointEccentricity))
+ SUBTYPE OF (IfcConnectionGeometry);
+	PointOnRelatingElement : IfcPointOrVertexPoint;
+	PointOnRelatedElement : OPTIONAL IfcPointOrVertexPoint;
+END_ENTITY;
+
+ENTITY IfcConnectionPortGeometry
+ SUBTYPE OF (IfcConnectionGeometry);
+	LocationAtRelatingElement : IfcAxis2Placement;
+	LocationAtRelatedElement : OPTIONAL IfcAxis2Placement;
+	ProfileOfPort : IfcProfileDef;
+END_ENTITY;
+
+ENTITY IfcConnectionSurfaceGeometry
+ SUBTYPE OF (IfcConnectionGeometry);
+	SurfaceOnRelatingElement : IfcSurfaceOrFaceSurface;
+	SurfaceOnRelatedElement : OPTIONAL IfcSurfaceOrFaceSurface;
+END_ENTITY;
+
+ENTITY IfcConstraint
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcMetric
+	,IfcObjective));
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	ConstraintGrade : IfcConstraintEnum;
+	ConstraintSource : OPTIONAL IfcLabel;
+	CreatingActor : OPTIONAL IfcActorSelect;
+	CreationTime : OPTIONAL IfcDateTimeSelect;
+	UserDefinedGrade : OPTIONAL IfcLabel;
+ INVERSE
+	ClassifiedAs : SET [0:?] OF IfcConstraintClassificationRelationship FOR ClassifiedConstraint;
+	RelatesConstraints : SET [0:?] OF IfcConstraintRelationship FOR RelatingConstraint;
+	IsRelatedWith : SET [0:?] OF IfcConstraintRelationship FOR RelatedConstraints;
+	PropertiesForConstraint : SET [0:?] OF IfcPropertyConstraintRelationship FOR RelatingConstraint;
+	Aggregates : SET [0:?] OF IfcConstraintAggregationRelationship FOR RelatingConstraint;
+	IsAggregatedIn : SET [0:?] OF IfcConstraintAggregationRelationship FOR RelatedConstraints;
+ WHERE
+	WR11 : (ConstraintGrade <> IfcConstraintEnum.USERDEFINED) OR
+             ((ConstraintGrade = IfcConstraintEnum.USERDEFINED) AND EXISTS(SELF\IfcConstraint.UserDefinedGrade));
+END_ENTITY;
+
+ENTITY IfcConstraintAggregationRelationship;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	RelatingConstraint : IfcConstraint;
+	RelatedConstraints : LIST [1:?] OF UNIQUE IfcConstraint;
+	LogicalAggregator : IfcLogicalOperatorEnum;
+ WHERE
+	WR11 : SIZEOF(QUERY(temp <* RelatedConstraints | 
+               temp :=: RelatingConstraint
+               )) = 0;
+END_ENTITY;
+
+ENTITY IfcConstraintClassificationRelationship;
+	ClassifiedConstraint : IfcConstraint;
+	RelatedClassifications : SET [1:?] OF IfcClassificationNotationSelect;
+END_ENTITY;
+
+ENTITY IfcConstraintRelationship;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	RelatingConstraint : IfcConstraint;
+	RelatedConstraints : SET [1:?] OF IfcConstraint;
+ WHERE
+	WR11 : SIZEOF(QUERY(temp <* RelatedConstraints | temp :=: RelatingConstraint )) = 0;
+END_ENTITY;
+
+ENTITY IfcConstructionEquipmentResource
+ SUBTYPE OF (IfcConstructionResource);
+END_ENTITY;
+
+ENTITY IfcConstructionMaterialResource
+ SUBTYPE OF (IfcConstructionResource);
+	Suppliers : OPTIONAL SET [1:?] OF IfcActorSelect;
+	UsageRatio : OPTIONAL IfcRatioMeasure;
+ WHERE
+	WR1 : SIZEOF(SELF\IfcResource.ResourceOf) <=1;
+	WR2 : NOT(EXISTS(SELF\IfcResource.ResourceOf[1])) OR
+            (SELF\IfcResource.ResourceOf[1].RelatedObjectsType = IfcObjectTypeEnum.PRODUCT);
+END_ENTITY;
+
+ENTITY IfcConstructionProductResource
+ SUBTYPE OF (IfcConstructionResource);
+ WHERE
+	WR1 : SIZEOF(SELF\IfcResource.ResourceOf) <=1;
+	WR2 : NOT(EXISTS(SELF\IfcResource.ResourceOf[1])) OR
+            (SELF\IfcResource.ResourceOf[1].RelatedObjectsType = IfcObjectTypeEnum.PRODUCT);
+END_ENTITY;
+
+ENTITY IfcConstructionResource
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcConstructionEquipmentResource
+	,IfcConstructionMaterialResource
+	,IfcConstructionProductResource
+	,IfcCrewResource
+	,IfcLaborResource
+	,IfcSubContractResource))
+ SUBTYPE OF (IfcResource);
+	ResourceIdentifier : OPTIONAL IfcIdentifier;
+	ResourceGroup : OPTIONAL IfcLabel;
+	ResourceConsumption : OPTIONAL IfcResourceConsumptionEnum;
+	BaseQuantity : OPTIONAL IfcMeasureWithUnit;
+END_ENTITY;
+
+ENTITY IfcContextDependentUnit
+ SUBTYPE OF (IfcNamedUnit);
+	Name : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcControl
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcActionRequest
+	,IfcConditionCriterion
+	,IfcCostItem
+	,IfcCostSchedule
+	,IfcEquipmentStandard
+	,IfcFurnitureStandard
+	,IfcPerformanceHistory
+	,IfcPermit
+	,IfcProjectOrder
+	,IfcProjectOrderRecord
+	,IfcScheduleTimeControl
+	,IfcServiceLife
+	,IfcSpaceProgram
+	,IfcTimeSeriesSchedule
+	,IfcWorkControl))
+ SUBTYPE OF (IfcObject);
+ INVERSE
+	Controls : SET [0:?] OF IfcRelAssignsToControl FOR RelatingControl;
+END_ENTITY;
+
+ENTITY IfcControllerType
+ SUBTYPE OF (IfcDistributionControlElementType);
+	PredefinedType : IfcControllerTypeEnum;
+END_ENTITY;
+
+ENTITY IfcConversionBasedUnit
+ SUBTYPE OF (IfcNamedUnit);
+	Name : IfcLabel;
+	ConversionFactor : IfcMeasureWithUnit;
+END_ENTITY;
+
+ENTITY IfcCooledBeamType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcCooledBeamTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCooledBeamTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCooledBeamTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCoolingTowerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcCoolingTowerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcCoolingTowerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcCoolingTowerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcCoordinatedUniversalTimeOffset;
+	HourOffset : IfcHourInDay;
+	MinuteOffset : OPTIONAL IfcMinuteInHour;
+	Sense : IfcAheadOrBehind;
+END_ENTITY;
+
+ENTITY IfcCostItem
+ SUBTYPE OF (IfcControl);
+END_ENTITY;
+
+ENTITY IfcCostSchedule
+ SUBTYPE OF (IfcControl);
+	SubmittedBy : OPTIONAL IfcActorSelect;
+	PreparedBy : OPTIONAL IfcActorSelect;
+	SubmittedOn : OPTIONAL IfcDateTimeSelect;
+	Status : OPTIONAL IfcLabel;
+	TargetUsers : OPTIONAL SET [1:?] OF IfcActorSelect;
+	UpdateDate : OPTIONAL IfcDateTimeSelect;
+	ID : IfcIdentifier;
+	PredefinedType : IfcCostScheduleTypeEnum;
+ UNIQUE
+	UR2 : ID;
+END_ENTITY;
+
+ENTITY IfcCostValue
+ SUBTYPE OF (IfcAppliedValue);
+	CostType : IfcLabel;
+	Condition : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcCovering
+ SUBTYPE OF (IfcBuildingElement);
+	PredefinedType : OPTIONAL IfcCoveringTypeEnum;
+ INVERSE
+	CoversSpaces : SET [0:1] OF IfcRelCoversSpaces FOR RelatedCoverings;
+	Covers : SET [0:1] OF IfcRelCoversBldgElements FOR RelatedCoverings;
+END_ENTITY;
+
+ENTITY IfcCoveringType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcCoveringTypeEnum;
+END_ENTITY;
+
+ENTITY IfcCraneRailAShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	OverallHeight : IfcPositiveLengthMeasure;
+	BaseWidth2 : IfcPositiveLengthMeasure;
+	Radius : OPTIONAL IfcPositiveLengthMeasure;
+	HeadWidth : IfcPositiveLengthMeasure;
+	HeadDepth2 : IfcPositiveLengthMeasure;
+	HeadDepth3 : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	BaseWidth4 : IfcPositiveLengthMeasure;
+	BaseDepth1 : IfcPositiveLengthMeasure;
+	BaseDepth2 : IfcPositiveLengthMeasure;
+	BaseDepth3 : IfcPositiveLengthMeasure;
+	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcCraneRailFShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	OverallHeight : IfcPositiveLengthMeasure;
+	HeadWidth : IfcPositiveLengthMeasure;
+	Radius : OPTIONAL IfcPositiveLengthMeasure;
+	HeadDepth2 : IfcPositiveLengthMeasure;
+	HeadDepth3 : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	BaseDepth1 : IfcPositiveLengthMeasure;
+	BaseDepth2 : IfcPositiveLengthMeasure;
+	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcCrewResource
+ SUBTYPE OF (IfcConstructionResource);
+END_ENTITY;
+
+ENTITY IfcCsgPrimitive3D
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBlock
+	,IfcRectangularPyramid
+	,IfcRightCircularCone
+	,IfcRightCircularCylinder
+	,IfcSphere))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Position : IfcAxis2Placement3D;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcCsgSolid
+ SUBTYPE OF (IfcSolidModel);
+	TreeRootExpression : IfcCsgSelect;
+END_ENTITY;
+
+ENTITY IfcCurrencyRelationship;
+	RelatingMonetaryUnit : IfcMonetaryUnit;
+	RelatedMonetaryUnit : IfcMonetaryUnit;
+	ExchangeRate : IfcPositiveRatioMeasure;
+	RateDateTime : IfcDateAndTime;
+	RateSource : OPTIONAL IfcLibraryInformation;
+END_ENTITY;
+
+ENTITY IfcCurtainWall
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcCurtainWallType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcCurtainWallTypeEnum;
+END_ENTITY;
+
+ENTITY IfcCurve
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBoundedCurve
+	,IfcConic
+	,IfcLine
+	,IfcOffsetCurve2D
+	,IfcOffsetCurve3D))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+ DERIVE
+	Dim : IfcDimensionCount := IfcCurveDim(SELF);
+END_ENTITY;
+
+ENTITY IfcCurveBoundedPlane
+ SUBTYPE OF (IfcBoundedSurface);
+	BasisSurface : IfcPlane;
+	OuterBoundary : IfcCurve;
+	InnerBoundaries : SET [0:?] OF IfcCurve;
+ DERIVE
+	Dim : IfcDimensionCount := BasisSurface.Dim;
+END_ENTITY;
+
+ENTITY IfcCurveStyle
+ SUBTYPE OF (IfcPresentationStyle);
+	CurveFont : OPTIONAL IfcCurveFontOrScaledCurveFontSelect;
+	CurveWidth : OPTIONAL IfcSizeSelect;
+	CurveColour : OPTIONAL IfcColour;
+ WHERE
+	WR11 : (NOT(EXISTS(CurveWidth))) OR
+             ('IFC2X3.IFCPOSITIVELENGTHMEASURE' IN TYPEOF(CurveWidth)) OR 
+              (('IFC2X3.IFCDESCRIPTIVEMEASURE' IN TYPEOF(CurveWidth)) AND
+              (CurveWidth = 'by layer'));
+END_ENTITY;
+
+ENTITY IfcCurveStyleFont;
+	Name : OPTIONAL IfcLabel;
+	PatternList : LIST [1:?] OF IfcCurveStyleFontPattern;
+END_ENTITY;
+
+ENTITY IfcCurveStyleFontAndScaling;
+	Name : OPTIONAL IfcLabel;
+	CurveFont : IfcCurveStyleFontSelect;
+	CurveFontScaling : IfcPositiveRatioMeasure;
+END_ENTITY;
+
+ENTITY IfcCurveStyleFontPattern;
+	VisibleSegmentLength : IfcLengthMeasure;
+	InvisibleSegmentLength : IfcPositiveLengthMeasure;
+ WHERE
+	WR01 : VisibleSegmentLength >= 0.;
+END_ENTITY;
+
+ENTITY IfcDamperType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcDamperTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcDamperTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcDamperTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcDateAndTime;
+	DateComponent : IfcCalendarDate;
+	TimeComponent : IfcLocalTime;
+END_ENTITY;
+
+ENTITY IfcDefinedSymbol
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Definition : IfcDefinedSymbolSelect;
+	Target : IfcCartesianTransformationOperator2D;
+END_ENTITY;
+
+ENTITY IfcDerivedProfileDef
+ SUBTYPE OF (IfcProfileDef);
+	ParentProfile : IfcProfileDef;
+	Operator : IfcCartesianTransformationOperator2D;
+	Label : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : SELF\IfcProfileDef.ProfileType = ParentProfile.ProfileType;
+END_ENTITY;
+
+ENTITY IfcDerivedUnit;
+	Elements : SET [1:?] OF IfcDerivedUnitElement;
+	UnitType : IfcDerivedUnitEnum;
+	UserDefinedType : OPTIONAL IfcLabel;
+ DERIVE
+	Dimensions : IfcDimensionalExponents := IfcDeriveDimensionalExponents(SELF);
+ WHERE
+	WR1 : (SIZEOF (Elements) > 1) OR ((SIZEOF (Elements) = 1) AND (Elements[1].Exponent <> 1 ));
+	WR2 : (UnitType <> IfcDerivedUnitEnum.USERDEFINED) OR
+            ((UnitType = IfcDerivedUnitEnum.USERDEFINED) AND 
+             (EXISTS(SELF.UserDefinedType)));
+END_ENTITY;
+
+ENTITY IfcDerivedUnitElement;
+	Unit : IfcNamedUnit;
+	Exponent : INTEGER;
+END_ENTITY;
+
+ENTITY IfcDiameterDimension
+ SUBTYPE OF (IfcDimensionCurveDirectedCallout);
+END_ENTITY;
+
+ENTITY IfcDimensionCalloutRelationship
+ SUBTYPE OF (IfcDraughtingCalloutRelationship);
+ WHERE
+	WR11 : SELF\IfcDraughtingCalloutRelationship.Name IN ['primary','secondary'];
+	WR12 : SIZEOF(TYPEOF(SELF\IfcDraughtingCalloutRelationship.RelatingDraughtingCallout) * [
+                  'IFC2X3.IFCANGULARDIMENSION',
+                  'IFC2X3.IFCDIAMETERDIMENSION',
+                  'IFC2X3.IFCLINEARDIMENSION',
+                  'IFC2X3.IFCRADIUSDIMENSION']) = 1;
+	WR13 : NOT ('IFC2X3.IFCDIMENSIONCURVEDIRECTEDCALLOUT'
+               IN TYPEOF (SELF\IfcDraughtingCalloutRelationship.RelatedDraughtingCallout));
+END_ENTITY;
+
+ENTITY IfcDimensionCurve
+ SUBTYPE OF (IfcAnnotationCurveOccurrence);
+ INVERSE
+	AnnotatedBySymbols : SET [0:2] OF IfcTerminatorSymbol FOR AnnotatedCurve;
+ WHERE
+	WR51 : SIZEOF(USEDIN(SELF,'IFC2X3.IFCDRAUGHTINGCALLOUT.CONTENTS')) 
+                   >= 1;
+	WR52 : (SIZEOF(QUERY (Dct1 <* USEDIN(SELF,'IFC2X3.' + 
+                            'IFCTERMINATORSYMBOL.ANNOTATEDCURVE') | (Dct1.Role = IfcDimensionExtentUsage.ORIGIN))) <= 1) 
+             AND 
+             (SIZEOF(QUERY (Dct2 <* USEDIN(SELF,'IFC2X3.' + 
+                            'IFCTERMINATORSYMBOL.ANNOTATEDCURVE') | (Dct2.Role = IfcDimensionExtentUsage.TARGET))) <= 1);
+	WR53 : SIZEOF(QUERY (Dct <* AnnotatedBySymbols | 
+               NOT('IFC2X3.IFCDIMENSIONCURVETERMINATOR' IN TYPEOF(Dct)))) 
+               = 0;
+END_ENTITY;
+
+ENTITY IfcDimensionCurveDirectedCallout
+ SUPERTYPE OF (ONEOF
+	(IfcAngularDimension
+	,IfcDiameterDimension
+	,IfcLinearDimension
+	,IfcRadiusDimension))
+ SUBTYPE OF (IfcDraughtingCallout);
+ WHERE
+	WR41 : SIZEOF(QUERY (Dc <* SELF\IfcDraughtingCallout.Contents | (
+                   'IFC2X3.IFCDIMENSIONCURVE' IN TYPEOF(Dc)))) 
+                  = 1;
+	WR42 : SIZEOF (QUERY (Dc <* SELF.contents |
+                    ('IFC2X3.IFCPROJECTIONCURVE' IN
+                      TYPEOF (Dc)))) <= 2;
+END_ENTITY;
+
+ENTITY IfcDimensionCurveTerminator
+ SUBTYPE OF (IfcTerminatorSymbol);
+	Role : IfcDimensionExtentUsage;
+ WHERE
+	WR61 : 'IFC2X3.IFCDIMENSIONCURVE' IN TYPEOF
+             (SELF\IfcTerminatorSymbol.AnnotatedCurve);
+END_ENTITY;
+
+ENTITY IfcDimensionPair
+ SUBTYPE OF (IfcDraughtingCalloutRelationship);
+ WHERE
+	WR11 : SELF.Name IN ['chained','parallel'];
+	WR12 : SIZEOF(TYPEOF(SELF.RelatingDraughtingCallout) * [
+                            'IFC2X3.IFCANGULARDIMENSION',
+                            'IFC2X3.IFCDIAMETERDIMENSION',
+                            'IFC2X3.IFCLINEARDIMENSION',
+                            'IFC2X3.IFCRADIUSDIMENSION']) = 1;
+	WR13 : SIZEOF(TYPEOF(SELF.RelatedDraughtingCallout) * [
+                            'IFC2X3.IFCANGULARDIMENSION',
+                            'IFC2X3.IFCDIAMETERDIMENSION',
+                            'IFC2X3.IFCLINEARDIMENSION',
+                            'IFC2X3.IFCRADIUSDIMENSION']) = 1;
+END_ENTITY;
+
+ENTITY IfcDimensionalExponents;
+	LengthExponent : INTEGER;
+	MassExponent : INTEGER;
+	TimeExponent : INTEGER;
+	ElectricCurrentExponent : INTEGER;
+	ThermodynamicTemperatureExponent : INTEGER;
+	AmountOfSubstanceExponent : INTEGER;
+	LuminousIntensityExponent : INTEGER;
+END_ENTITY;
+
+ENTITY IfcDirection
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	DirectionRatios : LIST [2:3] OF REAL;
+ DERIVE
+	Dim : IfcDimensionCount := HIINDEX(DirectionRatios);
+END_ENTITY;
+
+ENTITY IfcDiscreteAccessory
+ SUBTYPE OF (IfcElementComponent);
+END_ENTITY;
+
+ENTITY IfcDiscreteAccessoryType
+ SUPERTYPE OF (ONEOF
+	(IfcVibrationIsolatorType))
+ SUBTYPE OF (IfcElementComponentType);
+END_ENTITY;
+
+ENTITY IfcDistributionChamberElement
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcDistributionChamberElementType
+ SUBTYPE OF (IfcDistributionFlowElementType);
+	PredefinedType : IfcDistributionChamberElementTypeEnum;
+END_ENTITY;
+
+ENTITY IfcDistributionControlElement
+ SUBTYPE OF (IfcDistributionElement);
+	ControlElementId : OPTIONAL IfcIdentifier;
+ INVERSE
+	AssignedToFlowElement : SET [0:1] OF IfcRelFlowControlElements FOR RelatedControlElements;
+END_ENTITY;
+
+ENTITY IfcDistributionControlElementType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcActuatorType
+	,IfcAlarmType
+	,IfcControllerType
+	,IfcFlowInstrumentType
+	,IfcSensorType))
+ SUBTYPE OF (IfcDistributionElementType);
+END_ENTITY;
+
+ENTITY IfcDistributionElement
+ SUPERTYPE OF (ONEOF
+	(IfcDistributionControlElement
+	,IfcDistributionFlowElement))
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcDistributionElementType
+ SUPERTYPE OF (ONEOF
+	(IfcDistributionControlElementType
+	,IfcDistributionFlowElementType))
+ SUBTYPE OF (IfcElementType);
+END_ENTITY;
+
+ENTITY IfcDistributionFlowElement
+ SUPERTYPE OF (ONEOF
+	(IfcDistributionChamberElement
+	,IfcEnergyConversionDevice
+	,IfcFlowController
+	,IfcFlowFitting
+	,IfcFlowMovingDevice
+	,IfcFlowSegment
+	,IfcFlowStorageDevice
+	,IfcFlowTerminal
+	,IfcFlowTreatmentDevice))
+ SUBTYPE OF (IfcDistributionElement);
+ INVERSE
+	HasControlElements : SET [0:1] OF IfcRelFlowControlElements FOR RelatingFlowElement;
+END_ENTITY;
+
+ENTITY IfcDistributionFlowElementType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDistributionChamberElementType
+	,IfcEnergyConversionDeviceType
+	,IfcFlowControllerType
+	,IfcFlowFittingType
+	,IfcFlowMovingDeviceType
+	,IfcFlowSegmentType
+	,IfcFlowStorageDeviceType
+	,IfcFlowTerminalType
+	,IfcFlowTreatmentDeviceType))
+ SUBTYPE OF (IfcDistributionElementType);
+END_ENTITY;
+
+ENTITY IfcDistributionPort
+ SUBTYPE OF (IfcPort);
+	FlowDirection : OPTIONAL IfcFlowDirectionEnum;
+END_ENTITY;
+
+ENTITY IfcDocumentElectronicFormat;
+	FileExtension : OPTIONAL IfcLabel;
+	MimeContentType : OPTIONAL IfcLabel;
+	MimeSubtype : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : EXISTS(FileExtension) OR EXISTS(MimeContentType);
+END_ENTITY;
+
+ENTITY IfcDocumentInformation;
+	DocumentId : IfcIdentifier;
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	DocumentReferences : OPTIONAL SET [1:?] OF IfcDocumentReference;
+	Purpose : OPTIONAL IfcText;
+	IntendedUse : OPTIONAL IfcText;
+	Scope : OPTIONAL IfcText;
+	Revision : OPTIONAL IfcLabel;
+	DocumentOwner : OPTIONAL IfcActorSelect;
+	Editors : OPTIONAL SET [1:?] OF IfcActorSelect;
+	CreationTime : OPTIONAL IfcDateAndTime;
+	LastRevisionTime : OPTIONAL IfcDateAndTime;
+	ElectronicFormat : OPTIONAL IfcDocumentElectronicFormat;
+	ValidFrom : OPTIONAL IfcCalendarDate;
+	ValidUntil : OPTIONAL IfcCalendarDate;
+	Confidentiality : OPTIONAL IfcDocumentConfidentialityEnum;
+	Status : OPTIONAL IfcDocumentStatusEnum;
+ INVERSE
+	IsPointedTo : SET [0:?] OF IfcDocumentInformationRelationship FOR RelatedDocuments;
+	IsPointer : SET [0:1] OF IfcDocumentInformationRelationship FOR RelatingDocument;
+END_ENTITY;
+
+ENTITY IfcDocumentInformationRelationship;
+	RelatingDocument : IfcDocumentInformation;
+	RelatedDocuments : SET [1:?] OF IfcDocumentInformation;
+	RelationshipType : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcDocumentReference
+ SUBTYPE OF (IfcExternalReference);
+ INVERSE
+	ReferenceToDocument : SET [0:1] OF IfcDocumentInformation FOR DocumentReferences;
+ WHERE
+	WR1 : EXISTS(Name) XOR EXISTS(ReferenceToDocument[1]);
+END_ENTITY;
+
+ENTITY IfcDoor
+ SUBTYPE OF (IfcBuildingElement);
+	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
+	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcDoorLiningProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
+	LiningThickness : OPTIONAL IfcPositiveLengthMeasure;
+	ThresholdDepth : OPTIONAL IfcPositiveLengthMeasure;
+	ThresholdThickness : OPTIONAL IfcPositiveLengthMeasure;
+	TransomThickness : OPTIONAL IfcPositiveLengthMeasure;
+	TransomOffset : OPTIONAL IfcLengthMeasure;
+	LiningOffset : OPTIONAL IfcLengthMeasure;
+	ThresholdOffset : OPTIONAL IfcLengthMeasure;
+	CasingThickness : OPTIONAL IfcPositiveLengthMeasure;
+	CasingDepth : OPTIONAL IfcPositiveLengthMeasure;
+	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
+ WHERE
+	WR31 : NOT(NOT(EXISTS(LiningDepth)) AND EXISTS(LiningThickness));
+	WR32 : NOT(NOT(EXISTS(ThresholdDepth)) AND EXISTS(ThresholdThickness));
+	WR33 : (EXISTS(TransomOffset) AND EXISTS(TransomThickness)) XOR
+             (NOT(EXISTS(TransomOffset)) AND NOT(EXISTS(TransomThickness)));
+	WR34 : (EXISTS(CasingDepth) AND EXISTS(CasingThickness)) XOR
+             (NOT(EXISTS(CasingDepth)) AND NOT(EXISTS(CasingThickness)));
+	WR35 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
+             ('IFC2X3.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
+END_ENTITY;
+
+ENTITY IfcDoorPanelProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	PanelDepth : OPTIONAL IfcPositiveLengthMeasure;
+	PanelOperation : IfcDoorPanelOperationEnum;
+	PanelWidth : OPTIONAL IfcNormalisedRatioMeasure;
+	PanelPosition : IfcDoorPanelPositionEnum;
+	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
+ WHERE
+	WR31 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
+             ('IFC2X3.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
+END_ENTITY;
+
+ENTITY IfcDoorStyle
+ SUBTYPE OF (IfcTypeProduct);
+	OperationType : IfcDoorStyleOperationEnum;
+	ConstructionType : IfcDoorStyleConstructionEnum;
+	ParameterTakesPrecedence : BOOLEAN;
+	Sizeable : BOOLEAN;
+END_ENTITY;
+
+ENTITY IfcDraughtingCallout
+ SUPERTYPE OF (ONEOF
+	(IfcDimensionCurveDirectedCallout
+	,IfcStructuredDimensionCallout))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Contents : SET [1:?] OF IfcDraughtingCalloutElement;
+ INVERSE
+	IsRelatedFromCallout : SET [0:?] OF IfcDraughtingCalloutRelationship FOR RelatedDraughtingCallout;
+	IsRelatedToCallout : SET [0:?] OF IfcDraughtingCalloutRelationship FOR RelatingDraughtingCallout;
+END_ENTITY;
+
+ENTITY IfcDraughtingCalloutRelationship
+ SUPERTYPE OF (ONEOF
+	(IfcDimensionCalloutRelationship
+	,IfcDimensionPair));
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	RelatingDraughtingCallout : IfcDraughtingCallout;
+	RelatedDraughtingCallout : IfcDraughtingCallout;
+END_ENTITY;
+
+ENTITY IfcDraughtingPreDefinedColour
+ SUBTYPE OF (IfcPreDefinedColour);
+ WHERE
+	WR31 : SELF\IfcPreDefinedItem.Name IN ['black','red','green','blue','yellow',
+                  'magenta','cyan','white','by layer'];
+END_ENTITY;
+
+ENTITY IfcDraughtingPreDefinedCurveFont
+ SUBTYPE OF (IfcPreDefinedCurveFont);
+ WHERE
+	WR31 : SELF\IfcPredefinedItem.Name IN
+                    ['continuous',
+                     'chain',
+                     'chain double dash',
+                     'dashed',
+                     'dotted',
+                     'by layer'];
+END_ENTITY;
+
+ENTITY IfcDraughtingPreDefinedTextFont
+ SUBTYPE OF (IfcPreDefinedTextFont);
+ WHERE
+	WR31 : SELF\IfcPreDefinedItem.Name IN ['ISO 3098-1 font A','ISO 3098-1 font B'];
+END_ENTITY;
+
+ENTITY IfcDuctFittingType
+ SUBTYPE OF (IfcFlowFittingType);
+	PredefinedType : IfcDuctFittingTypeEnum;
+ WHERE
+	WR2 : (PredefinedType <> IfcDuctFittingTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcDuctFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcDuctSegmentType
+ SUBTYPE OF (IfcFlowSegmentType);
+	PredefinedType : IfcDuctSegmentTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcDuctSegmentTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcDuctSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcDuctSilencerType
+ SUBTYPE OF (IfcFlowTreatmentDeviceType);
+	PredefinedType : IfcDuctSilencerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcDuctSilencerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcDuctSilencerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcEdge
+ SUPERTYPE OF (ONEOF
+	(IfcEdgeCurve
+	,IfcOrientedEdge
+	,IfcSubedge))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+	EdgeStart : IfcVertex;
+	EdgeEnd : IfcVertex;
+END_ENTITY;
+
+ENTITY IfcEdgeCurve
+ SUBTYPE OF (IfcEdge);
+	EdgeGeometry : IfcCurve;
+	SameSense : BOOLEAN;
+END_ENTITY;
+
+ENTITY IfcEdgeFeature
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcChamferEdgeFeature
+	,IfcRoundedEdgeFeature))
+ SUBTYPE OF (IfcFeatureElementSubtraction);
+	FeatureLength : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcEdgeLoop
+ SUBTYPE OF (IfcLoop);
+	EdgeList : LIST [1:?] OF IfcOrientedEdge;
+ DERIVE
+	Ne : INTEGER := SIZEOF(EdgeList);
+ WHERE
+	WR1 : (EdgeList[1].EdgeStart) :=: (EdgeList[Ne].EdgeEnd);
+	WR2 : IfcLoopHeadToTail(SELF);
+END_ENTITY;
+
+ENTITY IfcElectricApplianceType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcElectricApplianceTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricDistributionPoint
+ SUBTYPE OF (IfcFlowController);
+	DistributionPointFunction : IfcElectricDistributionPointFunctionEnum;
+	UserDefinedFunction : OPTIONAL IfcLabel;
+ WHERE
+	WR31 : (DistributionPointFunction <> IfcElectricDistributionPointFunctionEnum.USERDEFINED) OR
+             ((DistributionPointFunction = IfcElectricDistributionPointFunctionEnum.USERDEFINED) AND EXISTS(SELF\IfcElectricDistributionPoint.UserDefinedFunction));
+END_ENTITY;
+
+ENTITY IfcElectricFlowStorageDeviceType
+ SUBTYPE OF (IfcFlowStorageDeviceType);
+	PredefinedType : IfcElectricFlowStorageDeviceTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricGeneratorType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcElectricGeneratorTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricHeaterType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcElectricHeaterTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricMotorType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcElectricMotorTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricTimeControlType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcElectricTimeControlTypeEnum;
+END_ENTITY;
+
+ENTITY IfcElectricalBaseProperties
+ SUBTYPE OF (IfcEnergyProperties);
+	ElectricCurrentType : OPTIONAL IfcElectricCurrentEnum;
+	InputVoltage : IfcElectricVoltageMeasure;
+	InputFrequency : IfcFrequencyMeasure;
+	FullLoadCurrent : OPTIONAL IfcElectricCurrentMeasure;
+	MinimumCircuitCurrent : OPTIONAL IfcElectricCurrentMeasure;
+	MaximumPowerInput : OPTIONAL IfcPowerMeasure;
+	RatedPowerInput : OPTIONAL IfcPowerMeasure;
+	InputPhase : INTEGER;
+END_ENTITY;
+
+ENTITY IfcElectricalCircuit
+ SUBTYPE OF (IfcSystem);
+END_ENTITY;
+
+ENTITY IfcElectricalElement
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcElement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBuildingElement
+	,IfcDistributionElement
+	,IfcElectricalElement
+	,IfcElementAssembly
+	,IfcElementComponent
+	,IfcEquipmentElement
+	,IfcFeatureElement
+	,IfcFurnishingElement
+	,IfcTransportElement
+	,IfcVirtualElement))
+ SUBTYPE OF (IfcProduct);
+	Tag : OPTIONAL IfcIdentifier;
+ INVERSE
+	FillsVoids : SET [0:1] OF IfcRelFillsElement FOR RelatedBuildingElement;
+	ConnectedTo : SET [0:?] OF IfcRelConnectsElements FOR RelatingElement;
+	HasCoverings : SET [0:?] OF IfcRelCoversBldgElements FOR RelatingBuildingElement;
+	HasProjections : SET [0:?] OF IfcRelProjectsElement FOR RelatingElement;
+	HasStructuralMember : SET [0:?] OF IfcRelConnectsStructuralElement FOR RelatingElement;
+	ReferencedInStructures : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatedElements;
+	HasPorts : SET [0:?] OF IfcRelConnectsPortToElement FOR RelatedElement;
+	HasOpenings : SET [0:?] OF IfcRelVoidsElement FOR RelatingBuildingElement;
+	IsConnectionRealization : SET [0:?] OF IfcRelConnectsWithRealizingElements FOR RealizingElements;
+	ProvidesBoundaries : SET [0:?] OF IfcRelSpaceBoundary FOR RelatedBuildingElement;
+	ConnectedFrom : SET [0:?] OF IfcRelConnectsElements FOR RelatedElement;
+	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
+END_ENTITY;
+
+ENTITY IfcElementAssembly
+ SUBTYPE OF (IfcElement);
+	AssemblyPlace : OPTIONAL IfcAssemblyPlaceEnum;
+	PredefinedType : IfcElementAssemblyTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcElementComponent
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDiscreteAccessory
+	,IfcFastener))
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcElementComponentType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDiscreteAccessoryType
+	,IfcFastenerType))
+ SUBTYPE OF (IfcElementType);
+END_ENTITY;
+
+ENTITY IfcElementQuantity
+ SUBTYPE OF (IfcPropertySetDefinition);
+	MethodOfMeasurement : OPTIONAL IfcLabel;
+	Quantities : SET [1:?] OF IfcPhysicalQuantity;
+END_ENTITY;
+
+ENTITY IfcElementType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBuildingElementType
+	,IfcDistributionElementType
+	,IfcElementComponentType
+	,IfcFurnishingElementType
+	,IfcSpatialStructureElementType
+	,IfcTransportElementType))
+ SUBTYPE OF (IfcTypeProduct);
+	ElementType : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcElementarySurface
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPlane))
+ SUBTYPE OF (IfcSurface);
+	Position : IfcAxis2Placement3D;
+ DERIVE
+	Dim : IfcDimensionCount := Position.Dim;
+END_ENTITY;
+
+ENTITY IfcEllipse
+ SUBTYPE OF (IfcConic);
+	SemiAxis1 : IfcPositiveLengthMeasure;
+	SemiAxis2 : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcEllipseProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	SemiAxis1 : IfcPositiveLengthMeasure;
+	SemiAxis2 : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcEnergyConversionDevice
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcEnergyConversionDeviceType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAirToAirHeatRecoveryType
+	,IfcBoilerType
+	,IfcChillerType
+	,IfcCoilType
+	,IfcCondenserType
+	,IfcCooledBeamType
+	,IfcCoolingTowerType
+	,IfcElectricGeneratorType
+	,IfcElectricMotorType
+	,IfcEvaporativeCoolerType
+	,IfcEvaporatorType
+	,IfcHeatExchangerType
+	,IfcHumidifierType
+	,IfcMotorConnectionType
+	,IfcSpaceHeaterType
+	,IfcTransformerType
+	,IfcTubeBundleType
+	,IfcUnitaryEquipmentType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcEnergyProperties
+ SUPERTYPE OF (ONEOF
+	(IfcElectricalBaseProperties))
+ SUBTYPE OF (IfcPropertySetDefinition);
+	EnergySequence : OPTIONAL IfcEnergySequenceEnum;
+	UserDefinedEnergySequence : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcEnvironmentalImpactValue
+ SUBTYPE OF (IfcAppliedValue);
+	ImpactType : IfcLabel;
+	Category : IfcEnvironmentalImpactCategoryEnum;
+	UserDefinedCategory : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : (Category <> IfcEnvironmentalImpactCategoryEnum.USERDEFINED) OR
+            ((Category = IfcEnvironmentalImpactCategoryEnum.USERDEFINED) AND EXISTS(SELF\IfcEnvironmentalImpactValue.UserDefinedCategory));
+END_ENTITY;
+
+ENTITY IfcEquipmentElement
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcEquipmentStandard
+ SUBTYPE OF (IfcControl);
+END_ENTITY;
+
+ENTITY IfcEvaporativeCoolerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcEvaporativeCoolerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcEvaporativeCoolerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcEvaporativeCoolerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcEvaporatorType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcEvaporatorTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcEvaporatorTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcEvaporatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcExtendedMaterialProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	ExtendedProperties : SET [1:?] OF IfcProperty;
+	Description : OPTIONAL IfcText;
+	Name : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcExternalReference
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcClassificationReference
+	,IfcDocumentReference
+	,IfcExternallyDefinedHatchStyle
+	,IfcExternallyDefinedSurfaceStyle
+	,IfcExternallyDefinedSymbol
+	,IfcExternallyDefinedTextFont
+	,IfcLibraryReference));
+	Location : OPTIONAL IfcLabel;
+	ItemReference : OPTIONAL IfcIdentifier;
+	Name : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : EXISTS(ItemReference) OR EXISTS(Location) OR EXISTS(Name);
+END_ENTITY;
+
+ENTITY IfcExternallyDefinedHatchStyle
+ SUBTYPE OF (IfcExternalReference);
+END_ENTITY;
+
+ENTITY IfcExternallyDefinedSurfaceStyle
+ SUBTYPE OF (IfcExternalReference);
+END_ENTITY;
+
+ENTITY IfcExternallyDefinedSymbol
+ SUBTYPE OF (IfcExternalReference);
+END_ENTITY;
+
+ENTITY IfcExternallyDefinedTextFont
+ SUBTYPE OF (IfcExternalReference);
+END_ENTITY;
+
+ENTITY IfcExtrudedAreaSolid
+ SUBTYPE OF (IfcSweptAreaSolid);
+	ExtrudedDirection : IfcDirection;
+	Depth : IfcPositiveLengthMeasure;
+ WHERE
+	WR31 : IfcDotProduct(IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcDirection([0.0,0.0,1.0]), SELF.ExtrudedDirection) <> 0.0;
+END_ENTITY;
+
+ENTITY IfcFace
+ SUPERTYPE OF (ONEOF
+	(IfcFaceSurface))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+	Bounds : SET [1:?] OF IfcFaceBound;
+ WHERE
+	WR1 : SIZEOF(QUERY(temp <* Bounds | 'IFC2X3.IFCFACEOUTERBOUND' IN TYPEOF(temp))) <= 1;
+END_ENTITY;
+
+ENTITY IfcFaceBasedSurfaceModel
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	FbsmFaces : SET [1:?] OF IfcConnectedFaceSet;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcFaceBound
+ SUPERTYPE OF (ONEOF
+	(IfcFaceOuterBound))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+	Bound : IfcLoop;
+	Orientation : BOOLEAN;
+END_ENTITY;
+
+ENTITY IfcFaceOuterBound
+ SUBTYPE OF (IfcFaceBound);
+END_ENTITY;
+
+ENTITY IfcFaceSurface
+ SUBTYPE OF (IfcFace);
+	FaceSurface : IfcSurface;
+	SameSense : BOOLEAN;
+END_ENTITY;
+
+ENTITY IfcFacetedBrep
+ SUBTYPE OF (IfcManifoldSolidBrep);
+END_ENTITY;
+
+ENTITY IfcFacetedBrepWithVoids
+ SUBTYPE OF (IfcManifoldSolidBrep);
+	Voids : SET [1:?] OF IfcClosedShell;
+END_ENTITY;
+
+ENTITY IfcFailureConnectionCondition
+ SUBTYPE OF (IfcStructuralConnectionCondition);
+	TensionFailureX : OPTIONAL IfcForceMeasure;
+	TensionFailureY : OPTIONAL IfcForceMeasure;
+	TensionFailureZ : OPTIONAL IfcForceMeasure;
+	CompressionFailureX : OPTIONAL IfcForceMeasure;
+	CompressionFailureY : OPTIONAL IfcForceMeasure;
+	CompressionFailureZ : OPTIONAL IfcForceMeasure;
+END_ENTITY;
+
+ENTITY IfcFanType
+ SUBTYPE OF (IfcFlowMovingDeviceType);
+	PredefinedType : IfcFanTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcFanTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcFanTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcFastener
+ SUPERTYPE OF (ONEOF
+	(IfcMechanicalFastener))
+ SUBTYPE OF (IfcElementComponent);
+END_ENTITY;
+
+ENTITY IfcFastenerType
+ SUPERTYPE OF (ONEOF
+	(IfcMechanicalFastenerType))
+ SUBTYPE OF (IfcElementComponentType);
+END_ENTITY;
+
+ENTITY IfcFeatureElement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcFeatureElementAddition
+	,IfcFeatureElementSubtraction))
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcFeatureElementAddition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcProjectionElement))
+ SUBTYPE OF (IfcFeatureElement);
+ INVERSE
+	ProjectsElements : IfcRelProjectsElement FOR RelatedFeatureElement;
+END_ENTITY;
+
+ENTITY IfcFeatureElementSubtraction
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcEdgeFeature
+	,IfcOpeningElement))
+ SUBTYPE OF (IfcFeatureElement);
+ INVERSE
+	VoidsElements : IfcRelVoidsElement FOR RelatedOpeningElement;
+END_ENTITY;
+
+ENTITY IfcFillAreaStyle
+ SUBTYPE OF (IfcPresentationStyle);
+	FillStyles : SET [1:?] OF IfcFillStyleSelect;
+ WHERE
+	WR11 : SIZEOF(QUERY(Style <* SELF.FillStyles |
+               'IFC2X3.IFCCOLOUR' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR12 : SIZEOF(QUERY(Style <* SELF.FillStyles |
+               'IFC2X3.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR13 : (SIZEOF(QUERY(Style <* SELF.FillStyles |
+               'IFC2X3.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
+                TYPEOF(Style)
+               )) >= 1)
+             XOR
+             (SIZEOF(QUERY(Style <* SELF.FillStyles |
+               'IFC2X3.IFCFILLAREASTYLEHATCHING' IN
+                TYPEOF(Style)
+               )) >= 1)
+             XOR
+             (SIZEOF(QUERY(Style <* SELF.FillStyles |
+               'IFC2X3.IFCFILLAREASTYLETILES' IN
+                TYPEOF(Style)
+               )) >= 1);
+END_ENTITY;
+
+ENTITY IfcFillAreaStyleHatching
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	HatchLineAppearance : IfcCurveStyle;
+	StartOfNextHatchLine : IfcHatchLineDistanceSelect;
+	PointOfReferenceHatchLine : OPTIONAL IfcCartesianPoint;
+	PatternStart : OPTIONAL IfcCartesianPoint;
+	HatchLineAngle : IfcPlaneAngleMeasure;
+ WHERE
+	WR21 : NOT(
+              'IFC2X3.IFCTWODIRECTIONREPEATFACTOR' 
+              IN TYPEOF(StartOfNextHatchLine)
+             );
+	WR22 : NOT(EXISTS(PatternStart)) 
+             OR (PatternStart.Dim = 2);
+	WR23 : NOT(EXISTS(PointOfReferenceHatchLine)) 
+             OR (PointOfReferenceHatchLine.Dim = 2);
+END_ENTITY;
+
+ENTITY IfcFillAreaStyleTileSymbolWithStyle
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Symbol : IfcAnnotationSymbolOccurrence;
+END_ENTITY;
+
+ENTITY IfcFillAreaStyleTiles
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	TilingPattern : IfcOneDirectionRepeatFactor;
+	Tiles : SET [1:?] OF IfcFillAreaStyleTileShapeSelect;
+	TilingScale : IfcPositiveRatioMeasure;
+END_ENTITY;
+
+ENTITY IfcFilterType
+ SUBTYPE OF (IfcFlowTreatmentDeviceType);
+	PredefinedType : IfcFilterTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcFilterTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcFilterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcFireSuppressionTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcFireSuppressionTerminalTypeEnum;
+END_ENTITY;
+
+ENTITY IfcFlowController
+ SUPERTYPE OF (ONEOF
+	(IfcElectricDistributionPoint))
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowControllerType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAirTerminalBoxType
+	,IfcDamperType
+	,IfcElectricTimeControlType
+	,IfcFlowMeterType
+	,IfcProtectiveDeviceType
+	,IfcSwitchingDeviceType
+	,IfcValveType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowFitting
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowFittingType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCableCarrierFittingType
+	,IfcDuctFittingType
+	,IfcJunctionBoxType
+	,IfcPipeFittingType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowInstrumentType
+ SUBTYPE OF (IfcDistributionControlElementType);
+	PredefinedType : IfcFlowInstrumentTypeEnum;
+END_ENTITY;
+
+ENTITY IfcFlowMeterType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcFlowMeterTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcFlowMeterTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcFlowMeterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcFlowMovingDevice
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowMovingDeviceType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCompressorType
+	,IfcFanType
+	,IfcPumpType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowSegment
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowSegmentType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCableCarrierSegmentType
+	,IfcCableSegmentType
+	,IfcDuctSegmentType
+	,IfcPipeSegmentType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowStorageDevice
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowStorageDeviceType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcElectricFlowStorageDeviceType
+	,IfcTankType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowTerminal
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowTerminalType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAirTerminalType
+	,IfcElectricApplianceType
+	,IfcElectricHeaterType
+	,IfcFireSuppressionTerminalType
+	,IfcGasTerminalType
+	,IfcLampType
+	,IfcLightFixtureType
+	,IfcOutletType
+	,IfcSanitaryTerminalType
+	,IfcStackTerminalType
+	,IfcWasteTerminalType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFlowTreatmentDevice
+ SUBTYPE OF (IfcDistributionFlowElement);
+END_ENTITY;
+
+ENTITY IfcFlowTreatmentDeviceType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDuctSilencerType
+	,IfcFilterType))
+ SUBTYPE OF (IfcDistributionFlowElementType);
+END_ENTITY;
+
+ENTITY IfcFluidFlowProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	PropertySource : IfcPropertySourceEnum;
+	FlowConditionTimeSeries : OPTIONAL IfcTimeSeries;
+	VelocityTimeSeries : OPTIONAL IfcTimeSeries;
+	FlowrateTimeSeries : OPTIONAL IfcTimeSeries;
+	Fluid : IfcMaterial;
+	PressureTimeSeries : OPTIONAL IfcTimeSeries;
+	UserDefinedPropertySource : OPTIONAL IfcLabel;
+	TemperatureSingleValue : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	WetBulbTemperatureSingleValue : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	WetBulbTemperatureTimeSeries : OPTIONAL IfcTimeSeries;
+	TemperatureTimeSeries : OPTIONAL IfcTimeSeries;
+	FlowrateSingleValue : OPTIONAL IfcDerivedMeasureValue;
+	FlowConditionSingleValue : OPTIONAL IfcPositiveRatioMeasure;
+	VelocitySingleValue : OPTIONAL IfcLinearVelocityMeasure;
+	PressureSingleValue : OPTIONAL IfcPressureMeasure;
+END_ENTITY;
+
+ENTITY IfcFooting
+ SUBTYPE OF (IfcBuildingElement);
+	PredefinedType : IfcFootingTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcFuelProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	CombustionTemperature : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	CarbonContent : OPTIONAL IfcPositiveRatioMeasure;
+	LowerHeatingValue : OPTIONAL IfcHeatingValueMeasure;
+	HigherHeatingValue : OPTIONAL IfcHeatingValueMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcFurnishingElement
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcFurnishingElementType
+ SUPERTYPE OF (ONEOF
+	(IfcFurnitureType
+	,IfcSystemFurnitureElementType))
+ SUBTYPE OF (IfcElementType);
+END_ENTITY;
+
+ENTITY IfcFurnitureStandard
+ SUBTYPE OF (IfcControl);
+END_ENTITY;
+
+ENTITY IfcFurnitureType
+ SUBTYPE OF (IfcFurnishingElementType);
+	AssemblyPlace : IfcAssemblyPlaceEnum;
+END_ENTITY;
+
+ENTITY IfcGasTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcGasTerminalTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcGasTerminalTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcGasTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcGeneralMaterialProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	MolecularWeight : OPTIONAL IfcMolecularWeightMeasure;
+	Porosity : OPTIONAL IfcNormalisedRatioMeasure;
+	MassDensity : OPTIONAL IfcMassDensityMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcGeneralProfileProperties
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralProfileProperties))
+ SUBTYPE OF (IfcProfileProperties);
+	PhysicalWeight : OPTIONAL IfcMassPerLengthMeasure;
+	Perimeter : OPTIONAL IfcPositiveLengthMeasure;
+	MinimumPlateThickness : OPTIONAL IfcPositiveLengthMeasure;
+	MaximumPlateThickness : OPTIONAL IfcPositiveLengthMeasure;
+	CrossSectionArea : OPTIONAL IfcAreaMeasure;
+ WHERE
+	WR1 : NOT(EXISTS(CrossSectionArea)) OR (CrossSectionArea > 0.);
+END_ENTITY;
+
+ENTITY IfcGeometricCurveSet
+ SUBTYPE OF (IfcGeometricSet);
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcGeometricSet.Elements |
+            'IFC2X3.IFCSURFACE' IN TYPEOF(Temp))) = 0;
+END_ENTITY;
+
+ENTITY IfcGeometricRepresentationContext
+ SUPERTYPE OF (ONEOF
+	(IfcGeometricRepresentationSubContext))
+ SUBTYPE OF (IfcRepresentationContext);
+	CoordinateSpaceDimension : IfcDimensionCount;
+	Precision : OPTIONAL REAL;
+	WorldCoordinateSystem : IfcAxis2Placement;
+	TrueNorth : OPTIONAL IfcDirection;
+ INVERSE
+	HasSubContexts : SET [0:?] OF IfcGeometricRepresentationSubContext FOR ParentContext;
+END_ENTITY;
+
+ENTITY IfcGeometricRepresentationItem
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAnnotationFillArea
+	,IfcAnnotationSurface
+	,IfcBooleanResult
+	,IfcBoundingBox
+	,IfcCartesianTransformationOperator
+	,IfcCompositeCurveSegment
+	,IfcCsgPrimitive3D
+	,IfcCurve
+	,IfcDefinedSymbol
+	,IfcDirection
+	,IfcDraughtingCallout
+	,IfcFaceBasedSurfaceModel
+	,IfcFillAreaStyleHatching
+	,IfcFillAreaStyleTileSymbolWithStyle
+	,IfcFillAreaStyleTiles
+	,IfcGeometricSet
+	,IfcHalfSpaceSolid
+	,IfcLightSource
+	,IfcOneDirectionRepeatFactor
+	,IfcPlacement
+	,IfcPlanarExtent
+	,IfcPoint
+	,IfcSectionedSpine
+	,IfcShellBasedSurfaceModel
+	,IfcSolidModel
+	,IfcSurface
+	,IfcTextLiteral
+	,IfcVector))
+ SUBTYPE OF (IfcRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcGeometricRepresentationSubContext
+ SUBTYPE OF (IfcGeometricRepresentationContext);
+	ParentContext : IfcGeometricRepresentationContext;
+	TargetScale : OPTIONAL IfcPositiveRatioMeasure;
+	TargetView : IfcGeometricProjectionEnum;
+	UserDefinedTargetView : OPTIONAL IfcLabel;
+ DERIVE
+	SELF\IfcGeometricRepresentationContext.WorldCoordinateSystem : IfcAxis2Placement := ParentContext.WorldCoordinateSystem;
+	SELF\IfcGeometricRepresentationContext.CoordinateSpaceDimension : IfcDimensionCount := ParentContext.CoordinateSpaceDimension;
+	SELF\IfcGeometricRepresentationContext.TrueNorth : IfcDirection := NVL(ParentContext.TrueNorth,SELF.WorldCoordinateSystem.P[2]);
+	SELF\IfcGeometricRepresentationContext.Precision : REAL := NVL(ParentContext.Precision,1.E-5);
+ WHERE
+	WR31 : NOT('IFC2X3.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(ParentContext));
+	WR32 : (TargetView <> IfcGeometricProjectionEnum.USERDEFINED) OR 
+             ((TargetView =  IfcGeometricProjectionEnum.USERDEFINED) AND 
+              EXISTS(UserDefinedTargetView));
+END_ENTITY;
+
+ENTITY IfcGeometricSet
+ SUPERTYPE OF (ONEOF
+	(IfcGeometricCurveSet))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Elements : SET [1:?] OF IfcGeometricSetSelect;
+ DERIVE
+	Dim : IfcDimensionCount := Elements[1].Dim;
+ WHERE
+	WR21 : SIZEOF(QUERY(Temp <* Elements |
+               Temp.Dim <> Elements[1].Dim))
+             = 0;
+END_ENTITY;
+
+ENTITY IfcGrid
+ SUBTYPE OF (IfcProduct);
+	UAxes : LIST [1:?] OF UNIQUE IfcGridAxis;
+	VAxes : LIST [1:?] OF UNIQUE IfcGridAxis;
+	WAxes : OPTIONAL LIST [1:?] OF UNIQUE IfcGridAxis;
+ INVERSE
+	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
+ WHERE
+	WR41 : EXISTS(SELF\IfcProduct.ObjectPlacement);
+END_ENTITY;
+
+ENTITY IfcGridAxis;
+	AxisTag : OPTIONAL IfcLabel;
+	AxisCurve : IfcCurve;
+	SameSense : IfcBoolean;
+ INVERSE
+	PartOfW : SET [0:1] OF IfcGrid FOR WAxes;
+	PartOfV : SET [0:1] OF IfcGrid FOR VAxes;
+	PartOfU : SET [0:1] OF IfcGrid FOR UAxes;
+	HasIntersections : SET [0:?] OF IfcVirtualGridIntersection FOR IntersectingAxes;
+ WHERE
+	WR1 : AxisCurve.Dim = 2;
+	WR2 : (SIZEOF(PartOfU) = 1) XOR (SIZEOF(PartOfV) = 1) XOR (SIZEOF(PartOfW) = 1);
+END_ENTITY;
+
+ENTITY IfcGridPlacement
+ SUBTYPE OF (IfcObjectPlacement);
+	PlacementLocation : IfcVirtualGridIntersection;
+	PlacementRefDirection : OPTIONAL IfcVirtualGridIntersection;
+END_ENTITY;
+
+ENTITY IfcGroup
+ SUPERTYPE OF (ONEOF
+	(IfcAsset
+	,IfcCondition
+	,IfcInventory
+	,IfcStructuralLoadGroup
+	,IfcStructuralResultGroup
+	,IfcSystem
+	,IfcZone))
+ SUBTYPE OF (IfcObject);
+ INVERSE
+	IsGroupedBy : IfcRelAssignsToGroup FOR RelatingGroup;
+END_ENTITY;
+
+ENTITY IfcHalfSpaceSolid
+ SUPERTYPE OF (ONEOF
+	(IfcBoxedHalfSpace
+	,IfcPolygonalBoundedHalfSpace))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	BaseSurface : IfcSurface;
+	AgreementFlag : BOOLEAN;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcHeatExchangerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcHeatExchangerTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcHeatExchangerTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcHeatExchangerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcHumidifierType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcHumidifierTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcHumidifierTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcHumidifierTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcHygroscopicMaterialProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	UpperVaporResistanceFactor : OPTIONAL IfcPositiveRatioMeasure;
+	LowerVaporResistanceFactor : OPTIONAL IfcPositiveRatioMeasure;
+	IsothermalMoistureCapacity : OPTIONAL IfcIsothermalMoistureCapacityMeasure;
+	VaporPermeability : OPTIONAL IfcVaporPermeabilityMeasure;
+	MoistureDiffusivity : OPTIONAL IfcMoistureDiffusivityMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcIShapeProfileDef
+ SUPERTYPE OF (ONEOF
+	(IfcAsymmetricIShapeProfileDef))
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	OverallWidth : IfcPositiveLengthMeasure;
+	OverallDepth : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	FlangeThickness : IfcPositiveLengthMeasure;
+	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR1 : FlangeThickness < (OverallDepth / 2.);
+	WR2 : WebThickness < OverallWidth;
+	WR3 : NOT(EXISTS(FilletRadius)) OR
+            ((FilletRadius <= (OverallWidth - WebThickness)/2.) AND 
+             (FilletRadius <= (OverallDepth - (2. * FlangeThickness))/2.));
+END_ENTITY;
+
+ENTITY IfcImageTexture
+ SUBTYPE OF (IfcSurfaceTexture);
+	UrlReference : IfcIdentifier;
+END_ENTITY;
+
+ENTITY IfcInventory
+ SUBTYPE OF (IfcGroup);
+	InventoryType : IfcInventoryTypeEnum;
+	Jurisdiction : IfcActorSelect;
+	ResponsiblePersons : SET [1:?] OF IfcPerson;
+	LastUpdateDate : IfcCalendarDate;
+	CurrentValue : OPTIONAL IfcCostValue;
+	OriginalValue : OPTIONAL IfcCostValue;
+ WHERE
+	WR41 : SIZEOF(QUERY(temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects |
+                 NOT( ('IFC2X3.IFCSPACE' IN TYPEOF (temp)) OR 
+                      ('IFC2X3.IFCASSET' IN TYPEOF (temp)) OR
+                      ('IFC2X3.IFCFURNISHINGELEMENT' IN TYPEOF (temp))
+                 ))) = 0;
+END_ENTITY;
+
+ENTITY IfcIrregularTimeSeries
+ SUBTYPE OF (IfcTimeSeries);
+	Values : LIST [1:?] OF IfcIrregularTimeSeriesValue;
+END_ENTITY;
+
+ENTITY IfcIrregularTimeSeriesValue;
+	TimeStamp : IfcDateTimeSelect;
+	ListValues : LIST [1:?] OF IfcValue;
+END_ENTITY;
+
+ENTITY IfcJunctionBoxType
+ SUBTYPE OF (IfcFlowFittingType);
+	PredefinedType : IfcJunctionBoxTypeEnum;
+END_ENTITY;
+
+ENTITY IfcLShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Depth : IfcPositiveLengthMeasure;
+	Width : OPTIONAL IfcPositiveLengthMeasure;
+	Thickness : IfcPositiveLengthMeasure;
+	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
+	LegSlope : OPTIONAL IfcPlaneAngleMeasure;
+	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
+	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR21 : Thickness < Depth;
+	WR22 : NOT(EXISTS(Width)) OR (Thickness < Width);
+END_ENTITY;
+
+ENTITY IfcLaborResource
+ SUBTYPE OF (IfcConstructionResource);
+	SkillSet : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcLampType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcLampTypeEnum;
+END_ENTITY;
+
+ENTITY IfcLibraryInformation;
+	Name : IfcLabel;
+	Version : OPTIONAL IfcLabel;
+	Publisher : OPTIONAL IfcOrganization;
+	VersionDate : OPTIONAL IfcCalendarDate;
+	LibraryReference : OPTIONAL SET [1:?] OF IfcLibraryReference;
+END_ENTITY;
+
+ENTITY IfcLibraryReference
+ SUBTYPE OF (IfcExternalReference);
+ INVERSE
+	ReferenceIntoLibrary : SET [0:1] OF IfcLibraryInformation FOR LibraryReference;
+END_ENTITY;
+
+ENTITY IfcLightDistributionData;
+	MainPlaneAngle : IfcPlaneAngleMeasure;
+	SecondaryPlaneAngle : LIST [1:?] OF IfcPlaneAngleMeasure;
+	LuminousIntensity : LIST [1:?] OF IfcLuminousIntensityDistributionMeasure;
+END_ENTITY;
+
+ENTITY IfcLightFixtureType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcLightFixtureTypeEnum;
+END_ENTITY;
+
+ENTITY IfcLightIntensityDistribution;
+	LightDistributionCurve : IfcLightDistributionCurveEnum;
+	DistributionData : LIST [1:?] OF IfcLightDistributionData;
+END_ENTITY;
+
+ENTITY IfcLightSource
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcLightSourceAmbient
+	,IfcLightSourceDirectional
+	,IfcLightSourceGoniometric
+	,IfcLightSourcePositional))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Name : OPTIONAL IfcLabel;
+	LightColour : IfcColourRgb;
+	AmbientIntensity : OPTIONAL IfcNormalisedRatioMeasure;
+	Intensity : OPTIONAL IfcNormalisedRatioMeasure;
+END_ENTITY;
+
+ENTITY IfcLightSourceAmbient
+ SUBTYPE OF (IfcLightSource);
+END_ENTITY;
+
+ENTITY IfcLightSourceDirectional
+ SUBTYPE OF (IfcLightSource);
+	Orientation : IfcDirection;
+END_ENTITY;
+
+ENTITY IfcLightSourceGoniometric
+ SUBTYPE OF (IfcLightSource);
+	Position : IfcAxis2Placement3D;
+	ColourAppearance : OPTIONAL IfcColourRgb;
+	ColourTemperature : IfcThermodynamicTemperatureMeasure;
+	LuminousFlux : IfcLuminousFluxMeasure;
+	LightEmissionSource : IfcLightEmissionSourceEnum;
+	LightDistributionDataSource : IfcLightDistributionDataSourceSelect;
+END_ENTITY;
+
+ENTITY IfcLightSourcePositional
+ SUPERTYPE OF (ONEOF
+	(IfcLightSourceSpot))
+ SUBTYPE OF (IfcLightSource);
+	Position : IfcCartesianPoint;
+	Radius : IfcPositiveLengthMeasure;
+	ConstantAttenuation : IfcReal;
+	DistanceAttenuation : IfcReal;
+	QuadricAttenuation : IfcReal;
+END_ENTITY;
+
+ENTITY IfcLightSourceSpot
+ SUBTYPE OF (IfcLightSourcePositional);
+	Orientation : IfcDirection;
+	ConcentrationExponent : OPTIONAL IfcReal;
+	SpreadAngle : IfcPositivePlaneAngleMeasure;
+	BeamWidthAngle : IfcPositivePlaneAngleMeasure;
+END_ENTITY;
+
+ENTITY IfcLine
+ SUBTYPE OF (IfcCurve);
+	Pnt : IfcCartesianPoint;
+	Dir : IfcVector;
+ WHERE
+	WR1 : Dir.Dim = Pnt.Dim;
+END_ENTITY;
+
+ENTITY IfcLinearDimension
+ SUBTYPE OF (IfcDimensionCurveDirectedCallout);
+END_ENTITY;
+
+ENTITY IfcLocalPlacement
+ SUBTYPE OF (IfcObjectPlacement);
+	PlacementRelTo : OPTIONAL IfcObjectPlacement;
+	RelativePlacement : IfcAxis2Placement;
+ WHERE
+	WR21 : IfcCorrectLocalPlacement(RelativePlacement, PlacementRelTo);
+END_ENTITY;
+
+ENTITY IfcLocalTime;
+	HourComponent : IfcHourInDay;
+	MinuteComponent : OPTIONAL IfcMinuteInHour;
+	SecondComponent : OPTIONAL IfcSecondInMinute;
+	Zone : OPTIONAL IfcCoordinatedUniversalTimeOffset;
+	DaylightSavingOffset : OPTIONAL IfcDaylightSavingHour;
+ WHERE
+	WR21 : IfcValidTime (SELF);
+END_ENTITY;
+
+ENTITY IfcLoop
+ SUPERTYPE OF (ONEOF
+	(IfcEdgeLoop
+	,IfcPolyLoop
+	,IfcVertexLoop))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcManifoldSolidBrep
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcFacetedBrep
+	,IfcFacetedBrepWithVoids))
+ SUBTYPE OF (IfcSolidModel);
+	Outer : IfcClosedShell;
+END_ENTITY;
+
+ENTITY IfcMappedItem
+ SUBTYPE OF (IfcRepresentationItem);
+	MappingSource : IfcRepresentationMap;
+	MappingTarget : IfcCartesianTransformationOperator;
+END_ENTITY;
+
+ENTITY IfcMaterial;
+	Name : IfcLabel;
+ INVERSE
+	HasRepresentation : SET [0:1] OF IfcMaterialDefinitionRepresentation FOR RepresentedMaterial;
+	ClassifiedAs : SET [0:1] OF IfcMaterialClassificationRelationship FOR ClassifiedMaterial;
+END_ENTITY;
+
+ENTITY IfcMaterialClassificationRelationship;
+	MaterialClassifications : SET [1:?] OF IfcClassificationNotationSelect;
+	ClassifiedMaterial : IfcMaterial;
+END_ENTITY;
+
+ENTITY IfcMaterialDefinitionRepresentation
+ SUBTYPE OF (IfcProductRepresentation);
+	RepresentedMaterial : IfcMaterial;
+ WHERE
+	WR11 : SIZEOF(QUERY(temp <* Representations | 
+               (NOT('IFC2X3.IFCSTYLEDREPRESENTATION' IN TYPEOF(temp)))
+             )) = 0;
+END_ENTITY;
+
+ENTITY IfcMaterialLayer;
+	Material : OPTIONAL IfcMaterial;
+	LayerThickness : IfcPositiveLengthMeasure;
+	IsVentilated : OPTIONAL IfcLogical;
+ INVERSE
+	ToMaterialLayerSet : IfcMaterialLayerSet FOR MaterialLayers;
+END_ENTITY;
+
+ENTITY IfcMaterialLayerSet;
+	MaterialLayers : LIST [1:?] OF IfcMaterialLayer;
+	LayerSetName : OPTIONAL IfcLabel;
+ DERIVE
+	TotalThickness : IfcLengthMeasure := IfcMlsTotalThickness(SELF);
+END_ENTITY;
+
+ENTITY IfcMaterialLayerSetUsage;
+	ForLayerSet : IfcMaterialLayerSet;
+	LayerSetDirection : IfcLayerSetDirectionEnum;
+	DirectionSense : IfcDirectionSenseEnum;
+	OffsetFromReferenceLine : IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcMaterialList;
+	Materials : LIST [1:?] OF IfcMaterial;
+END_ENTITY;
+
+ENTITY IfcMaterialProperties
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcExtendedMaterialProperties
+	,IfcFuelProperties
+	,IfcGeneralMaterialProperties
+	,IfcHygroscopicMaterialProperties
+	,IfcMechanicalMaterialProperties
+	,IfcOpticalMaterialProperties
+	,IfcProductsOfCombustionProperties
+	,IfcThermalMaterialProperties
+	,IfcWaterProperties));
+	Material : IfcMaterial;
+END_ENTITY;
+
+ENTITY IfcMeasureWithUnit;
+	ValueComponent : IfcValue;
+	UnitComponent : IfcUnit;
+END_ENTITY;
+
+ENTITY IfcMechanicalConcreteMaterialProperties
+ SUBTYPE OF (IfcMechanicalMaterialProperties);
+	CompressiveStrength : OPTIONAL IfcPressureMeasure;
+	MaxAggregateSize : OPTIONAL IfcPositiveLengthMeasure;
+	AdmixturesDescription : OPTIONAL IfcText;
+	Workability : OPTIONAL IfcText;
+	ProtectivePoreRatio : OPTIONAL IfcNormalisedRatioMeasure;
+	WaterImpermeability : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcMechanicalFastener
+ SUBTYPE OF (IfcFastener);
+	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
+	NominalLength : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcMechanicalFastenerType
+ SUBTYPE OF (IfcFastenerType);
+END_ENTITY;
+
+ENTITY IfcMechanicalMaterialProperties
+ SUPERTYPE OF (ONEOF
+	(IfcMechanicalConcreteMaterialProperties
+	,IfcMechanicalSteelMaterialProperties))
+ SUBTYPE OF (IfcMaterialProperties);
+	DynamicViscosity : OPTIONAL IfcDynamicViscosityMeasure;
+	YoungModulus : OPTIONAL IfcModulusOfElasticityMeasure;
+	ShearModulus : OPTIONAL IfcModulusOfElasticityMeasure;
+	PoissonRatio : OPTIONAL IfcPositiveRatioMeasure;
+	ThermalExpansionCoefficient : OPTIONAL IfcThermalExpansionCoefficientMeasure;
+ UNIQUE
+	UR11 : Material;
+ WHERE
+	WR21 : NOT(EXISTS(YoungModulus)) OR (YoungModulus >= 0.0);
+	WR22 : NOT(EXISTS(ShearModulus)) OR (ShearModulus >= 0.0);
+END_ENTITY;
+
+ENTITY IfcMechanicalSteelMaterialProperties
+ SUBTYPE OF (IfcMechanicalMaterialProperties);
+	YieldStress : OPTIONAL IfcPressureMeasure;
+	UltimateStress : OPTIONAL IfcPressureMeasure;
+	UltimateStrain : OPTIONAL IfcPositiveRatioMeasure;
+	HardeningModule : OPTIONAL IfcModulusOfElasticityMeasure;
+	ProportionalStress : OPTIONAL IfcPressureMeasure;
+	PlasticStrain : OPTIONAL IfcPositiveRatioMeasure;
+	Relaxations : OPTIONAL SET [1:?] OF IfcRelaxation;
+ WHERE
+	WR31 : NOT(EXISTS(YieldStress)) OR (YieldStress >= 0.);
+	WR32 : NOT(EXISTS(UltimateStress)) OR (UltimateStress >= 0.);
+	WR33 : NOT(EXISTS(HardeningModule)) OR (HardeningModule >= 0.);
+	WR34 : NOT(EXISTS(ProportionalStress)) OR (ProportionalStress >= 0.);
+END_ENTITY;
+
+ENTITY IfcMember
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcMemberType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcMemberTypeEnum;
+END_ENTITY;
+
+ENTITY IfcMetric
+ SUBTYPE OF (IfcConstraint);
+	Benchmark : IfcBenchmarkEnum;
+	ValueSource : OPTIONAL IfcLabel;
+	DataValue : IfcMetricValueSelect;
+END_ENTITY;
+
+ENTITY IfcMonetaryUnit;
+	Currency : IfcCurrencyEnum;
+END_ENTITY;
+
+ENTITY IfcMotorConnectionType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcMotorConnectionTypeEnum;
+END_ENTITY;
+
+ENTITY IfcMove
+ SUBTYPE OF (IfcTask);
+	MoveFrom : IfcSpatialStructureElement;
+	MoveTo : IfcSpatialStructureElement;
+	PunchList : OPTIONAL LIST [1:?] OF UNIQUE IfcText;
+ WHERE
+	WR1 : SIZEOF(SELF\IfcProcess.OperatesOn) >= 1;
+	WR2 : SIZEOF(QUERY(temp <* OperatesOn |
+              SIZEOF(QUERY(temp2 <* temp.RelatedObjects |
+                ('IFC2X3.IFCACTOR' IN TYPEOF (temp2)) OR
+                ('IFC2X3.IFCEQUIPMENTELEMENT' IN TYPEOF (temp2)) OR
+                ('IFC2X3.IFCFURNISHINGELEMENT' IN TYPEOF (temp2)) )) >=1
+              )) >= 1;
+	WR3 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcNamedUnit
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcContextDependentUnit
+	,IfcConversionBasedUnit
+	,IfcSIUnit));
+	Dimensions : IfcDimensionalExponents;
+	UnitType : IfcUnitEnum;
+ WHERE
+	WR1 : IfcCorrectDimensions (SELF.UnitType, SELF.Dimensions);
+END_ENTITY;
+
+ENTITY IfcObject
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcActor
+	,IfcControl
+	,IfcGroup
+	,IfcProcess
+	,IfcProduct
+	,IfcProject
+	,IfcResource))
+ SUBTYPE OF (IfcObjectDefinition);
+	ObjectType : OPTIONAL IfcLabel;
+ INVERSE
+	IsDefinedBy : SET [0:?] OF IfcRelDefines FOR RelatedObjects;
+ WHERE
+	WR1 : SIZEOF(QUERY(temp <* IsDefinedBy | 'IFC2X3.IFCRELDEFINESBYTYPE' IN TYPEOF(temp))) <= 1;
+END_ENTITY;
+
+ENTITY IfcObjectDefinition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcObject
+	,IfcTypeObject))
+ SUBTYPE OF (IfcRoot);
+ INVERSE
+	HasAssignments : SET [0:?] OF IfcRelAssigns FOR RelatedObjects;
+	IsDecomposedBy : SET [0:?] OF IfcRelDecomposes FOR RelatingObject;
+	Decomposes : SET [0:1] OF IfcRelDecomposes FOR RelatedObjects;
+	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
+END_ENTITY;
+
+ENTITY IfcObjectPlacement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcGridPlacement
+	,IfcLocalPlacement));
+ INVERSE
+	PlacesObject : SET [1:1] OF IfcProduct FOR ObjectPlacement;
+	ReferencedByPlacements : SET [0:?] OF IfcLocalPlacement FOR PlacementRelTo;
+END_ENTITY;
+
+ENTITY IfcObjective
+ SUBTYPE OF (IfcConstraint);
+	BenchmarkValues : OPTIONAL IfcMetric;
+	ResultValues : OPTIONAL IfcMetric;
+	ObjectiveQualifier : IfcObjectiveEnum;
+	UserDefinedQualifier : OPTIONAL IfcLabel;
+ WHERE
+	WR21 : (ObjectiveQualifier <> IfcObjectiveEnum.USERDEFINED) OR
+             ((ObjectiveQualifier = IfcObjectiveEnum.USERDEFINED) AND EXISTS(SELF\IfcObjective.UserDefinedQualifier));
+END_ENTITY;
+
+ENTITY IfcOccupant
+ SUBTYPE OF (IfcActor);
+	PredefinedType : IfcOccupantTypeEnum;
+ WHERE
+	WR31 : NOT(PredefinedType = IfcOccupantTypeEnum.USERDEFINED) 
+             OR EXISTS(SELF\IfcObject.ObjectType);
+END_ENTITY;
+
+ENTITY IfcOffsetCurve2D
+ SUBTYPE OF (IfcCurve);
+	BasisCurve : IfcCurve;
+	Distance : IfcLengthMeasure;
+	SelfIntersect : LOGICAL;
+ WHERE
+	WR1 : BasisCurve.Dim = 2;
+END_ENTITY;
+
+ENTITY IfcOffsetCurve3D
+ SUBTYPE OF (IfcCurve);
+	BasisCurve : IfcCurve;
+	Distance : IfcLengthMeasure;
+	SelfIntersect : LOGICAL;
+	RefDirection : IfcDirection;
+ WHERE
+	WR1 : BasisCurve.Dim = 3;
+END_ENTITY;
+
+ENTITY IfcOneDirectionRepeatFactor
+ SUPERTYPE OF (ONEOF
+	(IfcTwoDirectionRepeatFactor))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	RepeatFactor : IfcVector;
+END_ENTITY;
+
+ENTITY IfcOpenShell
+ SUBTYPE OF (IfcConnectedFaceSet);
+END_ENTITY;
+
+ENTITY IfcOpeningElement
+ SUBTYPE OF (IfcFeatureElementSubtraction);
+ INVERSE
+	HasFillings : SET [0:?] OF IfcRelFillsElement FOR RelatingOpeningElement;
+END_ENTITY;
+
+ENTITY IfcOpticalMaterialProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	VisibleTransmittance : OPTIONAL IfcPositiveRatioMeasure;
+	SolarTransmittance : OPTIONAL IfcPositiveRatioMeasure;
+	ThermalIrTransmittance : OPTIONAL IfcPositiveRatioMeasure;
+	ThermalIrEmissivityBack : OPTIONAL IfcPositiveRatioMeasure;
+	ThermalIrEmissivityFront : OPTIONAL IfcPositiveRatioMeasure;
+	VisibleReflectanceBack : OPTIONAL IfcPositiveRatioMeasure;
+	VisibleReflectanceFront : OPTIONAL IfcPositiveRatioMeasure;
+	SolarReflectanceFront : OPTIONAL IfcPositiveRatioMeasure;
+	SolarReflectanceBack : OPTIONAL IfcPositiveRatioMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcOrderAction
+ SUBTYPE OF (IfcTask);
+	ActionID : IfcIdentifier;
+ UNIQUE
+	UR2 : ActionID;
+END_ENTITY;
+
+ENTITY IfcOrganization;
+	Id : OPTIONAL IfcIdentifier;
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
+	Addresses : OPTIONAL LIST [1:?] OF IfcAddress;
+ INVERSE
+	IsRelatedBy : SET [0:?] OF IfcOrganizationRelationship FOR RelatedOrganizations;
+	Relates : SET [0:?] OF IfcOrganizationRelationship FOR RelatingOrganization;
+	Engages : SET [0:?] OF IfcPersonAndOrganization FOR TheOrganization;
+END_ENTITY;
+
+ENTITY IfcOrganizationRelationship;
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	RelatingOrganization : IfcOrganization;
+	RelatedOrganizations : SET [1:?] OF IfcOrganization;
+END_ENTITY;
+
+ENTITY IfcOrientedEdge
+ SUBTYPE OF (IfcEdge);
+	EdgeElement : IfcEdge;
+	Orientation : BOOLEAN;
+ DERIVE
+	SELF\IfcEdge.EdgeStart : IfcVertex := IfcBooleanChoose 
+                               (Orientation, EdgeElement.EdgeStart, EdgeElement.EdgeEnd);
+	SELF\IfcEdge.EdgeEnd : IfcVertex := IfcBooleanChoose 
+                               (Orientation, EdgeElement.EdgeEnd, EdgeElement.EdgeStart);
+ WHERE
+	WR1 : NOT('IFC2X3.IFCORIENTEDEDGE' IN TYPEOF(EdgeElement));
+END_ENTITY;
+
+ENTITY IfcOutletType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcOutletTypeEnum;
+END_ENTITY;
+
+ENTITY IfcOwnerHistory;
+	OwningUser : IfcPersonAndOrganization;
+	OwningApplication : IfcApplication;
+	State : OPTIONAL IfcStateEnum;
+	ChangeAction : IfcChangeActionEnum;
+	LastModifiedDate : OPTIONAL IfcTimeStamp;
+	LastModifyingUser : OPTIONAL IfcPersonAndOrganization;
+	LastModifyingApplication : OPTIONAL IfcApplication;
+	CreationDate : IfcTimeStamp;
+END_ENTITY;
+
+ENTITY IfcParameterizedProfileDef
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCShapeProfileDef
+	,IfcCircleProfileDef
+	,IfcCraneRailAShapeProfileDef
+	,IfcCraneRailFShapeProfileDef
+	,IfcEllipseProfileDef
+	,IfcIShapeProfileDef
+	,IfcLShapeProfileDef
+	,IfcRectangleProfileDef
+	,IfcTShapeProfileDef
+	,IfcTrapeziumProfileDef
+	,IfcUShapeProfileDef
+	,IfcZShapeProfileDef))
+ SUBTYPE OF (IfcProfileDef);
+	Position : IfcAxis2Placement2D;
+END_ENTITY;
+
+ENTITY IfcPath
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+	EdgeList : LIST [1:?] OF UNIQUE IfcOrientedEdge;
+ WHERE
+	WR1 : IfcPathHeadToTail(SELF);
+END_ENTITY;
+
+ENTITY IfcPerformanceHistory
+ SUBTYPE OF (IfcControl);
+	LifeCyclePhase : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcPermeableCoveringProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	OperationType : IfcPermeableCoveringOperationEnum;
+	PanelPosition : IfcWindowPanelPositionEnum;
+	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
+	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
+	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
+END_ENTITY;
+
+ENTITY IfcPermit
+ SUBTYPE OF (IfcControl);
+	PermitID : IfcIdentifier;
+ UNIQUE
+	UR2 : PermitID;
+END_ENTITY;
+
+ENTITY IfcPerson;
+	Id : OPTIONAL IfcIdentifier;
+	FamilyName : OPTIONAL IfcLabel;
+	GivenName : OPTIONAL IfcLabel;
+	MiddleNames : OPTIONAL LIST [1:?] OF IfcLabel;
+	PrefixTitles : OPTIONAL LIST [1:?] OF IfcLabel;
+	SuffixTitles : OPTIONAL LIST [1:?] OF IfcLabel;
+	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
+	Addresses : OPTIONAL LIST [1:?] OF IfcAddress;
+ INVERSE
+	EngagedIn : SET [0:?] OF IfcPersonAndOrganization FOR ThePerson;
+ WHERE
+	WR1 : EXISTS(FamilyName) OR 
+            EXISTS(GivenName);
+END_ENTITY;
+
+ENTITY IfcPersonAndOrganization;
+	ThePerson : IfcPerson;
+	TheOrganization : IfcOrganization;
+	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
+END_ENTITY;
+
+ENTITY IfcPhysicalComplexQuantity
+ SUBTYPE OF (IfcPhysicalQuantity);
+	HasQuantities : SET [1:?] OF IfcPhysicalQuantity;
+	Discrimination : IfcLabel;
+	Quality : OPTIONAL IfcLabel;
+	Usage : OPTIONAL IfcLabel;
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* HasQuantities | SELF :=: temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcPhysicalQuantity
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPhysicalComplexQuantity
+	,IfcPhysicalSimpleQuantity));
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+ INVERSE
+	PartOfComplex : SET [0:1] OF IfcPhysicalComplexQuantity FOR HasQuantities;
+END_ENTITY;
+
+ENTITY IfcPhysicalSimpleQuantity
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcQuantityArea
+	,IfcQuantityCount
+	,IfcQuantityLength
+	,IfcQuantityTime
+	,IfcQuantityVolume
+	,IfcQuantityWeight))
+ SUBTYPE OF (IfcPhysicalQuantity);
+	Unit : OPTIONAL IfcNamedUnit;
+END_ENTITY;
+
+ENTITY IfcPile
+ SUBTYPE OF (IfcBuildingElement);
+	PredefinedType : IfcPileTypeEnum;
+	ConstructionType : OPTIONAL IfcPileConstructionEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcPipeFittingType
+ SUBTYPE OF (IfcFlowFittingType);
+	PredefinedType : IfcPipeFittingTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcPipeFittingTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcPipeFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcPipeSegmentType
+ SUBTYPE OF (IfcFlowSegmentType);
+	PredefinedType : IfcPipeSegmentTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcPipeSegmentTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcPipeSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcPixelTexture
+ SUBTYPE OF (IfcSurfaceTexture);
+	Width : IfcInteger;
+	Height : IfcInteger;
+	ColourComponents : IfcInteger;
+	Pixel : LIST [1:?] OF BINARY(32);
+ WHERE
+	WR21 : Width >= 1;
+	WR22 : Height >= 1;
+	WR23 : {1 <= ColourComponents <= 4};
+	WR24 : SIZEOF(Pixel) = (Width * Height);
+END_ENTITY;
+
+ENTITY IfcPlacement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAxis1Placement
+	,IfcAxis2Placement2D
+	,IfcAxis2Placement3D))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Location : IfcCartesianPoint;
+ DERIVE
+	Dim : IfcDimensionCount := Location.Dim;
+END_ENTITY;
+
+ENTITY IfcPlanarBox
+ SUBTYPE OF (IfcPlanarExtent);
+	Placement : IfcAxis2Placement;
+END_ENTITY;
+
+ENTITY IfcPlanarExtent
+ SUPERTYPE OF (ONEOF
+	(IfcPlanarBox))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	SizeInX : IfcLengthMeasure;
+	SizeInY : IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcPlane
+ SUBTYPE OF (IfcElementarySurface);
+END_ENTITY;
+
+ENTITY IfcPlate
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcPlateType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcPlateTypeEnum;
+ WHERE
+	WR1 : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations | 'IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp) )) = 1;
+END_ENTITY;
+
+ENTITY IfcPoint
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCartesianPoint
+	,IfcPointOnCurve
+	,IfcPointOnSurface))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcPointOnCurve
+ SUBTYPE OF (IfcPoint);
+	BasisCurve : IfcCurve;
+	PointParameter : IfcParameterValue;
+ DERIVE
+	Dim : IfcDimensionCount := BasisCurve.Dim;
+END_ENTITY;
+
+ENTITY IfcPointOnSurface
+ SUBTYPE OF (IfcPoint);
+	BasisSurface : IfcSurface;
+	PointParameterU : IfcParameterValue;
+	PointParameterV : IfcParameterValue;
+ DERIVE
+	Dim : IfcDimensionCount := BasisSurface.Dim;
+END_ENTITY;
+
+ENTITY IfcPolyLoop
+ SUBTYPE OF (IfcLoop);
+	Polygon : LIST [3:?] OF UNIQUE IfcCartesianPoint;
+ WHERE
+	WR21 : SIZEOF(QUERY(Temp <* Polygon | Temp.Dim <> Polygon[1].Dim)) = 0;
+END_ENTITY;
+
+ENTITY IfcPolygonalBoundedHalfSpace
+ SUBTYPE OF (IfcHalfSpaceSolid);
+	Position : IfcAxis2Placement3D;
+	PolygonalBoundary : IfcBoundedCurve;
+ WHERE
+	WR41 : PolygonalBoundary.Dim = 2;
+	WR42 : SIZEOF(TYPEOF(PolygonalBoundary) * [
+               'IFC2X3.IFCPOLYLINE', 
+               'IFC2X3.IFCCOMPOSITECURVE']
+             ) = 1;
+END_ENTITY;
+
+ENTITY IfcPolyline
+ SUBTYPE OF (IfcBoundedCurve);
+	Points : LIST [2:?] OF IfcCartesianPoint;
+ WHERE
+	WR41 : SIZEOF(QUERY(Temp <* Points | Temp.Dim <> Points[1].Dim)) = 0;
+END_ENTITY;
+
+ENTITY IfcPort
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDistributionPort))
+ SUBTYPE OF (IfcProduct);
+ INVERSE
+	ContainedIn : IfcRelConnectsPortToElement FOR RelatingPort;
+	ConnectedFrom : SET [0:1] OF IfcRelConnectsPorts FOR RelatedPort;
+	ConnectedTo : SET [0:1] OF IfcRelConnectsPorts FOR RelatingPort;
+END_ENTITY;
+
+ENTITY IfcPostalAddress
+ SUBTYPE OF (IfcAddress);
+	InternalLocation : OPTIONAL IfcLabel;
+	AddressLines : OPTIONAL LIST [1:?] OF IfcLabel;
+	PostalBox : OPTIONAL IfcLabel;
+	Town : OPTIONAL IfcLabel;
+	Region : OPTIONAL IfcLabel;
+	PostalCode : OPTIONAL IfcLabel;
+	Country : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : EXISTS (InternalLocation) OR 
+            EXISTS (AddressLines) OR
+            EXISTS (PostalBox) OR
+            EXISTS (PostalCode) OR
+            EXISTS (Town) OR 
+            EXISTS (Region) OR  
+            EXISTS (Country);
+END_ENTITY;
+
+ENTITY IfcPreDefinedColour
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDraughtingPreDefinedColour))
+ SUBTYPE OF (IfcPreDefinedItem);
+END_ENTITY;
+
+ENTITY IfcPreDefinedCurveFont
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDraughtingPreDefinedCurveFont))
+ SUBTYPE OF (IfcPreDefinedItem);
+END_ENTITY;
+
+ENTITY IfcPreDefinedDimensionSymbol
+ SUBTYPE OF (IfcPreDefinedSymbol);
+ WHERE
+	WR31 : SELF\IfcPreDefinedItem.Name IN ['arc length','conical taper','counterbore',
+                  'countersink','depth','diameter','plus minus','radius',
+                  'slope','spherical diameter','spherical radius','square'];
+END_ENTITY;
+
+ENTITY IfcPreDefinedItem
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPreDefinedColour
+	,IfcPreDefinedCurveFont
+	,IfcPreDefinedSymbol
+	,IfcPreDefinedTextFont));
+	Name : IfcLabel;
+END_ENTITY;
+
+ENTITY IfcPreDefinedPointMarkerSymbol
+ SUBTYPE OF (IfcPreDefinedSymbol);
+ WHERE
+	WR31 : SELF\IfcPreDefinedItem.Name IN ['asterisk','circle','dot','plus','square','triangle','x'];
+END_ENTITY;
+
+ENTITY IfcPreDefinedSymbol
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPreDefinedDimensionSymbol
+	,IfcPreDefinedPointMarkerSymbol
+	,IfcPreDefinedTerminatorSymbol))
+ SUBTYPE OF (IfcPreDefinedItem);
+END_ENTITY;
+
+ENTITY IfcPreDefinedTerminatorSymbol
+ SUBTYPE OF (IfcPreDefinedSymbol);
+ WHERE
+	WR31 : SELF\IfcPreDefinedItem.Name IN ['blanked arrow','blanked box',
+                 'blanked dot','dimension origin','filled arrow','filled box',
+                 'filled dot','integral symbol','open arrow','slash','unfilled arrow'];
+END_ENTITY;
+
+ENTITY IfcPreDefinedTextFont
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDraughtingPreDefinedTextFont
+	,IfcTextStyleFontModel))
+ SUBTYPE OF (IfcPreDefinedItem);
+END_ENTITY;
+
+ENTITY IfcPresentationLayerAssignment
+ SUPERTYPE OF (ONEOF
+	(IfcPresentationLayerWithStyle));
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	AssignedItems : SET [1:?] OF IfcLayeredItem;
+	Identifier : OPTIONAL IfcIdentifier;
+END_ENTITY;
+
+ENTITY IfcPresentationLayerWithStyle
+ SUBTYPE OF (IfcPresentationLayerAssignment);
+	LayerOn : LOGICAL;
+	LayerFrozen : LOGICAL;
+	LayerBlocked : LOGICAL;
+	LayerStyles : SET [0:?] OF IfcPresentationStyleSelect;
+END_ENTITY;
+
+ENTITY IfcPresentationStyle
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCurveStyle
+	,IfcFillAreaStyle
+	,IfcSurfaceStyle
+	,IfcSymbolStyle
+	,IfcTextStyle));
+	Name : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcPresentationStyleAssignment;
+	Styles : SET [1:?] OF IfcPresentationStyleSelect;
+END_ENTITY;
+
+ENTITY IfcProcedure
+ SUBTYPE OF (IfcProcess);
+	ProcedureID : IfcIdentifier;
+	ProcedureType : IfcProcedureTypeEnum;
+	UserDefinedProcedureType : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.Decomposes | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
+	WR2 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.IsDecomposedBy | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
+	WR3 : EXISTS(SELF\IfcRoot.Name);
+	WR4 : (ProcedureType <> IfcProcedureTypeEnum.USERDEFINED) OR
+            ((ProcedureType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcProcedure.UserDefinedProcedureType));
+END_ENTITY;
+
+ENTITY IfcProcess
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcProcedure
+	,IfcTask))
+ SUBTYPE OF (IfcObject);
+ INVERSE
+	OperatesOn : SET [0:?] OF IfcRelAssignsToProcess FOR RelatingProcess;
+	IsSuccessorFrom : SET [0:?] OF IfcRelSequence FOR RelatedProcess;
+	IsPredecessorTo : SET [0:?] OF IfcRelSequence FOR RelatingProcess;
+END_ENTITY;
+
+ENTITY IfcProduct
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcAnnotation
+	,IfcElement
+	,IfcGrid
+	,IfcPort
+	,IfcProxy
+	,IfcSpatialStructureElement
+	,IfcStructuralActivity
+	,IfcStructuralItem))
+ SUBTYPE OF (IfcObject);
+	ObjectPlacement : OPTIONAL IfcObjectPlacement;
+	Representation : OPTIONAL IfcProductRepresentation;
+ INVERSE
+	ReferencedBy : SET [0:?] OF IfcRelAssignsToProduct FOR RelatingProduct;
+ WHERE
+	WR1 : (EXISTS(Representation) AND EXISTS(ObjectPlacement))
+                        OR (EXISTS(Representation) AND 
+                           (NOT('IFC2X3.IFCPRODUCTDEFINITIONSHAPE' IN TYPEOF(Representation))))
+                        OR (NOT(EXISTS(Representation)));
+END_ENTITY;
+
+ENTITY IfcProductDefinitionShape
+ SUBTYPE OF (IfcProductRepresentation);
+ INVERSE
+	ShapeOfProduct : SET [1:1] OF IfcProduct FOR Representation;
+	HasShapeAspects : SET [0:?] OF IfcShapeAspect FOR PartOfProductDefinitionShape;
+ WHERE
+	WR11 : SIZEOF(QUERY(temp <* Representations | 
+               (NOT('IFC2X3.IFCSHAPEMODEL' IN TYPEOF(temp)))
+             )) = 0;
+END_ENTITY;
+
+ENTITY IfcProductRepresentation
+ SUPERTYPE OF (ONEOF
+	(IfcMaterialDefinitionRepresentation
+	,IfcProductDefinitionShape));
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	Representations : LIST [1:?] OF IfcRepresentation;
+END_ENTITY;
+
+ENTITY IfcProductsOfCombustionProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	SpecificHeatCapacity : OPTIONAL IfcSpecificHeatCapacityMeasure;
+	N20Content : OPTIONAL IfcPositiveRatioMeasure;
+	COContent : OPTIONAL IfcPositiveRatioMeasure;
+	CO2Content : OPTIONAL IfcPositiveRatioMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcProfileDef
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcArbitraryClosedProfileDef
+	,IfcArbitraryOpenProfileDef
+	,IfcCompositeProfileDef
+	,IfcDerivedProfileDef
+	,IfcParameterizedProfileDef));
+	ProfileType : IfcProfileTypeEnum;
+	ProfileName : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcProfileProperties
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcGeneralProfileProperties
+	,IfcRibPlateProfileProperties));
+	ProfileName : OPTIONAL IfcLabel;
+	ProfileDefinition : OPTIONAL IfcProfileDef;
+END_ENTITY;
+
+ENTITY IfcProject
+ SUBTYPE OF (IfcObject);
+	LongName : OPTIONAL IfcLabel;
+	Phase : OPTIONAL IfcLabel;
+	RepresentationContexts : SET [1:?] OF IfcRepresentationContext;
+	UnitsInContext : IfcUnitAssignment;
+ WHERE
+	WR31 : EXISTS(SELF\IfcRoot.Name);
+	WR32 : SIZEOF(QUERY(Temp <* RepresentationContexts |
+              'IFC2X3.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(Temp)
+             )) = 0;
+	WR33 : SIZEOF(SELF\IfcObjectDefinition.Decomposes) = 0;
+END_ENTITY;
+
+ENTITY IfcProjectOrder
+ SUBTYPE OF (IfcControl);
+	ID : IfcIdentifier;
+	PredefinedType : IfcProjectOrderTypeEnum;
+	Status : OPTIONAL IfcLabel;
+ UNIQUE
+	UR2 : ID;
+END_ENTITY;
+
+ENTITY IfcProjectOrderRecord
+ SUBTYPE OF (IfcControl);
+	Records : LIST [1:?] OF UNIQUE IfcRelAssignsToProjectOrder;
+	PredefinedType : IfcProjectOrderRecordTypeEnum;
+END_ENTITY;
+
+ENTITY IfcProjectionCurve
+ SUBTYPE OF (IfcAnnotationCurveOccurrence);
+END_ENTITY;
+
+ENTITY IfcProjectionElement
+ SUBTYPE OF (IfcFeatureElementAddition);
+END_ENTITY;
+
+ENTITY IfcProperty
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcComplexProperty
+	,IfcSimpleProperty));
+	Name : IfcIdentifier;
+	Description : OPTIONAL IfcText;
+ INVERSE
+	PropertyForDependance : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependingProperty;
+	PropertyDependsOn : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependantProperty;
+	PartOfComplex : SET [0:1] OF IfcComplexProperty FOR HasProperties;
+END_ENTITY;
+
+ENTITY IfcPropertyBoundedValue
+ SUBTYPE OF (IfcSimpleProperty);
+	UpperBoundValue : OPTIONAL IfcValue;
+	LowerBoundValue : OPTIONAL IfcValue;
+	Unit : OPTIONAL IfcUnit;
+ WHERE
+	WR21 : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(LowerBoundValue)) OR
+             (TYPEOF(UpperBoundValue) = TYPEOF(LowerBoundValue));
+	WR22 : EXISTS(UpperBoundValue) OR EXISTS(LowerBoundValue);
+END_ENTITY;
+
+ENTITY IfcPropertyConstraintRelationship;
+	RelatingConstraint : IfcConstraint;
+	RelatedProperties : SET [1:?] OF IfcProperty;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcPropertyDefinition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPropertySetDefinition))
+ SUBTYPE OF (IfcRoot);
+ INVERSE
+	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
+END_ENTITY;
+
+ENTITY IfcPropertyDependencyRelationship;
+	DependingProperty : IfcProperty;
+	DependantProperty : IfcProperty;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	Expression : OPTIONAL IfcText;
+ WHERE
+	WR1 : DependingProperty :<>: DependantProperty;
+END_ENTITY;
+
+ENTITY IfcPropertyEnumeratedValue
+ SUBTYPE OF (IfcSimpleProperty);
+	EnumerationValues : LIST [1:?] OF IfcValue;
+	EnumerationReference : OPTIONAL IfcPropertyEnumeration;
+ WHERE
+	WR1 : NOT(EXISTS(EnumerationReference)) OR 
+               (SIZEOF(QUERY(temp <* EnumerationValues |
+                temp IN EnumerationReference.EnumerationValues))
+                = SIZEOF(EnumerationValues));
+END_ENTITY;
+
+ENTITY IfcPropertyEnumeration;
+	Name : IfcLabel;
+	EnumerationValues : LIST [1:?] OF UNIQUE IfcValue;
+	Unit : OPTIONAL IfcUnit;
+ UNIQUE
+	UR1 : Name;
+ WHERE
+	WR01 : SIZEOF(QUERY(temp <* SELF.EnumerationValues | 
+               NOT(TYPEOF(SELF.EnumerationValues[1]) = TYPEOF(temp))
+               )) = 0;
+END_ENTITY;
+
+ENTITY IfcPropertyListValue
+ SUBTYPE OF (IfcSimpleProperty);
+	ListValues : LIST [1:?] OF IfcValue;
+	Unit : OPTIONAL IfcUnit;
+ WHERE
+	WR31 : SIZEOF(QUERY(temp <* SELF.ListValues | 
+               NOT(TYPEOF(SELF.ListValues[1]) = TYPEOF(temp))
+               )) = 0;
+END_ENTITY;
+
+ENTITY IfcPropertyReferenceValue
+ SUBTYPE OF (IfcSimpleProperty);
+	UsageName : OPTIONAL IfcLabel;
+	PropertyReference : IfcObjectReferenceSelect;
+END_ENTITY;
+
+ENTITY IfcPropertySet
+ SUBTYPE OF (IfcPropertySetDefinition);
+	HasProperties : SET [1:?] OF IfcProperty;
+ WHERE
+	WR31 : EXISTS(SELF\IfcRoot.Name);
+	WR32 : IfcUniquePropertyName(HasProperties);
+END_ENTITY;
+
+ENTITY IfcPropertySetDefinition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcDoorLiningProperties
+	,IfcDoorPanelProperties
+	,IfcElementQuantity
+	,IfcEnergyProperties
+	,IfcFluidFlowProperties
+	,IfcPermeableCoveringProperties
+	,IfcPropertySet
+	,IfcReinforcementDefinitionProperties
+	,IfcServiceLifeFactor
+	,IfcSoundProperties
+	,IfcSoundValue
+	,IfcSpaceThermalLoadProperties
+	,IfcWindowLiningProperties
+	,IfcWindowPanelProperties))
+ SUBTYPE OF (IfcPropertyDefinition);
+ INVERSE
+	PropertyDefinitionOf : SET [0:1] OF IfcRelDefinesByProperties FOR RelatingPropertyDefinition;
+	DefinesType : SET [0:1] OF IfcTypeObject FOR HasPropertySets;
+END_ENTITY;
+
+ENTITY IfcPropertySingleValue
+ SUBTYPE OF (IfcSimpleProperty);
+	NominalValue : OPTIONAL IfcValue;
+	Unit : OPTIONAL IfcUnit;
+END_ENTITY;
+
+ENTITY IfcPropertyTableValue
+ SUBTYPE OF (IfcSimpleProperty);
+	DefiningValues : LIST [1:?] OF UNIQUE IfcValue;
+	DefinedValues : LIST [1:?] OF IfcValue;
+	Expression : OPTIONAL IfcText;
+	DefiningUnit : OPTIONAL IfcUnit;
+	DefinedUnit : OPTIONAL IfcUnit;
+ WHERE
+	WR1 : SIZEOF(DefiningValues) = SIZEOF(DefinedValues);
+	WR2 : SIZEOF(QUERY(temp <* SELF.DefiningValues | TYPEOF(temp) <> TYPEOF(SELF.DefiningValues[1])))=0;
+	WR3 : SIZEOF(QUERY(temp <* SELF.DefinedValues | TYPEOF(temp) <> TYPEOF(SELF.DefinedValues[1])))=0;
+END_ENTITY;
+
+ENTITY IfcProtectiveDeviceType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcProtectiveDeviceTypeEnum;
+END_ENTITY;
+
+ENTITY IfcProxy
+ SUBTYPE OF (IfcProduct);
+	ProxyType : IfcObjectTypeEnum;
+	Tag : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcPumpType
+ SUBTYPE OF (IfcFlowMovingDeviceType);
+	PredefinedType : IfcPumpTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcPumpTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcPumpTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcQuantityArea
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	AreaValue : IfcAreaMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
+                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.AREAUNIT);
+	WR22 : AreaValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcQuantityCount
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	CountValue : IfcCountMeasure;
+ WHERE
+	WR21 : CountValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcQuantityLength
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	LengthValue : IfcLengthMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
+                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.LENGTHUNIT);
+	WR22 : LengthValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcQuantityTime
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	TimeValue : IfcTimeMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
+                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.TIMEUNIT);
+	WR22 : TimeValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcQuantityVolume
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	VolumeValue : IfcVolumeMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
+                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.VOLUMEUNIT);
+	WR22 : VolumeValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcQuantityWeight
+ SUBTYPE OF (IfcPhysicalSimpleQuantity);
+	WeightValue : IfcMassMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
+                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.MASSUNIT);
+	WR22 : WeightValue >= 0.;
+END_ENTITY;
+
+ENTITY IfcRadiusDimension
+ SUBTYPE OF (IfcDimensionCurveDirectedCallout);
+END_ENTITY;
+
+ENTITY IfcRailing
+ SUBTYPE OF (IfcBuildingElement);
+	PredefinedType : OPTIONAL IfcRailingTypeEnum;
+END_ENTITY;
+
+ENTITY IfcRailingType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcRailingTypeEnum;
+END_ENTITY;
+
+ENTITY IfcRamp
+ SUBTYPE OF (IfcBuildingElement);
+	ShapeType : IfcRampTypeEnum;
+ WHERE
+	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
+            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
+END_ENTITY;
+
+ENTITY IfcRampFlight
+ SUBTYPE OF (IfcBuildingElement);
+END_ENTITY;
+
+ENTITY IfcRampFlightType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcRampFlightTypeEnum;
+END_ENTITY;
+
+ENTITY IfcRationalBezierCurve
+ SUBTYPE OF (IfcBezierCurve);
+	WeightsData : LIST [2:?] OF REAL;
+ DERIVE
+	Weights : ARRAY [0:255] OF REAL := IfcListToArray(WeightsData,0,SELF\IfcBSplineCurve.UpperIndexOnControlPoints);
+ WHERE
+	WR1 : SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineCurve.ControlPointsList);
+	WR2 : IfcCurveWeightsPositive(SELF);
+END_ENTITY;
+
+ENTITY IfcRectangleHollowProfileDef
+ SUBTYPE OF (IfcRectangleProfileDef);
+	WallThickness : IfcPositiveLengthMeasure;
+	InnerFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	OuterFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR31 : (WallThickness < (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
+             (WallThickness < (SELF\IfcRectangleProfileDef.YDim/2.));
+	WR32 : NOT(EXISTS(OuterFilletRadius)) OR 
+             ((OuterFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
+              (OuterFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2.)));
+	WR33 : NOT(EXISTS(InnerFilletRadius)) OR 
+             ((InnerFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2. - WallThickness)) AND 
+              (InnerFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2. - WallThickness)));
+END_ENTITY;
+
+ENTITY IfcRectangleProfileDef
+ SUPERTYPE OF (ONEOF
+	(IfcRectangleHollowProfileDef
+	,IfcRoundedRectangleProfileDef))
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	XDim : IfcPositiveLengthMeasure;
+	YDim : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRectangularPyramid
+ SUBTYPE OF (IfcCsgPrimitive3D);
+	XLength : IfcPositiveLengthMeasure;
+	YLength : IfcPositiveLengthMeasure;
+	Height : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRectangularTrimmedSurface
+ SUBTYPE OF (IfcBoundedSurface);
+	BasisSurface : IfcSurface;
+	U1 : IfcParameterValue;
+	V1 : IfcParameterValue;
+	U2 : IfcParameterValue;
+	V2 : IfcParameterValue;
+	Usense : BOOLEAN;
+	Vsense : BOOLEAN;
+ DERIVE
+	Dim : IfcDimensionCount := BasisSurface.Dim;
+ WHERE
+	WR1 : U1 <> U2;
+	WR2 : V1 <> V2;
+	WR3 : (('IFC2X3.IFCELEMENTARYSURFACE' IN TYPEOF(BasisSurface)) AND
+                     (NOT ('IFC2X3.IFCPLANE' IN TYPEOF(BasisSurface)))) OR
+                     ('IFC2X3.IFCSURFACEOFREVOLUTION' IN TYPEOF(BasisSurface)) OR
+                     (Usense = (U2 > U1));
+	WR4 : Vsense = (V2 > V1);
+END_ENTITY;
+
+ENTITY IfcReferencesValueDocument;
+	ReferencedDocument : IfcDocumentSelect;
+	ReferencingValues : SET [1:?] OF IfcAppliedValue;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcRegularTimeSeries
+ SUBTYPE OF (IfcTimeSeries);
+	TimeStep : IfcTimeMeasure;
+	Values : LIST [1:?] OF IfcTimeSeriesValue;
+END_ENTITY;
+
+ENTITY IfcReinforcementBarProperties;
+	TotalCrossSectionArea : IfcAreaMeasure;
+	SteelGrade : IfcLabel;
+	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
+	EffectiveDepth : OPTIONAL IfcLengthMeasure;
+	NominalBarDiameter : OPTIONAL IfcPositiveLengthMeasure;
+	BarCount : OPTIONAL IfcCountMeasure;
+END_ENTITY;
+
+ENTITY IfcReinforcementDefinitionProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	DefinitionType : OPTIONAL IfcLabel;
+	ReinforcementSectionDefinitions : LIST [1:?] OF IfcSectionReinforcementProperties;
+END_ENTITY;
+
+ENTITY IfcReinforcingBar
+ SUBTYPE OF (IfcReinforcingElement);
+	NominalDiameter : IfcPositiveLengthMeasure;
+	CrossSectionArea : IfcAreaMeasure;
+	BarLength : OPTIONAL IfcPositiveLengthMeasure;
+	BarRole : IfcReinforcingBarRoleEnum;
+	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
+ WHERE
+	WR1 : (BarRole <> IfcReinforcingBarRoleEnum.USERDEFINED) OR ((BarRole = IfcReinforcingBarRoleEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcReinforcingElement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcReinforcingBar
+	,IfcReinforcingMesh
+	,IfcTendon
+	,IfcTendonAnchor))
+ SUBTYPE OF (IfcBuildingElementComponent);
+	SteelGrade : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcReinforcingMesh
+ SUBTYPE OF (IfcReinforcingElement);
+	MeshLength : OPTIONAL IfcPositiveLengthMeasure;
+	MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
+	LongitudinalBarNominalDiameter : IfcPositiveLengthMeasure;
+	TransverseBarNominalDiameter : IfcPositiveLengthMeasure;
+	LongitudinalBarCrossSectionArea : IfcAreaMeasure;
+	TransverseBarCrossSectionArea : IfcAreaMeasure;
+	LongitudinalBarSpacing : IfcPositiveLengthMeasure;
+	TransverseBarSpacing : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRelAggregates
+ SUBTYPE OF (IfcRelDecomposes);
+END_ENTITY;
+
+ENTITY IfcRelAssigns
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcRelAssignsToActor
+	,IfcRelAssignsToControl
+	,IfcRelAssignsToGroup
+	,IfcRelAssignsToProcess
+	,IfcRelAssignsToProduct
+	,IfcRelAssignsToResource))
+ SUBTYPE OF (IfcRelationship);
+	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
+	RelatedObjectsType : OPTIONAL IfcObjectTypeEnum;
+ WHERE
+	WR1 : IfcCorrectObjectAssignment(RelatedObjectsType, RelatedObjects);
+END_ENTITY;
+
+ENTITY IfcRelAssignsTasks
+ SUBTYPE OF (IfcRelAssignsToControl);
+	TimeForTask : OPTIONAL IfcScheduleTimeControl;
+ WHERE
+	WR1 : HIINDEX(SELF\IfcRelAssigns.RelatedObjects) = 1;
+	WR2 : 'IFC2X3.IFCTASK' IN TYPEOF(SELF\IfcRelAssigns.RelatedObjects[1]);
+	WR3 : 'IFC2X3.IFCWORKCONTROL' IN TYPEOF(SELF\IfcRelAssignsToControl.RelatingControl);
+END_ENTITY;
+
+ENTITY IfcRelAssignsToActor
+ SUPERTYPE OF (ONEOF
+	(IfcRelOccupiesSpaces))
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingActor : IfcActor;
+	ActingRole : OPTIONAL IfcActorRole;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingActor :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssignsToControl
+ SUPERTYPE OF (ONEOF
+	(IfcRelAssignsTasks
+	,IfcRelAssignsToProjectOrder
+	,IfcRelSchedulesCostItems))
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingControl : IfcControl;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingControl :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssignsToGroup
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingGroup : IfcGroup;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingGroup :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssignsToProcess
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingProcess : IfcProcess;
+	QuantityInProcess : OPTIONAL IfcMeasureWithUnit;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProcess :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssignsToProduct
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingProduct : IfcProduct;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProduct :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssignsToProjectOrder
+ SUBTYPE OF (IfcRelAssignsToControl);
+END_ENTITY;
+
+ENTITY IfcRelAssignsToResource
+ SUBTYPE OF (IfcRelAssigns);
+	RelatingResource : IfcResource;
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingResource :=: Temp)) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssociates
+ SUPERTYPE OF (ONEOF
+	(IfcRelAssociatesAppliedValue
+	,IfcRelAssociatesApproval
+	,IfcRelAssociatesClassification
+	,IfcRelAssociatesConstraint
+	,IfcRelAssociatesDocument
+	,IfcRelAssociatesLibrary
+	,IfcRelAssociatesMaterial
+	,IfcRelAssociatesProfileProperties))
+ SUBTYPE OF (IfcRelationship);
+	RelatedObjects : SET [1:?] OF IfcRoot;
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* RelatedObjects |
+              NOT(('IFC2X3.IFCOBJECTDEFINITION' IN TYPEOF(temp)) 
+               OR ('IFC2X3.IFCPROPERTYDEFINITION' IN TYPEOF(temp)))
+              )) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesAppliedValue
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingAppliedValue : IfcAppliedValue;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesApproval
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingApproval : IfcApproval;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesClassification
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingClassification : IfcClassificationNotationSelect;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesConstraint
+ SUBTYPE OF (IfcRelAssociates);
+	Intent : IfcLabel;
+	RelatingConstraint : IfcConstraint;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesDocument
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingDocument : IfcDocumentSelect;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesLibrary
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingLibrary : IfcLibrarySelect;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesMaterial
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingMaterial : IfcMaterialSelect;
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | 
+             ('IFC2X3.IFCFEATUREELEMENTSUBTRACTION' IN TYPEOF(temp))
+               OR ('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(temp))
+             )) = 0;
+	WR22 : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | 
+             (NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp)) AND NOT('IFC2X3.IFCTYPEPRODUCT' IN TYPEOF(temp)))
+             )) = 0;
+END_ENTITY;
+
+ENTITY IfcRelAssociatesProfileProperties
+ SUBTYPE OF (IfcRelAssociates);
+	RelatingProfileProperties : IfcProfileProperties;
+	ProfileSectionLocation : OPTIONAL IfcShapeAspect;
+	ProfileOrientation : OPTIONAL IfcOrientationSelect;
+END_ENTITY;
+
+ENTITY IfcRelConnects
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcRelConnectsElements
+	,IfcRelConnectsPortToElement
+	,IfcRelConnectsPorts
+	,IfcRelConnectsStructuralActivity
+	,IfcRelConnectsStructuralElement
+	,IfcRelConnectsStructuralMember
+	,IfcRelContainedInSpatialStructure
+	,IfcRelCoversBldgElements
+	,IfcRelCoversSpaces
+	,IfcRelFillsElement
+	,IfcRelFlowControlElements
+	,IfcRelInteractionRequirements
+	,IfcRelProjectsElement
+	,IfcRelReferencedInSpatialStructure
+	,IfcRelSequence
+	,IfcRelServicesBuildings
+	,IfcRelSpaceBoundary
+	,IfcRelVoidsElement))
+ SUBTYPE OF (IfcRelationship);
+END_ENTITY;
+
+ENTITY IfcRelConnectsElements
+ SUPERTYPE OF (ONEOF
+	(IfcRelConnectsPathElements
+	,IfcRelConnectsWithRealizingElements))
+ SUBTYPE OF (IfcRelConnects);
+	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
+	RelatingElement : IfcElement;
+	RelatedElement : IfcElement;
+ WHERE
+	WR31 : RelatingElement :<>: RelatedElement;
+END_ENTITY;
+
+ENTITY IfcRelConnectsPathElements
+ SUBTYPE OF (IfcRelConnectsElements);
+	RelatingPriorities : LIST [0:?] OF INTEGER;
+	RelatedPriorities : LIST [0:?] OF INTEGER;
+	RelatedConnectionType : IfcConnectionTypeEnum;
+	RelatingConnectionType : IfcConnectionTypeEnum;
+ DERIVE
+	RelatedLayerCount : INTEGER := IfcNoOfLayers(SELF\IfcRelConnectsElements.RelatedElement);
+	RelatingLayerCount : INTEGER := IfcNoOfLayers(SELF\IfcRelConnectsElements.RelatingElement);
+END_ENTITY;
+
+ENTITY IfcRelConnectsPortToElement
+ SUBTYPE OF (IfcRelConnects);
+	RelatingPort : IfcPort;
+	RelatedElement : IfcElement;
+END_ENTITY;
+
+ENTITY IfcRelConnectsPorts
+ SUBTYPE OF (IfcRelConnects);
+	RelatingPort : IfcPort;
+	RelatedPort : IfcPort;
+	RealizingElement : OPTIONAL IfcElement;
+END_ENTITY;
+
+ENTITY IfcRelConnectsStructuralActivity
+ SUBTYPE OF (IfcRelConnects);
+	RelatingElement : IfcStructuralActivityAssignmentSelect;
+	RelatedStructuralActivity : IfcStructuralActivity;
+END_ENTITY;
+
+ENTITY IfcRelConnectsStructuralElement
+ SUBTYPE OF (IfcRelConnects);
+	RelatingElement : IfcElement;
+	RelatedStructuralMember : IfcStructuralMember;
+END_ENTITY;
+
+ENTITY IfcRelConnectsStructuralMember
+ SUPERTYPE OF (ONEOF
+	(IfcRelConnectsWithEccentricity))
+ SUBTYPE OF (IfcRelConnects);
+	RelatingStructuralMember : IfcStructuralMember;
+	RelatedStructuralConnection : IfcStructuralConnection;
+	AppliedCondition : OPTIONAL IfcBoundaryCondition;
+	AdditionalConditions : OPTIONAL IfcStructuralConnectionCondition;
+	SupportedLength : OPTIONAL IfcLengthMeasure;
+	ConditionCoordinateSystem : OPTIONAL IfcAxis2Placement3D;
+END_ENTITY;
+
+ENTITY IfcRelConnectsWithEccentricity
+ SUBTYPE OF (IfcRelConnectsStructuralMember);
+	ConnectionConstraint : IfcConnectionGeometry;
+END_ENTITY;
+
+ENTITY IfcRelConnectsWithRealizingElements
+ SUBTYPE OF (IfcRelConnectsElements);
+	RealizingElements : SET [1:?] OF IfcElement;
+	ConnectionType : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcRelContainedInSpatialStructure
+ SUBTYPE OF (IfcRelConnects);
+	RelatedElements : SET [1:?] OF IfcProduct;
+	RelatingStructure : IfcSpatialStructureElement;
+ WHERE
+	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF(temp))) = 0;
+END_ENTITY;
+
+ENTITY IfcRelCoversBldgElements
+ SUBTYPE OF (IfcRelConnects);
+	RelatingBuildingElement : IfcElement;
+	RelatedCoverings : SET [1:?] OF IfcCovering;
+END_ENTITY;
+
+ENTITY IfcRelCoversSpaces
+ SUBTYPE OF (IfcRelConnects);
+	RelatedSpace : IfcSpace;
+	RelatedCoverings : SET [1:?] OF IfcCovering;
+END_ENTITY;
+
+ENTITY IfcRelDecomposes
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcRelAggregates
+	,IfcRelNests))
+ SUBTYPE OF (IfcRelationship);
+	RelatingObject : IfcObjectDefinition;
+	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
+ WHERE
+	WR31 : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
+	WR32 : SIZEOF(QUERY(Temp <* RelatedObjects | 'IFC2X3.IFCTYPEOBJECT' IN TYPEOF(temp))) = 0;
+	WR33 : NOT('IFC2X3.IFCTYPEOBJECT' IN TYPEOF(RelatingObject));
+END_ENTITY;
+
+ENTITY IfcRelDefines
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcRelDefinesByProperties
+	,IfcRelDefinesByType))
+ SUBTYPE OF (IfcRelationship);
+	RelatedObjects : SET [1:?] OF IfcObject;
+END_ENTITY;
+
+ENTITY IfcRelDefinesByProperties
+ SUPERTYPE OF (ONEOF
+	(IfcRelOverridesProperties))
+ SUBTYPE OF (IfcRelDefines);
+	RelatingPropertyDefinition : IfcPropertySetDefinition;
+END_ENTITY;
+
+ENTITY IfcRelDefinesByType
+ SUBTYPE OF (IfcRelDefines);
+	RelatingType : IfcTypeObject;
+END_ENTITY;
+
+ENTITY IfcRelFillsElement
+ SUBTYPE OF (IfcRelConnects);
+	RelatingOpeningElement : IfcOpeningElement;
+	RelatedBuildingElement : IfcElement;
+END_ENTITY;
+
+ENTITY IfcRelFlowControlElements
+ SUBTYPE OF (IfcRelConnects);
+	RelatedControlElements : SET [1:?] OF IfcDistributionControlElement;
+	RelatingFlowElement : IfcDistributionFlowElement;
+END_ENTITY;
+
+ENTITY IfcRelInteractionRequirements
+ SUBTYPE OF (IfcRelConnects);
+	DailyInteraction : OPTIONAL IfcCountMeasure;
+	ImportanceRating : OPTIONAL IfcNormalisedRatioMeasure;
+	LocationOfInteraction : OPTIONAL IfcSpatialStructureElement;
+	RelatedSpaceProgram : IfcSpaceProgram;
+	RelatingSpaceProgram : IfcSpaceProgram;
+END_ENTITY;
+
+ENTITY IfcRelNests
+ SUBTYPE OF (IfcRelDecomposes);
+ WHERE
+	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelDecomposes.RelatedObjects | 
+              NOT(TYPEOF(SELF\IfcRelDecomposes.RelatingObject) = TYPEOF(Temp)))) = 0;
+END_ENTITY;
+
+ENTITY IfcRelOccupiesSpaces
+ SUBTYPE OF (IfcRelAssignsToActor);
+END_ENTITY;
+
+ENTITY IfcRelOverridesProperties
+ SUBTYPE OF (IfcRelDefinesByProperties);
+	OverridingProperties : SET [1:?] OF IfcProperty;
+ WHERE
+	WR1 : SIZEOF(SELF\IfcRelDefines.RelatedObjects) = 1;
+END_ENTITY;
+
+ENTITY IfcRelProjectsElement
+ SUBTYPE OF (IfcRelConnects);
+	RelatingElement : IfcElement;
+	RelatedFeatureElement : IfcFeatureElementAddition;
+END_ENTITY;
+
+ENTITY IfcRelReferencedInSpatialStructure
+ SUBTYPE OF (IfcRelConnects);
+	RelatedElements : SET [1:?] OF IfcProduct;
+	RelatingStructure : IfcSpatialStructureElement;
+ WHERE
+	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF(temp))) = 0;
+END_ENTITY;
+
+ENTITY IfcRelSchedulesCostItems
+ SUBTYPE OF (IfcRelAssignsToControl);
+ WHERE
+	WR11 : SIZEOF(QUERY(temp <* SELF\IfcRelAssigns.RelatedObjects |
+               NOT('IFC2X3.IFCCOSTITEM' IN TYPEOF(temp))
+               )) = 0;
+	WR12 : 'IFC2X3.IFCCOSTSCHEDULE' IN TYPEOF (SELF\IfcRelAssignsToControl.RelatingControl);
+END_ENTITY;
+
+ENTITY IfcRelSequence
+ SUBTYPE OF (IfcRelConnects);
+	RelatingProcess : IfcProcess;
+	RelatedProcess : IfcProcess;
+	TimeLag : IfcTimeMeasure;
+	SequenceType : IfcSequenceEnum;
+ WHERE
+	WR1 : RelatingProcess :<>: RelatedProcess;
+END_ENTITY;
+
+ENTITY IfcRelServicesBuildings
+ SUBTYPE OF (IfcRelConnects);
+	RelatingSystem : IfcSystem;
+	RelatedBuildings : SET [1:?] OF IfcSpatialStructureElement;
+END_ENTITY;
+
+ENTITY IfcRelSpaceBoundary
+ SUBTYPE OF (IfcRelConnects);
+	RelatingSpace : IfcSpace;
+	RelatedBuildingElement : OPTIONAL IfcElement;
+	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
+	PhysicalOrVirtualBoundary : IfcPhysicalOrVirtualEnum;
+	InternalOrExternalBoundary : IfcInternalOrExternalEnum;
+ WHERE
+	WR1 : ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Physical) AND 
+              (EXISTS(RelatedBuildingElement) AND NOT('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
+            OR 
+            ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Virtual) AND 
+              (NOT(EXISTS(RelatedBuildingElement)) OR ('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
+            OR 
+             (PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.NotDefined);
+END_ENTITY;
+
+ENTITY IfcRelVoidsElement
+ SUBTYPE OF (IfcRelConnects);
+	RelatingBuildingElement : IfcElement;
+	RelatedOpeningElement : IfcFeatureElementSubtraction;
+END_ENTITY;
+
+ENTITY IfcRelationship
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcRelAssigns
+	,IfcRelAssociates
+	,IfcRelConnects
+	,IfcRelDecomposes
+	,IfcRelDefines))
+ SUBTYPE OF (IfcRoot);
+END_ENTITY;
+
+ENTITY IfcRelaxation;
+	RelaxationValue : IfcNormalisedRatioMeasure;
+	InitialStress : IfcNormalisedRatioMeasure;
+END_ENTITY;
+
+ENTITY IfcRepresentation
+ SUPERTYPE OF (ONEOF
+	(IfcShapeModel
+	,IfcStyleModel));
+	ContextOfItems : IfcRepresentationContext;
+	RepresentationIdentifier : OPTIONAL IfcLabel;
+	RepresentationType : OPTIONAL IfcLabel;
+	Items : SET [1:?] OF IfcRepresentationItem;
+ INVERSE
+	RepresentationMap : SET [0:1] OF IfcRepresentationMap FOR MappedRepresentation;
+	LayerAssignments : SET [0:?] OF IfcPresentationLayerAssignment FOR Assigneditems;
+	OfProductRepresentation : SET [0:1] OF IfcProductRepresentation FOR Representations;
+END_ENTITY;
+
+ENTITY IfcRepresentationContext
+ SUPERTYPE OF (ONEOF
+	(IfcGeometricRepresentationContext));
+	ContextIdentifier : OPTIONAL IfcLabel;
+	ContextType : OPTIONAL IfcLabel;
+ INVERSE
+	RepresentationsInContext : SET [0:?] OF IfcRepresentation FOR ContextOfItems;
+END_ENTITY;
+
+ENTITY IfcRepresentationItem
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcGeometricRepresentationItem
+	,IfcMappedItem
+	,IfcStyledItem
+	,IfcTopologicalRepresentationItem));
+ INVERSE
+	LayerAssignments : SET [0:?] OF IfcPresentationLayerAssignment FOR AssignedItems;
+	StyledByItem : SET [0:1] OF IfcStyledItem FOR Item;
+END_ENTITY;
+
+ENTITY IfcRepresentationMap;
+	MappingOrigin : IfcAxis2Placement;
+	MappedRepresentation : IfcRepresentation;
+ INVERSE
+	MapUsage : SET [0:?] OF IfcMappedItem FOR MappingSource;
+END_ENTITY;
+
+ENTITY IfcResource
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcConstructionResource))
+ SUBTYPE OF (IfcObject);
+ INVERSE
+	ResourceOf : SET [0:?] OF IfcRelAssignsToResource FOR RelatingResource;
+END_ENTITY;
+
+ENTITY IfcRevolvedAreaSolid
+ SUBTYPE OF (IfcSweptAreaSolid);
+	Axis : IfcAxis1Placement;
+	Angle : IfcPlaneAngleMeasure;
+ DERIVE
+	AxisLine : IfcLine := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcCurve() || IfcLine(Axis.Location, 
+                   IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Axis.Z,1.0));
+ WHERE
+	WR31 : Axis.Location.Coordinates[3] = 0.0;
+	WR32 : Axis.Z.DirectionRatios[3] = 0.0;
+END_ENTITY;
+
+ENTITY IfcRibPlateProfileProperties
+ SUBTYPE OF (IfcProfileProperties);
+	Thickness : OPTIONAL IfcPositiveLengthMeasure;
+	RibHeight : OPTIONAL IfcPositiveLengthMeasure;
+	RibWidth : OPTIONAL IfcPositiveLengthMeasure;
+	RibSpacing : OPTIONAL IfcPositiveLengthMeasure;
+	Direction : IfcRibPlateDirectionEnum;
+END_ENTITY;
+
+ENTITY IfcRightCircularCone
+ SUBTYPE OF (IfcCsgPrimitive3D);
+	Height : IfcPositiveLengthMeasure;
+	BottomRadius : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRightCircularCylinder
+ SUBTYPE OF (IfcCsgPrimitive3D);
+	Height : IfcPositiveLengthMeasure;
+	Radius : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRoof
+ SUBTYPE OF (IfcBuildingElement);
+	ShapeType : IfcRoofTypeEnum;
+ WHERE
+	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
+            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
+END_ENTITY;
+
+ENTITY IfcRoot
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcObjectDefinition
+	,IfcPropertyDefinition
+	,IfcRelationship));
+	GlobalId : IfcGloballyUniqueId;
+	OwnerHistory : IfcOwnerHistory;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+ UNIQUE
+	UR1 : GlobalId;
+END_ENTITY;
+
+ENTITY IfcRoundedEdgeFeature
+ SUBTYPE OF (IfcEdgeFeature);
+	Radius : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcRoundedRectangleProfileDef
+ SUBTYPE OF (IfcRectangleProfileDef);
+	RoundingRadius : IfcPositiveLengthMeasure;
+ WHERE
+	WR31 : ((RoundingRadius <= (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
+              (RoundingRadius <= (SELF\IfcRectangleProfileDef.YDim/2.)));
+END_ENTITY;
+
+ENTITY IfcSIUnit
+ SUBTYPE OF (IfcNamedUnit);
+	Prefix : OPTIONAL IfcSIPrefix;
+	Name : IfcSIUnitName;
+ DERIVE
+	SELF\IfcNamedUnit.Dimensions : IfcDimensionalExponents := IfcDimensionsForSiUnit (SELF.Name);
+END_ENTITY;
+
+ENTITY IfcSanitaryTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcSanitaryTerminalTypeEnum;
+END_ENTITY;
+
+ENTITY IfcScheduleTimeControl
+ SUBTYPE OF (IfcControl);
+	ActualStart : OPTIONAL IfcDateTimeSelect;
+	EarlyStart : OPTIONAL IfcDateTimeSelect;
+	LateStart : OPTIONAL IfcDateTimeSelect;
+	ScheduleStart : OPTIONAL IfcDateTimeSelect;
+	ActualFinish : OPTIONAL IfcDateTimeSelect;
+	EarlyFinish : OPTIONAL IfcDateTimeSelect;
+	LateFinish : OPTIONAL IfcDateTimeSelect;
+	ScheduleFinish : OPTIONAL IfcDateTimeSelect;
+	ScheduleDuration : OPTIONAL IfcTimeMeasure;
+	ActualDuration : OPTIONAL IfcTimeMeasure;
+	RemainingTime : OPTIONAL IfcTimeMeasure;
+	FreeFloat : OPTIONAL IfcTimeMeasure;
+	TotalFloat : OPTIONAL IfcTimeMeasure;
+	IsCritical : OPTIONAL BOOLEAN;
+	StatusTime : OPTIONAL IfcDateTimeSelect;
+	StartFloat : OPTIONAL IfcTimeMeasure;
+	FinishFloat : OPTIONAL IfcTimeMeasure;
+	Completion : OPTIONAL IfcPositiveRatioMeasure;
+ INVERSE
+	ScheduleTimeControlAssigned : IfcRelAssignsTasks FOR TimeForTask;
+END_ENTITY;
+
+ENTITY IfcSectionProperties;
+	SectionType : IfcSectionTypeEnum;
+	StartProfile : IfcProfileDef;
+	EndProfile : OPTIONAL IfcProfileDef;
+END_ENTITY;
+
+ENTITY IfcSectionReinforcementProperties;
+	LongitudinalStartPosition : IfcLengthMeasure;
+	LongitudinalEndPosition : IfcLengthMeasure;
+	TransversePosition : OPTIONAL IfcLengthMeasure;
+	ReinforcementRole : IfcReinforcingBarRoleEnum;
+	SectionDefinition : IfcSectionProperties;
+	CrossSectionReinforcementDefinitions : SET [1:?] OF IfcReinforcementBarProperties;
+END_ENTITY;
+
+ENTITY IfcSectionedSpine
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	SpineCurve : IfcCompositeCurve;
+	CrossSections : LIST [2:?] OF IfcProfileDef;
+	CrossSectionPositions : LIST [2:?] OF IfcAxis2Placement3D;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+ WHERE
+	WR1 : SIZEOF(CrossSections) = SIZEOF(CrossSectionPositions);
+	WR2 : SIZEOF(QUERY(temp <* CrossSections | CrossSections[1].ProfileType <> temp.ProfileType)) = 0;
+	WR3 : SpineCurve.Dim = 3;
+END_ENTITY;
+
+ENTITY IfcSensorType
+ SUBTYPE OF (IfcDistributionControlElementType);
+	PredefinedType : IfcSensorTypeEnum;
+END_ENTITY;
+
+ENTITY IfcServiceLife
+ SUBTYPE OF (IfcControl);
+	ServiceLifeType : IfcServiceLifeTypeEnum;
+	ServiceLifeDuration : IfcTimeMeasure;
+END_ENTITY;
+
+ENTITY IfcServiceLifeFactor
+ SUBTYPE OF (IfcPropertySetDefinition);
+	PredefinedType : IfcServiceLifeFactorTypeEnum;
+	UpperValue : OPTIONAL IfcMeasureValue;
+	MostUsedValue : IfcMeasureValue;
+	LowerValue : OPTIONAL IfcMeasureValue;
+ WHERE
+	WR31 : NOT(PredefinedType = IfcServiceLifeFactorTypeEnum.USERDEFINED)
+             OR EXISTS(SELF\IfcObject.ObjectType);
+END_ENTITY;
+
+ENTITY IfcShapeAspect;
+	ShapeRepresentations : LIST [1:?] OF IfcShapeModel;
+	Name : OPTIONAL IfcLabel;
+	Description : OPTIONAL IfcText;
+	ProductDefinitional : LOGICAL;
+	PartOfProductDefinitionShape : IfcProductDefinitionShape;
+END_ENTITY;
+
+ENTITY IfcShapeModel
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcShapeRepresentation
+	,IfcTopologyRepresentation))
+ SUBTYPE OF (IfcRepresentation);
+ INVERSE
+	OfShapeAspect : SET [0:1] OF IfcShapeAspect FOR ShapeRepresentations;
+ WHERE
+	WR11 : (SIZEOF(SELF\IfcRepresentation.OfProductRepresentation) = 1) XOR 
+             (SIZEOF(SELF\IfcRepresentation.RepresentationMap) = 1) XOR
+             (SIZEOF(OfShapeAspect) = 1);
+END_ENTITY;
+
+ENTITY IfcShapeRepresentation
+ SUBTYPE OF (IfcShapeModel);
+ WHERE
+	WR21 : 'IFC2X3.IFCGEOMETRICREPRESENTATIONCONTEXT' 
+             IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
+	WR22 : SIZEOF(QUERY(temp <* Items | 
+               ('IFC2X3.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
+                 AND (NOT(SIZEOF(
+                   ['IFC2X3.IFCVERTEXPOINT',
+                    'IFC2X3.IFCEDGECURVE',
+                    'IFC2X3.IFCFACESURFACE'] * TYPEOF(temp)) = 1))
+             )) = 0;
+	WR23 : EXISTS(SELF\IfcRepresentation.RepresentationType);
+	WR24 : IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
+END_ENTITY;
+
+ENTITY IfcShellBasedSurfaceModel
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	SbsmBoundary : SET [1:?] OF IfcShell;
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcSimpleProperty
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcPropertyBoundedValue
+	,IfcPropertyEnumeratedValue
+	,IfcPropertyListValue
+	,IfcPropertyReferenceValue
+	,IfcPropertySingleValue
+	,IfcPropertyTableValue))
+ SUBTYPE OF (IfcProperty);
+END_ENTITY;
+
+ENTITY IfcSite
+ SUBTYPE OF (IfcSpatialStructureElement);
+	RefLatitude : OPTIONAL IfcCompoundPlaneAngleMeasure;
+	RefLongitude : OPTIONAL IfcCompoundPlaneAngleMeasure;
+	RefElevation : OPTIONAL IfcLengthMeasure;
+	LandTitleNumber : OPTIONAL IfcLabel;
+	SiteAddress : OPTIONAL IfcPostalAddress;
+END_ENTITY;
+
+ENTITY IfcSlab
+ SUBTYPE OF (IfcBuildingElement);
+	PredefinedType : OPTIONAL IfcSlabTypeEnum;
+ WHERE
+	WR2 : (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcSlabType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcSlabTypeEnum;
+END_ENTITY;
+
+ENTITY IfcSlippageConnectionCondition
+ SUBTYPE OF (IfcStructuralConnectionCondition);
+	SlippageX : OPTIONAL IfcLengthMeasure;
+	SlippageY : OPTIONAL IfcLengthMeasure;
+	SlippageZ : OPTIONAL IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcSolidModel
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcCsgSolid
+	,IfcManifoldSolidBrep
+	,IfcSweptAreaSolid
+	,IfcSweptDiskSolid))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+ DERIVE
+	Dim : IfcDimensionCount := 3;
+END_ENTITY;
+
+ENTITY IfcSoundProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	IsAttenuating : IfcBoolean;
+	SoundScale : OPTIONAL IfcSoundScaleEnum;
+	SoundValues : LIST [1:8] OF IfcSoundValue;
+END_ENTITY;
+
+ENTITY IfcSoundValue
+ SUBTYPE OF (IfcPropertySetDefinition);
+	SoundLevelTimeSeries : OPTIONAL IfcTimeSeries;
+	Frequency : IfcFrequencyMeasure;
+	SoundLevelSingleValue : OPTIONAL IfcDerivedMeasureValue;
+END_ENTITY;
+
+ENTITY IfcSpace
+ SUBTYPE OF (IfcSpatialStructureElement);
+	InteriorOrExteriorSpace : IfcInternalOrExternalEnum;
+	ElevationWithFlooring : OPTIONAL IfcLengthMeasure;
+ INVERSE
+	HasCoverings : SET [0:?] OF IfcRelCoversSpaces FOR RelatedSpace;
+	BoundedBy : SET [0:?] OF IfcRelSpaceBoundary FOR RelatingSpace;
+END_ENTITY;
+
+ENTITY IfcSpaceHeaterType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcSpaceHeaterTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcSpaceHeaterTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcSpaceHeaterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcSpaceProgram
+ SUBTYPE OF (IfcControl);
+	SpaceProgramIdentifier : IfcIdentifier;
+	MaxRequiredArea : OPTIONAL IfcAreaMeasure;
+	MinRequiredArea : OPTIONAL IfcAreaMeasure;
+	RequestedLocation : OPTIONAL IfcSpatialStructureElement;
+	StandardRequiredArea : IfcAreaMeasure;
+ INVERSE
+	HasInteractionReqsFrom : SET [0:?] OF IfcRelInteractionRequirements FOR RelatedSpaceProgram;
+	HasInteractionReqsTo : SET [0:?] OF IfcRelInteractionRequirements FOR RelatingSpaceProgram;
+END_ENTITY;
+
+ENTITY IfcSpaceThermalLoadProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	ApplicableValueRatio : OPTIONAL IfcPositiveRatioMeasure;
+	ThermalLoadSource : IfcThermalLoadSourceEnum;
+	PropertySource : IfcPropertySourceEnum;
+	SourceDescription : OPTIONAL IfcText;
+	MaximumValue : IfcPowerMeasure;
+	MinimumValue : OPTIONAL IfcPowerMeasure;
+	ThermalLoadTimeSeriesValues : OPTIONAL IfcTimeSeries;
+	UserDefinedThermalLoadSource : OPTIONAL IfcLabel;
+	UserDefinedPropertySource : OPTIONAL IfcLabel;
+	ThermalLoadType : IfcThermalLoadTypeEnum;
+END_ENTITY;
+
+ENTITY IfcSpaceType
+ SUBTYPE OF (IfcSpatialStructureElementType);
+	PredefinedType : IfcSpaceTypeEnum;
+END_ENTITY;
+
+ENTITY IfcSpatialStructureElement
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBuilding
+	,IfcBuildingStorey
+	,IfcSite
+	,IfcSpace))
+ SUBTYPE OF (IfcProduct);
+	LongName : OPTIONAL IfcLabel;
+	CompositionType : IfcElementCompositionEnum;
+ INVERSE
+	ReferencesElements : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatingStructure;
+	ServicedBySystems : SET [0:?] OF IfcRelServicesBuildings FOR RelatedBuildings;
+	ContainsElements : SET [0:?] OF IfcRelContainedInSpatialStructure FOR RelatingStructure;
+ WHERE
+	WR41 : (HIINDEX(SELF\IfcObjectDefinition.Decomposes) = 1) 
+             AND
+             ('IFC2X3.IFCRELAGGREGATES' IN TYPEOF(SELF\IfcObjectDefinition.Decomposes[1])) 
+             AND
+             (('IFC2X3.IFCPROJECT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject)) OR
+              ('IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject))
+             );
+END_ENTITY;
+
+ENTITY IfcSpatialStructureElementType
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcSpaceType))
+ SUBTYPE OF (IfcElementType);
+END_ENTITY;
+
+ENTITY IfcSphere
+ SUBTYPE OF (IfcCsgPrimitive3D);
+	Radius : IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcStackTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcStackTerminalTypeEnum;
+END_ENTITY;
+
+ENTITY IfcStair
+ SUBTYPE OF (IfcBuildingElement);
+	ShapeType : IfcStairTypeEnum;
+ WHERE
+	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
+            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
+END_ENTITY;
+
+ENTITY IfcStairFlight
+ SUBTYPE OF (IfcBuildingElement);
+	NumberOfRiser : OPTIONAL INTEGER;
+	NumberOfTreads : OPTIONAL INTEGER;
+	RiserHeight : OPTIONAL IfcPositiveLengthMeasure;
+	TreadLength : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcStairFlightType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcStairFlightTypeEnum;
+END_ENTITY;
+
+ENTITY IfcStructuralAction
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralLinearAction
+	,IfcStructuralPlanarAction
+	,IfcStructuralPointAction))
+ SUBTYPE OF (IfcStructuralActivity);
+	DestabilizingLoad : BOOLEAN;
+	CausedBy : OPTIONAL IfcStructuralReaction;
+END_ENTITY;
+
+ENTITY IfcStructuralActivity
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralAction
+	,IfcStructuralReaction))
+ SUBTYPE OF (IfcProduct);
+	AppliedLoad : IfcStructuralLoad;
+	GlobalOrLocal : IfcGlobalOrLocalEnum;
+ INVERSE
+	AssignedToStructuralItem : IfcRelConnectsStructuralActivity FOR RelatedStructuralActivity;
+END_ENTITY;
+
+ENTITY IfcStructuralAnalysisModel
+ SUBTYPE OF (IfcSystem);
+	PredefinedType : IfcAnalysisModelTypeEnum;
+	OrientationOf2DPlane : OPTIONAL IfcAxis2Placement3D;
+	LoadedBy : OPTIONAL SET [1:?] OF IfcStructuralLoadGroup;
+	HasResults : OPTIONAL SET [1:?] OF IfcStructuralResultGroup;
+END_ENTITY;
+
+ENTITY IfcStructuralConnection
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralCurveConnection
+	,IfcStructuralPointConnection
+	,IfcStructuralSurfaceConnection))
+ SUBTYPE OF (IfcStructuralItem);
+	AppliedCondition : OPTIONAL IfcBoundaryCondition;
+ INVERSE
+	ConnectsStructuralMembers : SET [1:?] OF IfcRelConnectsStructuralMember FOR RelatedStructuralConnection;
+END_ENTITY;
+
+ENTITY IfcStructuralConnectionCondition
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcFailureConnectionCondition
+	,IfcSlippageConnectionCondition));
+	Name : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcStructuralCurveConnection
+ SUBTYPE OF (IfcStructuralConnection);
+END_ENTITY;
+
+ENTITY IfcStructuralCurveMember
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralCurveMemberVarying))
+ SUBTYPE OF (IfcStructuralMember);
+	PredefinedType : IfcStructuralCurveTypeEnum;
+END_ENTITY;
+
+ENTITY IfcStructuralCurveMemberVarying
+ SUBTYPE OF (IfcStructuralCurveMember);
+END_ENTITY;
+
+ENTITY IfcStructuralItem
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralConnection
+	,IfcStructuralMember))
+ SUBTYPE OF (IfcProduct);
+ INVERSE
+	AssignedStructuralActivity : SET [0:?] OF IfcRelConnectsStructuralActivity FOR RelatingElement;
+END_ENTITY;
+
+ENTITY IfcStructuralLinearAction
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralLinearActionVarying))
+ SUBTYPE OF (IfcStructuralAction);
+	ProjectedOrTrue : IfcProjectedOrTrueLengthEnum;
+ WHERE
+	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADLINEARFORCE',
+                     'IFC2X3.IFCSTRUCTURALLOADTEMPERATURE']
+             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
+END_ENTITY;
+
+ENTITY IfcStructuralLinearActionVarying
+ SUBTYPE OF (IfcStructuralLinearAction);
+	VaryingAppliedLoadLocation : IfcShapeAspect;
+	SubsequentAppliedLoads : LIST [1:?] OF IfcStructuralLoad;
+ DERIVE
+	VaryingAppliedLoads : LIST [2:?] OF IfcStructuralLoad := IfcAddToBeginOfList(SELF\IfcStructuralActivity.AppliedLoad, SubsequentAppliedLoads);
+END_ENTITY;
+
+ENTITY IfcStructuralLoad
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralLoadStatic));
+	Name : OPTIONAL IfcLabel;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadGroup
+ SUBTYPE OF (IfcGroup);
+	PredefinedType : IfcLoadGroupTypeEnum;
+	ActionType : IfcActionTypeEnum;
+	ActionSource : IfcActionSourceTypeEnum;
+	Coefficient : OPTIONAL IfcPositiveRatioMeasure;
+	Purpose : OPTIONAL IfcLabel;
+ INVERSE
+	SourceOfResultGroup : SET [0:1] OF IfcStructuralResultGroup FOR ResultForLoadGroup;
+	LoadGroupFor : SET [0:?] OF IfcStructuralAnalysisModel FOR LoadedBy;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadLinearForce
+ SUBTYPE OF (IfcStructuralLoadStatic);
+	LinearForceX : OPTIONAL IfcLinearForceMeasure;
+	LinearForceY : OPTIONAL IfcLinearForceMeasure;
+	LinearForceZ : OPTIONAL IfcLinearForceMeasure;
+	LinearMomentX : OPTIONAL IfcLinearMomentMeasure;
+	LinearMomentY : OPTIONAL IfcLinearMomentMeasure;
+	LinearMomentZ : OPTIONAL IfcLinearMomentMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadPlanarForce
+ SUBTYPE OF (IfcStructuralLoadStatic);
+	PlanarForceX : OPTIONAL IfcPlanarForceMeasure;
+	PlanarForceY : OPTIONAL IfcPlanarForceMeasure;
+	PlanarForceZ : OPTIONAL IfcPlanarForceMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadSingleDisplacement
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralLoadSingleDisplacementDistortion))
+ SUBTYPE OF (IfcStructuralLoadStatic);
+	DisplacementX : OPTIONAL IfcLengthMeasure;
+	DisplacementY : OPTIONAL IfcLengthMeasure;
+	DisplacementZ : OPTIONAL IfcLengthMeasure;
+	RotationalDisplacementRX : OPTIONAL IfcPlaneAngleMeasure;
+	RotationalDisplacementRY : OPTIONAL IfcPlaneAngleMeasure;
+	RotationalDisplacementRZ : OPTIONAL IfcPlaneAngleMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadSingleDisplacementDistortion
+ SUBTYPE OF (IfcStructuralLoadSingleDisplacement);
+	Distortion : OPTIONAL IfcCurvatureMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadSingleForce
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralLoadSingleForceWarping))
+ SUBTYPE OF (IfcStructuralLoadStatic);
+	ForceX : OPTIONAL IfcForceMeasure;
+	ForceY : OPTIONAL IfcForceMeasure;
+	ForceZ : OPTIONAL IfcForceMeasure;
+	MomentX : OPTIONAL IfcTorqueMeasure;
+	MomentY : OPTIONAL IfcTorqueMeasure;
+	MomentZ : OPTIONAL IfcTorqueMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadSingleForceWarping
+ SUBTYPE OF (IfcStructuralLoadSingleForce);
+	WarpingMoment : OPTIONAL IfcWarpingMomentMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralLoadStatic
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralLoadLinearForce
+	,IfcStructuralLoadPlanarForce
+	,IfcStructuralLoadSingleDisplacement
+	,IfcStructuralLoadSingleForce
+	,IfcStructuralLoadTemperature))
+ SUBTYPE OF (IfcStructuralLoad);
+END_ENTITY;
+
+ENTITY IfcStructuralLoadTemperature
+ SUBTYPE OF (IfcStructuralLoadStatic);
+	DeltaT_Constant : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	DeltaT_Y : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	DeltaT_Z : OPTIONAL IfcThermodynamicTemperatureMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralMember
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralCurveMember
+	,IfcStructuralSurfaceMember))
+ SUBTYPE OF (IfcStructuralItem);
+ INVERSE
+	ReferencesElement : SET [0:?] OF IfcRelConnectsStructuralElement FOR RelatedStructuralMember;
+	ConnectedBy : SET [0:?] OF IfcRelConnectsStructuralMember FOR RelatingStructuralMember;
+END_ENTITY;
+
+ENTITY IfcStructuralPlanarAction
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralPlanarActionVarying))
+ SUBTYPE OF (IfcStructuralAction);
+	ProjectedOrTrue : IfcProjectedOrTrueLengthEnum;
+ WHERE
+	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADPLANARFORCE',
+                     'IFC2X3.IFCSTRUCTURALLOADTEMPERATURE']
+             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
+END_ENTITY;
+
+ENTITY IfcStructuralPlanarActionVarying
+ SUBTYPE OF (IfcStructuralPlanarAction);
+	VaryingAppliedLoadLocation : IfcShapeAspect;
+	SubsequentAppliedLoads : LIST [2:?] OF IfcStructuralLoad;
+ DERIVE
+	VaryingAppliedLoads : LIST [3:?] OF IfcStructuralLoad := IfcAddToBeginOfList(SELF\IfcStructuralActivity.AppliedLoad, SubsequentAppliedLoads);
+END_ENTITY;
+
+ENTITY IfcStructuralPointAction
+ SUBTYPE OF (IfcStructuralAction);
+ WHERE
+	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADSINGLEFORCE',
+                     'IFC2X3.IFCSTRUCTURALLOADSINGLEDISPLACEMENT']
+             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
+END_ENTITY;
+
+ENTITY IfcStructuralPointConnection
+ SUBTYPE OF (IfcStructuralConnection);
+END_ENTITY;
+
+ENTITY IfcStructuralPointReaction
+ SUBTYPE OF (IfcStructuralReaction);
+ WHERE
+	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADSINGLEFORCE',
+                     'IFC2X3.IFCSTRUCTURALLOADSINGLEDISPLACEMENT']
+             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
+END_ENTITY;
+
+ENTITY IfcStructuralProfileProperties
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralSteelProfileProperties))
+ SUBTYPE OF (IfcGeneralProfileProperties);
+	TorsionalConstantX : OPTIONAL IfcMomentOfInertiaMeasure;
+	MomentOfInertiaYZ : OPTIONAL IfcMomentOfInertiaMeasure;
+	MomentOfInertiaY : OPTIONAL IfcMomentOfInertiaMeasure;
+	MomentOfInertiaZ : OPTIONAL IfcMomentOfInertiaMeasure;
+	WarpingConstant : OPTIONAL IfcWarpingConstantMeasure;
+	ShearCentreZ : OPTIONAL IfcLengthMeasure;
+	ShearCentreY : OPTIONAL IfcLengthMeasure;
+	ShearDeformationAreaZ : OPTIONAL IfcAreaMeasure;
+	ShearDeformationAreaY : OPTIONAL IfcAreaMeasure;
+	MaximumSectionModulusY : OPTIONAL IfcSectionModulusMeasure;
+	MinimumSectionModulusY : OPTIONAL IfcSectionModulusMeasure;
+	MaximumSectionModulusZ : OPTIONAL IfcSectionModulusMeasure;
+	MinimumSectionModulusZ : OPTIONAL IfcSectionModulusMeasure;
+	TorsionalSectionModulus : OPTIONAL IfcSectionModulusMeasure;
+	CentreOfGravityInX : OPTIONAL IfcLengthMeasure;
+	CentreOfGravityInY : OPTIONAL IfcLengthMeasure;
+ WHERE
+	WR21 : NOT(EXISTS(ShearDeformationAreaY)) OR (ShearDeformationAreaY >= 0.);
+	WR22 : NOT(EXISTS(ShearDeformationAreaZ)) OR (ShearDeformationAreaZ >= 0.);
+END_ENTITY;
+
+ENTITY IfcStructuralReaction
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStructuralPointReaction))
+ SUBTYPE OF (IfcStructuralActivity);
+ INVERSE
+	Causes : SET [0:?] OF IfcStructuralAction FOR CausedBy;
+END_ENTITY;
+
+ENTITY IfcStructuralResultGroup
+ SUBTYPE OF (IfcGroup);
+	TheoryType : IfcAnalysisTheoryTypeEnum;
+	ResultForLoadGroup : OPTIONAL IfcStructuralLoadGroup;
+	IsLinear : BOOLEAN;
+ INVERSE
+	ResultGroupFor : SET [0:1] OF IfcStructuralAnalysisModel FOR HasResults;
+END_ENTITY;
+
+ENTITY IfcStructuralSteelProfileProperties
+ SUBTYPE OF (IfcStructuralProfileProperties);
+	ShearAreaZ : OPTIONAL IfcAreaMeasure;
+	ShearAreaY : OPTIONAL IfcAreaMeasure;
+	PlasticShapeFactorY : OPTIONAL IfcPositiveRatioMeasure;
+	PlasticShapeFactorZ : OPTIONAL IfcPositiveRatioMeasure;
+ WHERE
+	WR31 : NOT(EXISTS(ShearAreaY)) OR (ShearAreaY >= 0.);
+	WR32 : NOT(EXISTS(ShearAreaZ)) OR (ShearAreaZ >= 0.);
+END_ENTITY;
+
+ENTITY IfcStructuralSurfaceConnection
+ SUBTYPE OF (IfcStructuralConnection);
+END_ENTITY;
+
+ENTITY IfcStructuralSurfaceMember
+ SUPERTYPE OF (ONEOF
+	(IfcStructuralSurfaceMemberVarying))
+ SUBTYPE OF (IfcStructuralMember);
+	PredefinedType : IfcStructuralSurfaceTypeEnum;
+	Thickness : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcStructuralSurfaceMemberVarying
+ SUBTYPE OF (IfcStructuralSurfaceMember);
+	SubsequentThickness : LIST [2:?] OF IfcPositiveLengthMeasure;
+	VaryingThicknessLocation : IfcShapeAspect;
+ DERIVE
+	VaryingThickness : LIST [3:?] OF IfcPositiveLengthMeasure := IfcAddToBeginOfList(SELF\IfcStructuralSurfaceMember.Thickness, SubsequentThickness);
+ WHERE
+	WR61 : EXISTS(SELF\IfcStructuralSurfaceMember.Thickness);
+	WR62 : SIZEOF(QUERY(temp <* SELF.VaryingThicknessLocation.ShapeRepresentations |
+               NOT(SIZEOF(temp\IfcRepresentation.Items) = 1)
+               )) = 0;
+	WR63 : SIZEOF(QUERY(temp <* SELF.VaryingThicknessLocation.ShapeRepresentations |
+               NOT(('IFC2X3.IFCCARTESIANPOINT' IN TYPEOF(temp\IfcRepresentation.Items[1]))
+                     OR
+                   ('IFC2X3.IFCPOINTONSURFACE' IN TYPEOF(temp\IfcRepresentation.Items[1])))
+               )) = 0;
+END_ENTITY;
+
+ENTITY IfcStructuredDimensionCallout
+ SUBTYPE OF (IfcDraughtingCallout);
+ WHERE
+	WR31 : SIZEOF(QUERY ( Ato <* QUERY ( Con <* SELF.contents | (
+                   'IFC2X3.IFCANNOTATIONTEXTOCCURRENCE' IN 
+                    TYPEOF(Con)) ) | (NOT (Ato.Name IN ['dimension value',
+                   'tolerance value','unit text','prefix text','suffix text']))))
+                  = 0;
+END_ENTITY;
+
+ENTITY IfcStyleModel
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcStyledRepresentation))
+ SUBTYPE OF (IfcRepresentation);
+END_ENTITY;
+
+ENTITY IfcStyledItem
+ SUPERTYPE OF (ONEOF
+	(IfcAnnotationOccurrence))
+ SUBTYPE OF (IfcRepresentationItem);
+	Item : OPTIONAL IfcRepresentationItem;
+	Styles : SET [1:?] OF IfcPresentationStyleAssignment;
+	Name : OPTIONAL IfcLabel;
+ WHERE
+	WR11 : SIZEOF(Styles) = 1;
+	WR12 : NOT('IFC2X3.IFCSTYLEDITEM' IN TYPEOF(Item));
+END_ENTITY;
+
+ENTITY IfcStyledRepresentation
+ SUBTYPE OF (IfcStyleModel);
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRepresentation.Items | 
+               (NOT('IFC2X3.IFCSTYLEDITEM' IN TYPEOF(temp)))
+             )) = 0;
+END_ENTITY;
+
+ENTITY IfcSubContractResource
+ SUBTYPE OF (IfcConstructionResource);
+	SubContractor : OPTIONAL IfcActorSelect;
+	JobDescription : OPTIONAL IfcText;
+END_ENTITY;
+
+ENTITY IfcSubedge
+ SUBTYPE OF (IfcEdge);
+	ParentEdge : IfcEdge;
+END_ENTITY;
+
+ENTITY IfcSurface
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBoundedSurface
+	,IfcElementarySurface
+	,IfcSweptSurface))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcSurfaceCurveSweptAreaSolid
+ SUBTYPE OF (IfcSweptAreaSolid);
+	Directrix : IfcCurve;
+	StartParam : IfcParameterValue;
+	EndParam : IfcParameterValue;
+	ReferenceSurface : IfcSurface;
+END_ENTITY;
+
+ENTITY IfcSurfaceOfLinearExtrusion
+ SUBTYPE OF (IfcSweptSurface);
+	ExtrudedDirection : IfcDirection;
+	Depth : IfcLengthMeasure;
+ DERIVE
+	ExtrusionAxis : IfcVector := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (ExtrudedDirection, Depth);
+ WHERE
+	WR41 : Depth > 0.;
+END_ENTITY;
+
+ENTITY IfcSurfaceOfRevolution
+ SUBTYPE OF (IfcSweptSurface);
+	AxisPosition : IfcAxis1Placement;
+ DERIVE
+	AxisLine : IfcLine := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcCurve() || IfcLine(AxisPosition.Location, 
+                       IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(AxisPosition.Z,1.0));
+END_ENTITY;
+
+ENTITY IfcSurfaceStyle
+ SUBTYPE OF (IfcPresentationStyle);
+	Side : IfcSurfaceSide;
+	Styles : SET [1:5] OF IfcSurfaceStyleElementSelect;
+ WHERE
+	WR11 : SIZEOF(QUERY(Style <* SELF.Styles |
+               'IFC2X3.IFCSURFACESTYLESHADING' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR12 : SIZEOF(QUERY(Style <* SELF.Styles |
+               'IFC2X3.IFCSURFACESTYLELIGHTING' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR13 : SIZEOF(QUERY(Style <* SELF.Styles |
+               'IFC2X3.IFCSURFACESTYLEREFRACTION' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR14 : SIZEOF(QUERY(Style <* SELF.Styles |
+               'IFC2X3.IFCSURFACESTYLEWITHTEXTURES' IN
+                TYPEOF(Style)
+               )) <= 1;
+	WR15 : SIZEOF(QUERY(Style <* SELF.Styles |
+               'IFC2X3.IFCEXTERNALLYDEFINEDSURFACESTYLE' IN
+                TYPEOF(Style)
+               )) <= 1;
+END_ENTITY;
+
+ENTITY IfcSurfaceStyleLighting;
+	DiffuseTransmissionColour : IfcColourRgb;
+	DiffuseReflectionColour : IfcColourRgb;
+	TransmissionColour : IfcColourRgb;
+	ReflectanceColour : IfcColourRgb;
+END_ENTITY;
+
+ENTITY IfcSurfaceStyleRefraction;
+	RefractionIndex : OPTIONAL IfcReal;
+	DispersionFactor : OPTIONAL IfcReal;
+END_ENTITY;
+
+ENTITY IfcSurfaceStyleRendering
+ SUBTYPE OF (IfcSurfaceStyleShading);
+	Transparency : OPTIONAL IfcNormalisedRatioMeasure;
+	DiffuseColour : OPTIONAL IfcColourOrFactor;
+	TransmissionColour : OPTIONAL IfcColourOrFactor;
+	DiffuseTransmissionColour : OPTIONAL IfcColourOrFactor;
+	ReflectionColour : OPTIONAL IfcColourOrFactor;
+	SpecularColour : OPTIONAL IfcColourOrFactor;
+	SpecularHighlight : OPTIONAL IfcSpecularHighlightSelect;
+	ReflectanceMethod : IfcReflectanceMethodEnum;
+END_ENTITY;
+
+ENTITY IfcSurfaceStyleShading
+ SUPERTYPE OF (ONEOF
+	(IfcSurfaceStyleRendering));
+	SurfaceColour : IfcColourRgb;
+END_ENTITY;
+
+ENTITY IfcSurfaceStyleWithTextures;
+	Textures : LIST [1:?] OF IfcSurfaceTexture;
+END_ENTITY;
+
+ENTITY IfcSurfaceTexture
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcBlobTexture
+	,IfcImageTexture
+	,IfcPixelTexture));
+	RepeatS : BOOLEAN;
+	RepeatT : BOOLEAN;
+	TextureType : IfcSurfaceTextureEnum;
+	TextureTransform : OPTIONAL IfcCartesianTransformationOperator2D;
+END_ENTITY;
+
+ENTITY IfcSweptAreaSolid
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcExtrudedAreaSolid
+	,IfcRevolvedAreaSolid
+	,IfcSurfaceCurveSweptAreaSolid))
+ SUBTYPE OF (IfcSolidModel);
+	SweptArea : IfcProfileDef;
+	Position : IfcAxis2Placement3D;
+ WHERE
+	WR22 : SweptArea.ProfileType = IfcProfileTypeEnum.Area;
+END_ENTITY;
+
+ENTITY IfcSweptDiskSolid
+ SUBTYPE OF (IfcSolidModel);
+	Directrix : IfcCurve;
+	Radius : IfcPositiveLengthMeasure;
+	InnerRadius : OPTIONAL IfcPositiveLengthMeasure;
+	StartParam : IfcParameterValue;
+	EndParam : IfcParameterValue;
+ WHERE
+	WR1 : Directrix.Dim = 3;
+	WR2 : (NOT EXISTS(InnerRadius)) OR (Radius > InnerRadius);
+END_ENTITY;
+
+ENTITY IfcSweptSurface
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcSurfaceOfLinearExtrusion
+	,IfcSurfaceOfRevolution))
+ SUBTYPE OF (IfcSurface);
+	SweptCurve : IfcProfileDef;
+	Position : IfcAxis2Placement3D;
+ DERIVE
+	Dim : IfcDimensionCount := Position.Dim;
+ WHERE
+	WR1 : NOT('IFC2X3.IFCDERIVEDPROFILEDEF' IN TYPEOF(SweptCurve));
+	WR2 : SweptCurve.ProfileType = IfcProfileTypeEnum.Curve;
+END_ENTITY;
+
+ENTITY IfcSwitchingDeviceType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcSwitchingDeviceTypeEnum;
+END_ENTITY;
+
+ENTITY IfcSymbolStyle
+ SUBTYPE OF (IfcPresentationStyle);
+	StyleOfSymbol : IfcSymbolStyleSelect;
+END_ENTITY;
+
+ENTITY IfcSystem
+ SUPERTYPE OF (ONEOF
+	(IfcElectricalCircuit
+	,IfcStructuralAnalysisModel))
+ SUBTYPE OF (IfcGroup);
+ INVERSE
+	ServicesBuildings : SET [0:1] OF IfcRelServicesBuildings FOR RelatingSystem;
+END_ENTITY;
+
+ENTITY IfcSystemFurnitureElementType
+ SUBTYPE OF (IfcFurnishingElementType);
+END_ENTITY;
+
+ENTITY IfcTShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Depth : IfcPositiveLengthMeasure;
+	FlangeWidth : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	FlangeThickness : IfcPositiveLengthMeasure;
+	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	FlangeEdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
+	WebEdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
+	WebSlope : OPTIONAL IfcPlaneAngleMeasure;
+	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
+	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR1 : FlangeThickness < Depth;
+	WR2 : WebThickness < FlangeWidth;
+END_ENTITY;
+
+ENTITY IfcTable;
+	Name : STRING;
+	Rows : LIST [1:?] OF IfcTableRow;
+ DERIVE
+	NumberOfCellsInRow : INTEGER := HIINDEX(Rows[1].RowCells);
+	NumberOfHeadings : INTEGER := SIZEOF(QUERY( Temp <* Rows | Temp.IsHeading));
+	NumberOfDataRows : INTEGER := SIZEOF(QUERY( Temp <* Rows | NOT(Temp.IsHeading)));
+ WHERE
+	WR1 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
+	WR2 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
+	WR3 : { 0 <= NumberOfHeadings <= 1 };
+END_ENTITY;
+
+ENTITY IfcTableRow;
+	RowCells : LIST [1:?] OF IfcValue;
+	IsHeading : BOOLEAN;
+ INVERSE
+	OfTable : IfcTable FOR Rows;
+END_ENTITY;
+
+ENTITY IfcTankType
+ SUBTYPE OF (IfcFlowStorageDeviceType);
+	PredefinedType : IfcTankTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcTankTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcTankTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcTask
+ SUPERTYPE OF (ONEOF
+	(IfcMove
+	,IfcOrderAction))
+ SUBTYPE OF (IfcProcess);
+	TaskId : IfcIdentifier;
+	Status : OPTIONAL IfcLabel;
+	WorkMethod : OPTIONAL IfcLabel;
+	IsMilestone : BOOLEAN;
+	Priority : OPTIONAL INTEGER;
+ WHERE
+	WR1 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.Decomposes | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
+	WR2 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.IsDecomposedBy | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
+	WR3 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcTelecomAddress
+ SUBTYPE OF (IfcAddress);
+	TelephoneNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
+	FacsimileNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
+	PagerNumber : OPTIONAL IfcLabel;
+	ElectronicMailAddresses : OPTIONAL LIST [1:?] OF IfcLabel;
+	WWWHomePageURL : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : EXISTS (TelephoneNumbers) OR
+            EXISTS (PagerNumber) OR
+            EXISTS (FacsimileNumbers) OR 
+            EXISTS (ElectronicMailAddresses) OR 
+            EXISTS (WWWHomePageURL);
+END_ENTITY;
+
+ENTITY IfcTendon
+ SUBTYPE OF (IfcReinforcingElement);
+	PredefinedType : IfcTendonTypeEnum;
+	NominalDiameter : IfcPositiveLengthMeasure;
+	CrossSectionArea : IfcAreaMeasure;
+	TensionForce : OPTIONAL IfcForceMeasure;
+	PreStress : OPTIONAL IfcPressureMeasure;
+	FrictionCoefficient : OPTIONAL IfcNormalisedRatioMeasure;
+	AnchorageSlip : OPTIONAL IfcPositiveLengthMeasure;
+	MinCurvatureRadius : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR1 : (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
+END_ENTITY;
+
+ENTITY IfcTendonAnchor
+ SUBTYPE OF (IfcReinforcingElement);
+END_ENTITY;
+
+ENTITY IfcTerminatorSymbol
+ SUPERTYPE OF (ONEOF
+	(IfcDimensionCurveTerminator))
+ SUBTYPE OF (IfcAnnotationSymbolOccurrence);
+	AnnotatedCurve : IfcAnnotationCurveOccurrence;
+END_ENTITY;
+
+ENTITY IfcTextLiteral
+ SUPERTYPE OF (ONEOF
+	(IfcTextLiteralWithExtent))
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Literal : IfcPresentableText;
+	Placement : IfcAxis2Placement;
+	Path : IfcTextPath;
+END_ENTITY;
+
+ENTITY IfcTextLiteralWithExtent
+ SUBTYPE OF (IfcTextLiteral);
+	Extent : IfcPlanarExtent;
+	BoxAlignment : IfcBoxAlignment;
+ WHERE
+	WR31 : NOT('IFC2X3.IFCPLANARBOX' IN TYPEOF(Extent));
+END_ENTITY;
+
+ENTITY IfcTextStyle
+ SUBTYPE OF (IfcPresentationStyle);
+	TextCharacterAppearance : OPTIONAL IfcCharacterStyleSelect;
+	TextStyle : OPTIONAL IfcTextStyleSelect;
+	TextFontStyle : IfcTextFontSelect;
+END_ENTITY;
+
+ENTITY IfcTextStyleFontModel
+ SUBTYPE OF (IfcPreDefinedTextFont);
+	FontFamily : OPTIONAL LIST [1:?] OF IfcTextFontName;
+	FontStyle : OPTIONAL IfcFontStyle;
+	FontVariant : OPTIONAL IfcFontVariant;
+	FontWeight : OPTIONAL IfcFontWeight;
+	FontSize : IfcSizeSelect;
+ WHERE
+	WR31 : ('IFC2X3.IFCLENGTHMEASURE' IN TYPEOF(SELF.FontSize)) AND
+             (SELF.FontSize > 0.);
+END_ENTITY;
+
+ENTITY IfcTextStyleForDefinedFont;
+	Colour : IfcColour;
+	BackgroundColour : OPTIONAL IfcColour;
+END_ENTITY;
+
+ENTITY IfcTextStyleTextModel;
+	TextIndent : OPTIONAL IfcSizeSelect;
+	TextAlign : OPTIONAL IfcTextAlignment;
+	TextDecoration : OPTIONAL IfcTextDecoration;
+	LetterSpacing : OPTIONAL IfcSizeSelect;
+	WordSpacing : OPTIONAL IfcSizeSelect;
+	TextTransform : OPTIONAL IfcTextTransformation;
+	LineHeight : OPTIONAL IfcSizeSelect;
+END_ENTITY;
+
+ENTITY IfcTextStyleWithBoxCharacteristics;
+	BoxHeight : OPTIONAL IfcPositiveLengthMeasure;
+	BoxWidth : OPTIONAL IfcPositiveLengthMeasure;
+	BoxSlantAngle : OPTIONAL IfcPlaneAngleMeasure;
+	BoxRotateAngle : OPTIONAL IfcPlaneAngleMeasure;
+	CharacterSpacing : OPTIONAL IfcSizeSelect;
+END_ENTITY;
+
+ENTITY IfcTextureCoordinate
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcTextureCoordinateGenerator
+	,IfcTextureMap));
+ INVERSE
+	AnnotatedSurface : SET [1:1] OF IfcAnnotationSurface FOR TextureCoordinates;
+END_ENTITY;
+
+ENTITY IfcTextureCoordinateGenerator
+ SUBTYPE OF (IfcTextureCoordinate);
+	Mode : IfcLabel;
+	Parameter : LIST [1:?] OF IfcSimpleValue;
+END_ENTITY;
+
+ENTITY IfcTextureMap
+ SUBTYPE OF (IfcTextureCoordinate);
+	TextureMaps : SET [1:?] OF IfcVertexBasedTextureMap;
+ WHERE
+	WR11 : SIZEOF([
+               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
+               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
+               'IFC2X3.IFCFACETEDBREP',
+               'IFC2X3.IFCFACETEDBREPWITHVOIDS'] 
+              * TYPEOF(SELF\IfcTextureCoordinate.AnnotatedSurface[1].Item)
+               ) >= 1;
+END_ENTITY;
+
+ENTITY IfcTextureVertex;
+	Coordinates : LIST [2:2] OF IfcParameterValue;
+END_ENTITY;
+
+ENTITY IfcThermalMaterialProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	SpecificHeatCapacity : OPTIONAL IfcSpecificHeatCapacityMeasure;
+	BoilingPoint : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	FreezingPoint : OPTIONAL IfcThermodynamicTemperatureMeasure;
+	ThermalConductivity : OPTIONAL IfcThermalConductivityMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcTimeSeries
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcIrregularTimeSeries
+	,IfcRegularTimeSeries));
+	Name : IfcLabel;
+	Description : OPTIONAL IfcText;
+	StartTime : IfcDateTimeSelect;
+	EndTime : IfcDateTimeSelect;
+	TimeSeriesDataType : IfcTimeSeriesDataTypeEnum;
+	DataOrigin : IfcDataOriginEnum;
+	UserDefinedDataOrigin : OPTIONAL IfcLabel;
+	Unit : OPTIONAL IfcUnit;
+ INVERSE
+	DocumentedBy : SET [0:1] OF IfcTimeSeriesReferenceRelationship FOR ReferencedTimeSeries;
+END_ENTITY;
+
+ENTITY IfcTimeSeriesReferenceRelationship;
+	ReferencedTimeSeries : IfcTimeSeries;
+	TimeSeriesReferences : SET [1:?] OF IfcDocumentSelect;
+END_ENTITY;
+
+ENTITY IfcTimeSeriesSchedule
+ SUBTYPE OF (IfcControl);
+	ApplicableDates : OPTIONAL LIST [1:?] OF IfcDateTimeSelect;
+	TimeSeriesScheduleType : IfcTimeSeriesScheduleTypeEnum;
+	TimeSeries : IfcTimeSeries;
+ WHERE
+	WR41 : NOT(TimeSeriesScheduleType=IfcTimeSeriesScheduleTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
+END_ENTITY;
+
+ENTITY IfcTimeSeriesValue;
+	ListValues : LIST [1:?] OF IfcValue;
+END_ENTITY;
+
+ENTITY IfcTopologicalRepresentationItem
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcConnectedFaceSet
+	,IfcEdge
+	,IfcFace
+	,IfcFaceBound
+	,IfcLoop
+	,IfcPath
+	,IfcVertex))
+ SUBTYPE OF (IfcRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcTopologyRepresentation
+ SUBTYPE OF (IfcShapeModel);
+ WHERE
+	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRepresentation.Items | 
+               NOT('IFC2X3.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
+             )) = 0;
+	WR22 : EXISTS(SELF\IfcRepresentation.RepresentationType);
+	WR23 : IfcTopologyRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
+END_ENTITY;
+
+ENTITY IfcTransformerType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcTransformerTypeEnum;
+END_ENTITY;
+
+ENTITY IfcTransportElement
+ SUBTYPE OF (IfcElement);
+	OperationType : OPTIONAL IfcTransportElementTypeEnum;
+	CapacityByWeight : OPTIONAL IfcMassMeasure;
+	CapacityByNumber : OPTIONAL IfcCountMeasure;
+END_ENTITY;
+
+ENTITY IfcTransportElementType
+ SUBTYPE OF (IfcElementType);
+	PredefinedType : IfcTransportElementTypeEnum;
+END_ENTITY;
+
+ENTITY IfcTrapeziumProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	BottomXDim : IfcPositiveLengthMeasure;
+	TopXDim : IfcPositiveLengthMeasure;
+	YDim : IfcPositiveLengthMeasure;
+	TopXOffset : IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcTrimmedCurve
+ SUBTYPE OF (IfcBoundedCurve);
+	BasisCurve : IfcCurve;
+	Trim1 : SET [1:2] OF IfcTrimmingSelect;
+	Trim2 : SET [1:2] OF IfcTrimmingSelect;
+	SenseAgreement : BOOLEAN;
+	MasterRepresentation : IfcTrimmingPreference;
+ WHERE
+	WR41 : (HIINDEX(Trim1) = 1) OR (TYPEOF(Trim1[1]) <> TYPEOF(Trim1[2]));
+	WR42 : (HIINDEX(Trim2) = 1) OR (TYPEOF(Trim2[1]) <> TYPEOF(Trim2[2]));
+	WR43 : NOT('IFC2X3.IFCBOUNDEDCURVE' IN TYPEOF(BasisCurve));
+END_ENTITY;
+
+ENTITY IfcTubeBundleType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcTubeBundleTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcTwoDirectionRepeatFactor
+ SUBTYPE OF (IfcOneDirectionRepeatFactor);
+	SecondRepeatFactor : IfcVector;
+END_ENTITY;
+
+ENTITY IfcTypeObject
+ SUPERTYPE OF (ONEOF
+	(IfcTypeProduct))
+ SUBTYPE OF (IfcObjectDefinition);
+	ApplicableOccurrence : OPTIONAL IfcLabel;
+	HasPropertySets : OPTIONAL SET [1:?] OF IfcPropertySetDefinition;
+ INVERSE
+	ObjectTypeOf : SET [0:1] OF IfcRelDefinesByType FOR RelatingType;
+ WHERE
+	WR1 : EXISTS(SELF\IfcRoot.Name);
+END_ENTITY;
+
+ENTITY IfcTypeProduct
+ SUPERTYPE OF (ONEOF
+	(IfcDoorStyle
+	,IfcElementType
+	,IfcWindowStyle))
+ SUBTYPE OF (IfcTypeObject);
+	RepresentationMaps : OPTIONAL LIST [1:?] OF UNIQUE IfcRepresentationMap;
+	Tag : OPTIONAL IfcLabel;
+ WHERE
+	WR41 : NOT(EXISTS(SELF\IfcTypeObject.ObjectTypeOf[1])) OR
+             (SIZEOF(QUERY(temp <* SELF\IfcTypeObject.ObjectTypeOf[1].RelatedObjects |
+               NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp)))
+             ) = 0);
+END_ENTITY;
+
+ENTITY IfcUShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Depth : IfcPositiveLengthMeasure;
+	FlangeWidth : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	FlangeThickness : IfcPositiveLengthMeasure;
+	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
+	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
+	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR21 : FlangeThickness < (Depth / 2.);
+	WR22 : WebThickness < FlangeWidth;
+END_ENTITY;
+
+ENTITY IfcUnitAssignment;
+	Units : SET [1:?] OF IfcUnit;
+ WHERE
+	WR01 : IfcCorrectUnitAssignment(Units);
+END_ENTITY;
+
+ENTITY IfcUnitaryEquipmentType
+ SUBTYPE OF (IfcEnergyConversionDeviceType);
+	PredefinedType : IfcUnitaryEquipmentTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcValveType
+ SUBTYPE OF (IfcFlowControllerType);
+	PredefinedType : IfcValveTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcValveTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcValveTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcVector
+ SUBTYPE OF (IfcGeometricRepresentationItem);
+	Orientation : IfcDirection;
+	Magnitude : IfcLengthMeasure;
+ DERIVE
+	Dim : IfcDimensionCount := Orientation.Dim;
+ WHERE
+	WR1 : Magnitude >= 0.0;
+END_ENTITY;
+
+ENTITY IfcVertex
+ SUPERTYPE OF (ONEOF
+	(IfcVertexPoint))
+ SUBTYPE OF (IfcTopologicalRepresentationItem);
+END_ENTITY;
+
+ENTITY IfcVertexBasedTextureMap;
+	TextureVertices : LIST [3:?] OF IfcTextureVertex;
+	TexturePoints : LIST [3:?] OF IfcCartesianPoint;
+END_ENTITY;
+
+ENTITY IfcVertexLoop
+ SUBTYPE OF (IfcLoop);
+	LoopVertex : IfcVertex;
+END_ENTITY;
+
+ENTITY IfcVertexPoint
+ SUBTYPE OF (IfcVertex);
+	VertexGeometry : IfcPoint;
+END_ENTITY;
+
+ENTITY IfcVibrationIsolatorType
+ SUBTYPE OF (IfcDiscreteAccessoryType);
+	PredefinedType : IfcVibrationIsolatorTypeEnum;
+ WHERE
+	WR1 : (PredefinedType <> IfcVibrationIsolatorTypeEnum.USERDEFINED) OR
+            ((PredefinedType = IfcVibrationIsolatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
+END_ENTITY;
+
+ENTITY IfcVirtualElement
+ SUBTYPE OF (IfcElement);
+END_ENTITY;
+
+ENTITY IfcVirtualGridIntersection;
+	IntersectingAxes : LIST [2:2] OF UNIQUE IfcGridAxis;
+	OffsetDistances : LIST [2:3] OF IfcLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcWall
+ SUPERTYPE OF (ONEOF
+	(IfcWallStandardCase))
+ SUBTYPE OF (IfcBuildingElement);
+ WHERE
+	WR1 : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations |
+              'IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)
+              )) <= 1;
+END_ENTITY;
+
+ENTITY IfcWallStandardCase
+ SUBTYPE OF (IfcWall);
+ WHERE
+	WR1 : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC2X3.IFCRELASSOCIATES.RELATEDOBJECTS') |
+                          ('IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
+                          ('IFC2X3.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial))
+                          )) = 1;
+END_ENTITY;
+
+ENTITY IfcWallType
+ SUBTYPE OF (IfcBuildingElementType);
+	PredefinedType : IfcWallTypeEnum;
+END_ENTITY;
+
+ENTITY IfcWasteTerminalType
+ SUBTYPE OF (IfcFlowTerminalType);
+	PredefinedType : IfcWasteTerminalTypeEnum;
+END_ENTITY;
+
+ENTITY IfcWaterProperties
+ SUBTYPE OF (IfcMaterialProperties);
+	IsPotable : OPTIONAL BOOLEAN;
+	Hardness : OPTIONAL IfcIonConcentrationMeasure;
+	AlkalinityConcentration : OPTIONAL IfcIonConcentrationMeasure;
+	AcidityConcentration : OPTIONAL IfcIonConcentrationMeasure;
+	ImpuritiesContent : OPTIONAL IfcNormalisedRatioMeasure;
+	PHLevel : OPTIONAL IfcPHMeasure;
+	DissolvedSolidsContent : OPTIONAL IfcNormalisedRatioMeasure;
+ UNIQUE
+	UR11 : Material;
+END_ENTITY;
+
+ENTITY IfcWindow
+ SUBTYPE OF (IfcBuildingElement);
+	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
+	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
+END_ENTITY;
+
+ENTITY IfcWindowLiningProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
+	LiningThickness : OPTIONAL IfcPositiveLengthMeasure;
+	TransomThickness : OPTIONAL IfcPositiveLengthMeasure;
+	MullionThickness : OPTIONAL IfcPositiveLengthMeasure;
+	FirstTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
+	SecondTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
+	FirstMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
+	SecondMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
+	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
+ WHERE
+	WR31 : NOT(NOT(EXISTS(LiningDepth)) AND EXISTS(LiningThickness));
+	WR32 : NOT(NOT(EXISTS(FirstTransomOffset)) AND EXISTS(SecondTransomOffset));
+	WR33 : NOT(NOT(EXISTS(FirstMullionOffset)) AND EXISTS(SecondMullionOffset));
+	WR34 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
+             ('IFC2X3.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
+END_ENTITY;
+
+ENTITY IfcWindowPanelProperties
+ SUBTYPE OF (IfcPropertySetDefinition);
+	OperationType : IfcWindowPanelOperationEnum;
+	PanelPosition : IfcWindowPanelPositionEnum;
+	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
+	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
+	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
+END_ENTITY;
+
+ENTITY IfcWindowStyle
+ SUBTYPE OF (IfcTypeProduct);
+	ConstructionType : IfcWindowStyleConstructionEnum;
+	OperationType : IfcWindowStyleOperationEnum;
+	ParameterTakesPrecedence : BOOLEAN;
+	Sizeable : BOOLEAN;
+END_ENTITY;
+
+ENTITY IfcWorkControl
+ ABSTRACT SUPERTYPE OF (ONEOF
+	(IfcWorkPlan
+	,IfcWorkSchedule))
+ SUBTYPE OF (IfcControl);
+	Identifier : IfcIdentifier;
+	CreationDate : IfcDateTimeSelect;
+	Creators : OPTIONAL SET [1:?] OF IfcPerson;
+	Purpose : OPTIONAL IfcLabel;
+	Duration : OPTIONAL IfcTimeMeasure;
+	TotalFloat : OPTIONAL IfcTimeMeasure;
+	StartTime : IfcDateTimeSelect;
+	FinishTime : OPTIONAL IfcDateTimeSelect;
+	WorkControlType : OPTIONAL IfcWorkControlTypeEnum;
+	UserDefinedControlType : OPTIONAL IfcLabel;
+ WHERE
+	WR1 : (WorkControlType <> IfcWorkControlTypeEnum.USERDEFINED) OR
+            ((WorkControlType = IfcWorkControlTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcWorkControl.UserDefinedControlType));
+END_ENTITY;
+
+ENTITY IfcWorkPlan
+ SUBTYPE OF (IfcWorkControl);
+END_ENTITY;
+
+ENTITY IfcWorkSchedule
+ SUBTYPE OF (IfcWorkControl);
+END_ENTITY;
+
+ENTITY IfcZShapeProfileDef
+ SUBTYPE OF (IfcParameterizedProfileDef);
+	Depth : IfcPositiveLengthMeasure;
+	FlangeWidth : IfcPositiveLengthMeasure;
+	WebThickness : IfcPositiveLengthMeasure;
+	FlangeThickness : IfcPositiveLengthMeasure;
+	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
+	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
+ WHERE
+	WR21 : FlangeThickness < (Depth / 2.);
+END_ENTITY;
+
+ENTITY IfcZone
+ SUBTYPE OF (IfcGroup);
+ WHERE
+	WR1 : SIZEOF (QUERY (temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects |  NOT(('IFC2X3.IFCZONE' IN TYPEOF(temp)) OR ('IFC2X3.IFCSPACE' IN TYPEOF(temp))) )) = 0;
+END_ENTITY;
+
+FUNCTION IfcAddToBeginOfList
+	(AScalar : GENERIC;
+       AList   : LIST OF GENERIC:AL)
+	: LIST[1:?] OF GENERIC:AL;
+    
+      LOCAL
+        Result : LIST OF GENERIC:AL := [];
+      END_LOCAL;
+  
+    IF NOT(EXISTS(AScalar)) THEN
+      Result := AList;
+    ELSE
+      Result := Result + AScalar;
+      IF (HIINDEX(AList) >= 1) THEN
+        REPEAT i:=1 TO HIINDEX(AList);
+          Result[i+1] := AList[i];
+        END_REPEAT;
+      END_IF;
+    END_IF;
+    RETURN(Result);
+END_FUNCTION;
+
+FUNCTION IfcBaseAxis
+	(Dim : INTEGER; 
+     Axis1, Axis2, Axis3 : IfcDirection)
+	: LIST [2:3] OF IfcDirection;
+  
+  LOCAL
+    U : LIST [2:3] OF IfcDirection;
+    Factor : REAL;
+    D1, D2 : IfcDirection;
+  END_LOCAL;
+  
+    IF (Dim = 3) THEN 
+      D1 := NVL(IfcNormalise(Axis3), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
+      D2 := IfcFirstProjAxis(D1, Axis1);
+      U  := [D2, IfcSecondProjAxis(D1, D2, Axis2), D1];
+    ELSE
+      IF EXISTS(Axis1) THEN
+        D1 := IfcNormalise(Axis1);
+        U  := [D1, IfcOrthogonalComplement(D1)];
+        IF EXISTS(Axis2) THEN
+          Factor := IfcDotProduct(Axis2, U[2]);
+          IF (Factor < 0.0) THEN
+            U[2].DirectionRatios[1] := -U[2].DirectionRatios[1];
+            U[2].DirectionRatios[2] := -U[2].DirectionRatios[2];
+          END_IF;
+        END_IF;
+      ELSE
+        IF EXISTS(Axis2) THEN
+          D1 := IfcNormalise(Axis2);
+          U  := [IfcOrthogonalComplement(D1), D1];
+          U[1].DirectionRatios[1] := -U[1].DirectionRatios[1];
+          U[1].DirectionRatios[2] := -U[1].DirectionRatios[2];
+          ELSE
+            U := [IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0, 0.0]), 
+                  IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0, 1.0])];
+        END_IF;
+      END_IF;
+    END_IF;
+    RETURN(U);
+END_FUNCTION;
+
+FUNCTION IfcBooleanChoose
+	(B : BOOLEAN ;
+       Choice1, Choice2 : Generic : Item)
+	: Generic : Item;
+    IF B THEN
+       RETURN (Choice1);
+    ELSE
+       RETURN (Choice2);
+    END_IF;
+END_FUNCTION;
+
+FUNCTION IfcBuild2Axes
+	(RefDirection : IfcDirection)
+	: LIST [2:2] OF IfcDirection;
+  LOCAL
+    D : IfcDirection := NVL(IfcNormalise(RefDirection),
+        IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0]));
+  END_LOCAL;
+    RETURN([D, IfcOrthogonalComplement(D)]);
+END_FUNCTION;
+
+FUNCTION IfcBuildAxes
+	(Axis, RefDirection : IfcDirection)
+	: LIST [3:3] OF IfcDirection;
+  LOCAL
+    D1, D2 : IfcDirection;
+  END_LOCAL;
+    D1 := NVL(IfcNormalise(Axis), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
+    D2 := IfcFirstProjAxis(D1, RefDirection);
+    RETURN ([D2, IfcNormalise(IfcCrossProduct(D1,D2)).Orientation, D1]);
+END_FUNCTION;
+
+FUNCTION IfcCorrectDimensions
+	(m   : IfcUnitEnum; Dim : IfcDimensionalExponents)
+	: LOGICAL;  
+  CASE m OF
+    LENGTHUNIT : IF
+      Dim = (IfcDimensionalExponents (1, 0, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    MASSUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 1, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    TIMEUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 1, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICCURRENTUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    THERMODYNAMICTEMPERATUREUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 1, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    AMOUNTOFSUBSTANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 1, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    LUMINOUSINTENSITYUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    PLANEANGLEUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    SOLIDANGLEUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    AREAUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 0, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    VOLUMEUNIT : IF
+      Dim = (IfcDimensionalExponents (3, 0, 0, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+  
+    ABSORBEDDOSEUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    RADIOACTIVITYUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICCAPACITANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (-2, 1, 4, 1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    DOSEEQUIVALENTUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICCHARGEUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 1, 1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICCONDUCTANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (-2, -1, 3, 2, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICVOLTAGEUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -3, -1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ELECTRICRESISTANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -3, -2, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ENERGYUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -2, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    FORCEUNIT : IF
+      Dim = (IfcDimensionalExponents (1, 1, -2, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    FREQUENCYUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    INDUCTANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -2, -2, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    ILLUMINANCEUNIT : IF
+      Dim = (IfcDimensionalExponents (-2, 0, 0, 0, 0, 0, 1))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    LUMINOUSFLUXUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    MAGNETICFLUXUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -2, -1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    MAGNETICFLUXDENSITYUNIT : IF
+      Dim = (IfcDimensionalExponents (0, 1, -2, -1, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    POWERUNIT : IF
+      Dim = (IfcDimensionalExponents (2, 1, -3, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+    PRESSUREUNIT : IF
+      Dim = (IfcDimensionalExponents (-1, 1, -2, 0, 0, 0, 0))
+        THEN RETURN(TRUE);
+        ELSE RETURN(FALSE);
+      END_IF;
+  
+    OTHERWISE :
+      RETURN (UNKNOWN);
+  END_CASE;
+END_FUNCTION;
+
+FUNCTION IfcCorrectLocalPlacement
+	(AxisPlacement:IfcAxis2Placement; 
+     RelPlacement : IfcObjectPlacement)
+	: LOGICAL;
+  
+    IF (EXISTS(RelPlacement)) THEN
+      IF ('IFC2X3.IFCGRIDPLACEMENT' IN TYPEOF(RelPlacement)) THEN
+        RETURN(?);
+      END_IF;
+      IF ('IFC2X3.IFCLOCALPLACEMENT' IN TYPEOF(RelPlacement)) THEN
+        IF ('IFC2X3.IFCAXIS2PLACEMENT2D' IN TYPEOF(AxisPlacement)) THEN
+          RETURN(TRUE);
+        END_IF;
+        IF ('IFC2X3.IFCAXIS2PLACEMENT3D' IN TYPEOF(AxisPlacement)) THEN
+          IF (RelPlacement.RelativePlacement.Dim = 3) THEN
+            RETURN(TRUE);
+          ELSE
+            RETURN(FALSE);
+          END_IF;
+        END_IF;
+      END_IF;
+    ELSE
+      RETURN(TRUE);  
+    END_IF;
+    RETURN(?);
+END_FUNCTION;
+
+FUNCTION IfcCorrectObjectAssignment
+	(Constraint: IfcObjectTypeEnum; Objects : SET[1:?] OF IfcObjectDefinition)
+	: LOGICAL;
+    
+  LOCAL
+    Count : INTEGER := 0;
+  END_LOCAL;
+  
+      IF NOT(EXISTS(Constraint)) THEN 
+        RETURN(TRUE);
+      END_IF;
+    
+      CASE Constraint OF
+        IfcObjectTypeEnum.NOTDEFINED : RETURN(TRUE);
+        IfcObjectTypeEnum.PRODUCT :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.PROCESS :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPROCESS' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.CONTROL :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCCONTROL' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.RESOURCE :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCRESOURCE' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.ACTOR :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCACTOR' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.GROUP :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCGROUP' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        IfcObjectTypeEnum.PROJECT :
+          BEGIN
+            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPROJECT' IN TYPEOF(temp))));
+            RETURN(Count = 0);
+          END;
+        OTHERWISE : RETURN(?);
+      END_CASE;
+END_FUNCTION;
+
+FUNCTION IfcCorrectUnitAssignment
+	(Units : SET [1:?] OF IfcUnit)
+	: LOGICAL;
+  
+    LOCAL
+      NamedUnitNumber    : INTEGER := 0;
+      DerivedUnitNumber  : INTEGER := 0;
+      MonetaryUnitNumber : INTEGER := 0;
+      NamedUnitNames     : SET OF IfcUnitEnum := [];
+      DerivedUnitNames   : SET OF IfcDerivedUnitEnum := [];
+    END_LOCAL;
+  
+    NamedUnitNumber    := SIZEOF(QUERY(temp <* Units | ('IFC2X3.IFCNAMEDUNIT' IN TYPEOF(temp)) AND NOT(temp.UnitType = IfcUnitEnum.USERDEFINED)));
+    DerivedUnitNumber  := SIZEOF(QUERY(temp <* Units | ('IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(temp)) AND NOT(temp.UnitType = IfcDerivedUnitEnum.USERDEFINED)));
+    MonetaryUnitNumber := SIZEOF(QUERY(temp <* Units |  'IFC2X3.IFCMONETARYUNIT' IN TYPEOF(temp)));
+  
+    REPEAT i := 1 TO SIZEOF(Units);
+      IF (('IFC2X3.IFCNAMEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i].UnitType = IfcUnitEnum.USERDEFINED)) THEN
+          NamedUnitNames := NamedUnitNames + Units[i].UnitType;
+      END_IF;
+      IF (('IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i].UnitType = IfcDerivedUnitEnum.USERDEFINED)) THEN
+          DerivedUnitNames := DerivedUnitNames + Units[i].UnitType;
+      END_IF;
+    END_REPEAT;
+  
+    RETURN((SIZEOF(NamedUnitNames) = NamedUnitNumber) AND (SIZEOF(DerivedUnitNames) = DerivedUnitNumber) AND (MonetaryUnitNumber <= 1));
+END_FUNCTION;
+
+FUNCTION IfcCrossProduct
+	(Arg1, Arg2 : IfcDirection)
+	: IfcVector;
+  LOCAL
+    Mag : REAL;
+    Res : IfcDirection;
+    V1,V2  : LIST[3:3] OF REAL;
+    Result : IfcVector;
+  END_LOCAL;
+  
+    IF (NOT EXISTS (Arg1) OR (Arg1.Dim = 2)) OR (NOT EXISTS (Arg2) OR (Arg2.Dim = 2)) THEN
+      RETURN(?);
+    ELSE
+      BEGIN
+        V1  := IfcNormalise(Arg1).DirectionRatios;
+        V2  := IfcNormalise(Arg2).DirectionRatios;
+        Res := IfcRepresentationItem() || IfcGeometricRepresentationItem () 
+               || IfcDirection([(V1[2]*V2[3] - V1[3]*V2[2]), (V1[3]*V2[1] - V1[1]*V2[3]), (V1[1]*V2[2] - V1[2]*V2[1])]);
+        Mag := 0.0;
+        REPEAT i := 1 TO 3;
+          Mag := Mag + Res.DirectionRatios[i]*Res.DirectionRatios[i];
+        END_REPEAT;
+        IF (Mag > 0.0) THEN
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Res, SQRT(Mag));
+        ELSE
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Arg1, 0.0);
+        END_IF;
+        RETURN(Result);
+      END;
+    END_IF;
+END_FUNCTION;
+
+FUNCTION IfcCurveDim
+	(Curve : IfcCurve)
+	: IfcDimensionCount;
+  
+    IF ('IFC2X3.IFCLINE' IN TYPEOF(Curve))
+      THEN RETURN(Curve.Pnt.Dim);
+    END_IF;
+    IF ('IFC2X3.IFCCONIC' IN TYPEOF(Curve))
+      THEN RETURN(Curve.Position.Dim);
+    END_IF;
+    IF ('IFC2X3.IFCPOLYLINE' IN TYPEOF(Curve))
+      THEN RETURN(Curve.Points[1].Dim);
+    END_IF;
+    IF ('IFC2X3.IFCTRIMMEDCURVE' IN TYPEOF(Curve))
+      THEN RETURN(IfcCurveDim(Curve.BasisCurve));
+    END_IF;
+    IF ('IFC2X3.IFCCOMPOSITECURVE' IN TYPEOF(Curve))
+      THEN RETURN(Curve.Segments[1].Dim);
+    END_IF;
+    IF ('IFC2X3.IFCBSPLINECURVE' IN TYPEOF(Curve))
+      THEN RETURN(Curve.ControlPointsList[1].Dim);
+    END_IF;
+    IF ('IFC2X3.IFCOFFSETCURVE2D' IN TYPEOF(Curve))
+      THEN RETURN(2); 
+    END_IF;
+    IF ('IFC2X3.IFCOFFSETCURVE3D' IN TYPEOF(Curve))
+      THEN RETURN(3);
+    END_IF;
+  RETURN (?);
+END_FUNCTION;
+
+FUNCTION IfcCurveWeightsPositive
+	(B: IfcRationalBezierCurve)
+	: BOOLEAN;
+     LOCAL
+       Result : BOOLEAN := TRUE;
+     END_LOCAL;
+  
+     REPEAT i := 0 TO B.UpperIndexOnControlPoints;
+       IF B.Weights[i] <= 0.0  THEN
+         Result := FALSE;
+         RETURN(Result);
+       END_IF;
+     END_REPEAT;
+     RETURN(Result);
+END_FUNCTION;
+
+FUNCTION IfcDeriveDimensionalExponents
+	(x : IfcUnit)
+	: IfcDimensionalExponents;  
+    LOCAL
+      Result : IfcDimensionalExponents :=
+               IfcDimensionalExponents(0, 0, 0, 0, 0, 0, 0);  
+    END_LOCAL;
+    IF 'IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(x) THEN
+      REPEAT i := LOINDEX(x.Elements) TO HIINDEX(x.Elements);
+        Result.LengthExponent :=        Result.LengthExponent +
+          (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.LengthExponent);
+        Result.MassExponent :=        Result.MassExponent  +
+          (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.MassExponent);
+        Result.TimeExponent :=        Result.TimeExponent +
+          (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.TimeExponent);
+        Result.ElectricCurrentExponent :=        Result.ElectricCurrentExponent +
+          (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.ElectricCurrentExponent);
+        Result.ThermodynamicTemperatureExponent :=
+          Result.ThermodynamicTemperatureExponent +
+          (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.ThermodynamicTemperatureExponent);
+        Result.AmountOfSubstanceExponent :=
+          Result.AmountOfSubstanceExponent +        (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.AmountOfSubstanceExponent);
+        Result.LuminousIntensityExponent :=
+          Result.LuminousIntensityExponent +        (x.Elements[i].Exponent *
+           x.Elements[i].Unit.Dimensions.LuminousIntensityExponent);
+      END_REPEAT;  
+    ELSE 
+      Result := x.Dimensions;  
+    END_IF;  
+  RETURN (Result);
+END_FUNCTION;
+
+FUNCTION IfcDimensionsForSiUnit
+	(n : IfcSiUnitName )
+	: IfcDimensionalExponents;
+    CASE n OF
+      METRE          : RETURN (IfcDimensionalExponents
+                               (1, 0, 0, 0, 0, 0, 0));
+      SQUARE_METRE   : RETURN (IfcDimensionalExponents
+                               (2, 0, 0, 0, 0, 0, 0));
+      CUBIC_METRE    : RETURN (IfcDimensionalExponents
+                               (3, 0, 0, 0, 0, 0, 0));
+      GRAM           : RETURN (IfcDimensionalExponents
+                               (0, 1, 0, 0, 0, 0, 0));
+      SECOND         : RETURN (IfcDimensionalExponents
+                               (0, 0, 1, 0, 0, 0, 0));
+      AMPERE         : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 1, 0, 0, 0));
+      KELVIN         : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 1, 0, 0));
+      MOLE           : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 1, 0));
+      CANDELA        : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 0, 1));
+      RADIAN         : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 0, 0));
+      STERADIAN      : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 0, 0));
+      HERTZ          : RETURN (IfcDimensionalExponents
+                               (0, 0, -1, 0, 0, 0, 0));
+      NEWTON         : RETURN (IfcDimensionalExponents
+                               (1, 1, -2, 0, 0, 0, 0));
+      PASCAL         : RETURN (IfcDimensionalExponents
+                               (-1, 1, -2, 0, 0, 0, 0));
+      JOULE          : RETURN (IfcDimensionalExponents
+                               (2, 1, -2, 0, 0, 0, 0));
+      WATT           : RETURN (IfcDimensionalExponents
+                               (2, 1, -3, 0, 0, 0, 0));
+      COULOMB        : RETURN (IfcDimensionalExponents
+                               (0, 0, 1, 1, 0, 0, 0));
+      VOLT           : RETURN (IfcDimensionalExponents
+                               (2, 1, -3, -1, 0, 0, 0));
+      FARAD          : RETURN (IfcDimensionalExponents
+                               (-2, -1, 4, 1, 0, 0, 0));
+      OHM            : RETURN (IfcDimensionalExponents
+                               (2, 1, -3, -2, 0, 0, 0));
+      SIEMENS        : RETURN (IfcDimensionalExponents
+                               (-2, -1, 3, 2, 0, 0, 0));
+      WEBER          : RETURN (IfcDimensionalExponents
+                               (2, 1, -2, -1, 0, 0, 0));
+      TESLA          : RETURN (IfcDimensionalExponents
+                               (0, 1, -2, -1, 0, 0, 0));
+      HENRY          : RETURN (IfcDimensionalExponents
+                               (2, 1, -2, -2, 0, 0, 0));
+      DEGREE_CELSIUS : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 1, 0, 0));
+      LUMEN          : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 0, 1));
+      LUX            : RETURN (IfcDimensionalExponents
+                               (-2, 0, 0, 0, 0, 0, 1));
+      BECQUEREL      : RETURN (IfcDimensionalExponents
+                               (0, 0, -1, 0, 0, 0, 0));
+      GRAY           : RETURN (IfcDimensionalExponents
+                               (2, 0, -2, 0, 0, 0, 0));
+      SIEVERT        : RETURN (IfcDimensionalExponents
+                               (2, 0, -2, 0, 0, 0, 0));
+      OTHERWISE      : RETURN (IfcDimensionalExponents
+                               (0, 0, 0, 0, 0, 0, 0));
+    END_CASE;
+END_FUNCTION;
+
+FUNCTION IfcDotProduct
+	(Arg1, Arg2 : IfcDirection)
+	: REAL;
+  LOCAL
+    Scalar : REAL;
+    Vec1, Vec2 : IfcDirection;
+    Ndim   : INTEGER;
+  END_LOCAL;
+  
+    IF NOT EXISTS (Arg1) OR NOT EXISTS (Arg2) THEN
+      Scalar := ?;
+    ELSE
+      IF (Arg1.Dim <> Arg2.Dim) THEN
+        Scalar := ?;
+      ELSE
+        BEGIN
+          Vec1 := IfcNormalise(Arg1);
+          Vec2 := IfcNormalise(Arg2);
+          Ndim := Arg1.Dim;
+          Scalar := 0.0;
+          REPEAT i := 1 TO Ndim;
+            Scalar := Scalar + Vec1.DirectionRatios[i]*Vec2.DirectionRatios[i];
+          END_REPEAT;
+        END;
+      END_IF;
+    END_IF;
+    RETURN (Scalar);
+END_FUNCTION;
+
+FUNCTION IfcFirstProjAxis
+	(ZAxis, Arg : IfcDirection)
+	: IfcDirection;
+  LOCAL
+    XAxis : IfcDirection;
+    V     : IfcDirection;
+    Z     : IfcDirection;
+    XVec  : IfcVector;
+  END_LOCAL;
+  
+    IF (NOT EXISTS(ZAxis)) THEN
+      RETURN (?) ;
+    ELSE
+      Z := IfcNormalise(ZAxis);
+      IF NOT EXISTS(Arg) THEN
+        IF (Z.DirectionRatios <> [1.0,0.0,0.0]) THEN
+          V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0,0.0]);
+        ELSE
+          V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
+        END_IF;
+      ELSE
+        IF (Arg.Dim <> 3) THEN
+          RETURN (?) ;
+        END_IF;
+        IF ((IfcCrossProduct(Arg,Z).Magnitude) = 0.0) THEN
+          RETURN (?);
+        ELSE
+          V := IfcNormalise(Arg);
+        END_IF;
+      END_IF;
+      XVec  := IfcScalarTimesVector(IfcDotProduct(V, Z), Z);
+      XAxis := IfcVectorDifference(V, XVec).Orientation;
+      XAxis := IfcNormalise(XAxis);
+    END_IF;
+    RETURN(XAxis);
+END_FUNCTION;
+
+FUNCTION IfcLeapYear
+	(Year : IfcYearNumber)
+	: BOOLEAN;
+  
+  IF ((((Year MOD 4) = 0) AND ((Year MOD 100) <> 0)) OR
+              ((Year MOD 400) = 0)) THEN
+    RETURN(TRUE);
+  ELSE
+    RETURN(FALSE);
+  END_IF;
+END_FUNCTION;
+
+FUNCTION IfcListToArray
+	(Lis : LIST [0:?] OF GENERIC : T;
+         Low,U : INTEGER)
+	: ARRAY OF GENERIC : T;
+     LOCAL
+       N   : INTEGER;
+       Res : ARRAY [Low:U] OF GENERIC : T;
+     END_LOCAL;
+        
+     N := SIZEOF(Lis);
+     IF (N <> (U-Low +1)) THEN
+       RETURN(?);
+     ELSE
+       Res := [Lis[1] : N];
+       REPEAT i := 2 TO N;
+         Res[Low+i-1] := Lis[i];
+       END_REPEAT;
+       RETURN(Res);
+     END_IF;
+END_FUNCTION;
+
+FUNCTION IfcLoopHeadToTail
+	(ALoop : IfcEdgeLoop)
+	: LOGICAL;
+     LOCAL
+       N : INTEGER;
+       P : LOGICAL := TRUE;
+     END_LOCAL;
+       
+       N := SIZEOF (ALoop.EdgeList);
+       REPEAT i := 2 TO N;
+         P := P AND (ALoop.EdgeList[i-1].EdgeEnd :=:
+                     ALoop.EdgeList[i].EdgeStart);
+       END_REPEAT;     
+       RETURN (P);
+END_FUNCTION;
+
+FUNCTION IfcMlsTotalThickness
+	(LayerSet : IfcMaterialLayerSet)
+	: IfcLengthMeasure;
+    LOCAL
+      Max : IfcLengthMeasure := LayerSet.MaterialLayers[1].LayerThickness;    
+    END_LOCAL;
+  
+    IF SIZEOF(LayerSet.MaterialLayers) > 1 THEN
+      REPEAT i := 2 TO HIINDEX(LayerSet.MaterialLayers);
+         Max := Max + LayerSet.MaterialLayers[i].LayerThickness;
+      END_REPEAT;
+    END_IF;
+    RETURN (Max);
+END_FUNCTION;
+
+FUNCTION IfcNoOfLayers
+	(Element : IfcElement )
+	: INTEGER;
+      
+      LOCAL
+        Association : BAG OF IfcRelAssociates := [];
+        MaterialAssociation : SET OF IfcRelAssociatesMaterial := [];
+      END_LOCAL;
+      
+      Association := USEDIN(Element, 'IFC2X3.IFCRELASSOCIATES.RELATEDOBJECTS');
+   
+      IF SIZEOF (Association) > 0 THEN
+        REPEAT i := 1 TO HIINDEX(Association);
+          IF ('IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(Association[i])) THEN 
+            MaterialAssociation := MaterialAssociation + Association[i];
+          END_IF;
+        END_REPEAT;
+      END_IF;
+      
+      IF (SIZEOF(MaterialAssociation) <> 1) THEN
+        RETURN (?);
+      ELSE
+        IF 'IFC2X3.IFCMATERIAL' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
+           RETURN (1);
+        END_IF;
+        IF 'IFC2X3.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
+           RETURN (SIZEOF(MaterialAssociation[1].RelatingMaterial.ForLayerSet.MaterialLayers));
+        END_IF;
+        IF 'IFC2X3.IFCMATERIALLIST' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
+           RETURN (?);
+        END_IF;
+      END_IF;
+    
+      RETURN (?);
+END_FUNCTION;
+
+FUNCTION IfcNormalise
+	(Arg : IfcVectorOrDirection)
+	: IfcVectorOrDirection;
+  LOCAL
+    Ndim : INTEGER;
+    V    : IfcDirection
+         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]); 
+    Vec  : IfcVector 
+         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (
+              IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]), 1.);
+    Mag  : REAL;
+    Result : IfcVectorOrDirection
+           := V;
+  END_LOCAL;
+  
+    IF NOT EXISTS (Arg) THEN
+      RETURN (?);
+    ELSE
+      Ndim := Arg.Dim;
+      IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg) THEN
+        BEGIN
+  	V.DirectionRatios := Arg.Orientation.DirectionRatios;
+          Vec.Magnitude := Arg.Magnitude;
+  	Vec.Orientation := V;
+          IF Arg.Magnitude = 0.0 THEN
+            RETURN(?);
+          ELSE
+            Vec.Magnitude := 1.0;
+          END_IF;
+        END;
+      ELSE
+        V.DirectionRatios := Arg.DirectionRatios;
+      END_IF;
+      Mag := 0.0;
+        REPEAT i := 1 TO Ndim;
+          Mag := Mag + V.DirectionRatios[i]*V.DirectionRatios[i];
+        END_REPEAT;
+      IF Mag > 0.0 THEN
+        Mag := SQRT(Mag);
+        REPEAT i := 1 TO Ndim;
+          V.DirectionRatios[i] := V.DirectionRatios[i]/Mag;
+        END_REPEAT;
+        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(arg) THEN
+          Vec.Orientation := V;
+          Result := Vec;
+        ELSE
+          Result := V;
+        END_IF;
+      ELSE
+        RETURN(?);
+      END_IF;
+    END_IF;
+    RETURN (Result);
+END_FUNCTION;
+
+FUNCTION IfcOrthogonalComplement
+	(Vec : IfcDirection)
+	: IfcDirection;
+  LOCAL
+    Result : IfcDirection ;
+  END_LOCAL;
+    IF NOT EXISTS (Vec) OR (Vec.Dim <> 2) THEN
+      RETURN(?);
+    ELSE
+      Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([-Vec.DirectionRatios[2], Vec.DirectionRatios[1]]);
+      RETURN(Result);
+    END_IF;
+END_FUNCTION;
+
+FUNCTION IfcPathHeadToTail
+	(APath : IfcPath)
+	: LOGICAL;
+     LOCAL
+       N : INTEGER := 0;
+       P : LOGICAL := UNKNOWN;
+     END_LOCAL;
+       N := SIZEOF (APath.EdgeList);
+     REPEAT i := 2 TO N;
+        P := P AND (APath.EdgeList[i-1].EdgeEnd :=:
+                    APath.EdgeList[i].EdgeStart);
+     END_REPEAT;
+     RETURN (P);
+END_FUNCTION;
+
+FUNCTION IfcSameAxis2Placement
+	(ap1, ap2 : IfcAxis2Placement; Epsilon : REAL)
+	: LOGICAL;
+  
+    RETURN (IfcSameDirection(ap1.P[1],ap2.P[1],Epsilon) AND
+            IfcSameDirection(ap1.P[2],ap2.P[2],Epsilon) AND
+            IfcSameCartesianPoint(ap1.Location,ap1.Location,Epsilon));
+END_FUNCTION;
+
+FUNCTION IfcSameCartesianPoint
+	(cp1, cp2 : IfcCartesianPoint; Epsilon : REAL)
+	: LOGICAL;
+    
+    LOCAL
+      cp1x : REAL := cp1.Coordinates[1];
+      cp1y : REAL := cp1.Coordinates[2];
+      cp1z : REAL := 0;
+      cp2x : REAL := cp2.Coordinates[1];
+      cp2y : REAL := cp2.Coordinates[2];
+      cp2z : REAL := 0;
+    END_LOCAL;
+  
+    IF (SIZEOF(cp1.Coordinates) > 2) THEN
+      cp1z := cp1.Coordinates[3];
+    END_IF;
+  
+    IF (SIZEOF(cp2.Coordinates) > 2) THEN
+      cp2z := cp2.Coordinates[3];
+    END_IF;
+  
+    RETURN (IfcSameValue(cp1x,cp2x,Epsilon) AND
+            IfcSameValue(cp1y,cp2y,Epsilon) AND
+            IfcSameValue(cp1z,cp2z,Epsilon));
+END_FUNCTION;
+
+FUNCTION IfcSameDirection
+	(dir1, dir2 : IfcDirection; Epsilon : REAL)
+	: LOGICAL;
+    LOCAL
+      dir1x : REAL := dir1.DirectionRatios[1];
+      dir1y : REAL := dir1.DirectionRatios[2];
+      dir1z : REAL := 0;
+      dir2x : REAL := dir2.DirectionRatios[1];
+      dir2y : REAL := dir2.DirectionRatios[2];
+      dir2z : REAL := 0;
+    END_LOCAL;
+  
+    IF (SIZEOF(dir1.DirectionRatios) > 2) THEN
+      dir1z := dir1.DirectionRatios[3];
+    END_IF;
+  
+    IF (SIZEOF(dir2.DirectionRatios) > 2) THEN
+      dir2z := dir2.DirectionRatios[3];
+    END_IF;
+    
+    RETURN (IfcSameValue(dir1x,dir2x,Epsilon) AND
+            IfcSameValue(dir1y,dir2y,Epsilon) AND
+            IfcSameValue(dir1z,dir2z,Epsilon));
+END_FUNCTION;
+
+FUNCTION IfcSameValidPrecision
+	(Epsilon1, Epsilon2 : REAL)
+	: LOGICAL;
+    LOCAL
+      ValidEps1, ValidEps2 : REAL;
+      DefaultEps           : REAL := 0.000001;
+      DerivationOfEps      : REAL := 1.001;
+      UpperEps             : REAL := 1.0;
+    END_LOCAL;
+    
+      ValidEps1 := NVL(Epsilon1, DefaultEps);
+      ValidEps2 := NVL(Epsilon2, DefaultEps);
+      RETURN ((0.0 < ValidEps1) AND (ValidEps1 <= (DerivationOfEps * ValidEps2)) AND 
+              (ValidEps2 <= (DerivationOfEps * ValidEps1)) AND (ValidEps2 < UpperEps));
+END_FUNCTION;
+
+FUNCTION IfcSameValue
+	(Value1, Value2 : REAL; Epsilon : REAL)
+	: LOGICAL;
+    LOCAL
+      ValidEps    : REAL;
+      DefaultEps  : REAL := 0.000001;
+    END_LOCAL;
+    
+    ValidEps := NVL(Epsilon, DefaultEps);
+    RETURN ((Value1 + ValidEps > Value2) AND (Value1 < Value2 + ValidEps));
+END_FUNCTION;
+
+FUNCTION IfcScalarTimesVector
+	(Scalar : REAL; Vec : IfcVectorOrDirection)
+	: IfcVector;
+  LOCAL
+    V : IfcDirection;
+    Mag : REAL;
+    Result : IfcVector;
+  END_LOCAL;
+  
+    IF NOT EXISTS (Scalar) OR NOT EXISTS (Vec) THEN
+      RETURN (?) ;
+    ELSE
+      IF 'IFC2X3.IFCVECTOR' IN TYPEOF (Vec) THEN
+        V := Vec.Orientation;
+        Mag := Scalar * Vec.Magnitude;
+      ELSE
+        V := Vec;
+        Mag := Scalar;
+      END_IF;
+      IF (Mag < 0.0 ) THEN
+        REPEAT i := 1 TO SIZEOF(V.DirectionRatios);
+          V.DirectionRatios[i] := -V.DirectionRatios[i];
+        END_REPEAT;
+        Mag := -Mag;
+      END_IF;
+      Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(IfcNormalise(V), Mag);
+    END_IF;
+    RETURN (Result);
+END_FUNCTION;
+
+FUNCTION IfcSecondProjAxis
+	(ZAxis, XAxis, Arg: IfcDirection)
+	: IfcDirection;
+  LOCAL
+    YAxis : IfcVector;
+    V     : IfcDirection;
+    Temp  : IfcVector;
+  END_LOCAL;
+  
+    IF NOT EXISTS(Arg) THEN
+      V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
+    ELSE
+      V := Arg;
+    END_IF;
+    Temp  := IfcScalarTimesVector(IfcDotProduct(V, ZAxis), ZAxis);
+    YAxis := IfcVectorDifference(V, Temp);
+    Temp  := IfcScalarTimesVector(IfcDotProduct(V, XAxis), XAxis);
+    YAxis := IfcVectorDifference(YAxis, Temp);
+    YAxis := IfcNormalise(YAxis);
+    RETURN(YAxis.Orientation);
+END_FUNCTION;
+
+FUNCTION IfcShapeRepresentationTypes
+	(RepType : IfcLabel; Items : SET OF IfcRepresentationItem)
+	: LOGICAL;
+      
+      LOCAL
+        Count : INTEGER := 0;
+      END_LOCAL;
+  
+      CASE RepType OF 
+      'Curve2D' :
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCCURVE' IN TYPEOF(temp)) 
+                   AND (temp.Dim = 2)));
+        END;
+      'Annotation2D' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | (
+                    SIZEOF(TYPEOF(temp) * [
+                     'IFC2X3.IFCPOINT',
+                     'IFC2X3.IFCCURVE',
+                     'IFC2X3.IFCGEOMETRICCURVESET',
+                     'IFC2X3.IFCANNOTATIONFILLAREA',
+                     'IFC2X3.IFCDEFINEDSYMBOL',
+                     'IFC2X3.IFCTEXTLITERAL',
+                     'IFC2X3.IFCDRAUGHTINGCALLOUT']) = 1)
+                   ));
+        END;
+      'GeometricSet' : 
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCSURFACE' IN TYPEOF(temp))));
+        END;
+      'GeometricCurveSet' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))));
+           REPEAT i:=1 TO HIINDEX(Items);  
+             IF ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
+             THEN
+               IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFC2X3.IFCSURFACE' IN TYPEOF(temp))) > 0)
+               THEN
+                 Count := Count - 1;
+               END_IF;
+             END_IF;
+           END_REPEAT;
+        END;
+      'SurfaceModel' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
+                     'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
+                     'IFC2X3.IFCFACEBASEDSURFACEMODEL',
+                     'IFC2X3.IFCFACETEDBREP',
+                     'IFC2X3.IFCFACETEDBREPWITHVOIDS'] * TYPEOF(temp)) >= 1
+                   ));      
+        END;
+      'SolidModel' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSOLIDMODEL' IN TYPEOF(temp))));            
+        END;
+      'SweptSolid' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSWEPTAREASOLID' IN TYPEOF(temp))));            
+        END;
+      'CSG' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANRESULT' IN TYPEOF(temp))));            
+        END;
+      'Clipping' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(temp))));            
+        END;
+      'AdvancedSweptSolid' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSURFACECURVESWEPTAREASOLID' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCSWEPTDISKSOLID' IN TYPEOF(temp))));      
+        END;
+      'Brep' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCFACETEDBREP' IN TYPEOF(temp))
+                   OR ('IFC2X3.IFCFACETEDBREPWITHVOIDS' IN TYPEOF(temp))));      
+        END;
+      'BoundingBox' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOUNDINGBOX' IN TYPEOF(temp))));
+          IF (SIZEOF(Items) > 1)
+          THEN
+            Count := 0;
+          END_IF;   
+        END;
+      'SectionedSpine' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSECTIONEDSPINE' IN TYPEOF(temp))));      
+        END;
+      'MappedRepresentation' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCMAPPEDITEM' IN TYPEOF(temp))));  
+        END;
+       OTHERWISE : RETURN(?);
+      END_CASE;
+      RETURN (Count = SIZEOF(Items));
+END_FUNCTION;
+
+FUNCTION IfcTopologyRepresentationTypes
+	(RepType : IfcLabel; Items : SET OF IfcRepresentationItem)
+	: LOGICAL;
+      
+      LOCAL
+        Count : INTEGER := 0;
+      END_LOCAL;
+  
+      CASE RepType OF 
+      'Vertex' :
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | 
+                    ('IFC2X3.IFCVERTEX' IN TYPEOF(temp))));
+        END;
+      'Edge' : 
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | 
+                    ('IFC2X3.IFCEDGE' IN TYPEOF(temp))));
+        END;
+      'Path' : 
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | 
+                    ('IFC2X3.IFCPATH' IN TYPEOF(temp))));
+        END;
+      'Face' : 
+        BEGIN 
+          Count := SIZEOF(QUERY(temp <* Items | 
+                    ('IFC2X3.IFCFACE' IN TYPEOF(temp))));
+        END;
+      'Shell' :
+        BEGIN
+          Count := SIZEOF(QUERY(temp <* Items | 
+                    ('IFC2X3.IFCOPENSHELL' IN TYPEOF(temp))
+                      OR ('IFC2X3.IFCCLOSEDSHELL' IN TYPEOF(temp))));
+        END;
+      'Undefined': RETURN(TRUE);
+       OTHERWISE : RETURN(?);
+      END_CASE;
+      RETURN (Count = SIZEOF(Items));
+END_FUNCTION;
+
+FUNCTION IfcUniquePropertyName
+	(Properties : SET [1:?] OF IfcProperty)
+	: LOGICAL;
+  
+  LOCAL
+    Names : SET OF IfcIdentifier := [];
+  END_LOCAL;
+  
+  REPEAT i:=1 TO HIINDEX(Properties);
+    Names := Names + Properties[i].Name;
+  END_REPEAT;
+  RETURN (SIZEOF(Names) = SIZEOF(Properties));
+END_FUNCTION;
+
+FUNCTION IfcValidCalendarDate
+	(Date : IfcCalendarDate)
+	: LOGICAL;
+  IF NOT ({1 <= Date.DayComponent <= 31}) THEN    
+    RETURN(FALSE);  
+  END_IF;
+  CASE Date.MonthComponent OF
+    4         : RETURN({ 1<= Date.DayComponent <= 30});
+    6         : RETURN({ 1<= Date.DayComponent <= 30});
+    9         : RETURN({ 1<= Date.DayComponent <= 30});
+    11        : RETURN({ 1<= Date.DayComponent <= 30});    
+    2         :    
+    BEGIN
+      IF (IfcLeapYear(Date.YearComponent)) THEN
+        RETURN({ 1<= Date.DayComponent <= 29});      
+      ELSE
+        RETURN({ 1<= Date.DayComponent <= 28});      
+      END_IF;    
+    END;
+    OTHERWISE : RETURN(TRUE);  
+  END_CASE;
+END_FUNCTION;
+
+FUNCTION IfcValidTime
+	(Time: IfcLocalTime)
+	: BOOLEAN;
+  IF EXISTS (Time.SecondComponent) THEN
+    RETURN (EXISTS (Time.MinuteComponent));  
+  ELSE    
+    RETURN (TRUE);  
+  END_IF;
+END_FUNCTION;
+
+FUNCTION IfcVectorDifference
+	(Arg1, Arg2 : IfcVectorOrDirection)
+	: IfcVector;
+  LOCAL
+    Result : IfcVector;
+    Res, Vec1, Vec2 : IfcDirection;
+    Mag, Mag1, Mag2 : REAL;
+    Ndim : INTEGER;
+  END_LOCAL;
+  
+    IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
+      RETURN (?) ;
+    ELSE
+      BEGIN
+        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg1) THEN
+          Mag1 := Arg1.Magnitude;
+          Vec1 := Arg1.Orientation;
+        ELSE
+          Mag1 := 1.0;
+          Vec1 := Arg1;
+        END_IF;
+        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg2) THEN
+          Mag2 := Arg2.Magnitude;
+          Vec2 := Arg2.Orientation;
+        ELSE
+          Mag2 := 1.0;
+          Vec2 := Arg2;
+        END_IF;
+        Vec1 := IfcNormalise (Vec1);
+        Vec2 := IfcNormalise (Vec2);
+        Ndim := SIZEOF(Vec1.DirectionRatios);
+        Mag  := 0.0;
+        Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);
+  
+        REPEAT i := 1 TO Ndim;
+          Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] - Mag2*Vec2.DirectionRatios[i];
+          Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
+        END_REPEAT;
+  
+        IF (Mag > 0.0 ) THEN
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
+        ELSE
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
+        END_IF;
+      END;
+    END_IF;
+    RETURN (Result);
+END_FUNCTION;
+
+FUNCTION IfcVectorSum
+	(Arg1, Arg2 : IfcVectorOrDirection)
+	: IfcVector;
+  LOCAL
+    Result : IfcVector;
+    Res, Vec1, Vec2 : IfcDirection;
+    Mag, Mag1, Mag2 : REAL;
+    Ndim : INTEGER;
+  END_LOCAL;
+  
+    IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
+      RETURN (?) ;
+    ELSE
+      BEGIN
+        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg1) THEN
+          Mag1 := Arg1.Magnitude;
+          Vec1 := Arg1.Orientation;
+        ELSE
+          Mag1 := 1.0;
+          Vec1 := Arg1;
+        END_IF;
+        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg2) THEN
+          Mag2 := Arg2.Magnitude;
+          Vec2 := Arg2.Orientation;
+        ELSE
+          Mag2 := 1.0;
+          Vec2 := Arg2;
+        END_IF;
+        Vec1 := IfcNormalise (Vec1);
+        Vec2 := IfcNormalise (Vec2);
+        Ndim := SIZEOF(Vec1.DirectionRatios);
+        Mag  := 0.0;
+        Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);
+  
+        REPEAT i := 1 TO Ndim;
+          Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] + Mag2*Vec2.DirectionRatios[i];
+          Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
+        END_REPEAT;
+  
+        IF (Mag > 0.0 ) THEN
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
+        ELSE
+          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
+        END_IF;
+      END;
+    END_IF;
+    RETURN (Result);
+END_FUNCTION;
+
+RULE IfcRepresentationContextSameWCS FOR 
+	(IfcGeometricRepresentationContext);
+    LOCAL
+      IsDifferent  : LOGICAL := FALSE;
+    END_LOCAL;
+      IF (SIZEOF(IfcGeometricRepresentationContext) > 1)
+      THEN
+        REPEAT i := 2 TO HIINDEX(IfcGeometricRepresentationContext);
+          IF (IfcGeometricRepresentationContext[1].WorldCoordinateSystem :<>: IfcGeometricRepresentationContext[i].WorldCoordinateSystem)
+          THEN
+            IsDifferent := (NOT(IfcSameValidPrecision(IfcGeometricRepresentationContext[1].Precision,
+                                                      IfcGeometricRepresentationContext[i].Precision)))
+                        OR (NOT(IfcSameAxis2Placement(IfcGeometricRepresentationContext[1].WorldCoordinateSystem,
+                                                      IfcGeometricRepresentationContext[i].WorldCoordinateSystem,
+                                                      IfcGeometricRepresentationContext[1].Precision)));
+            IF (IsDifferent = TRUE) THEN
+              ESCAPE;
+            END_IF;
+          END_IF;
+        END_REPEAT;
+      END_IF;
+    WHERE
+      WR1 : IsDifferent = FALSE;
+END_RULE;
+
+RULE IfcSingleProjectInstance FOR 
+	(IfcProject);
+    WHERE
+      WR1 : SIZEOF(IfcProject) <= 1;
+END_RULE;
+
+END_SCHEMA;

+ 50 - 52
test/regression/README

@@ -3,83 +3,81 @@ Assimp Regression Test Suite
 
 
 1) How does it work?
 1) How does it work?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
-run.py checks all model in the <root>/test/models folder and compares the result
-against a regression database provided by us (db.zip). If the test passes
-successfully, Assimp definitely WORKS perfectly on your system. A few failures
-are totally fine as well (see sections 7+). You need to worry if a huge
-majority of all files in a particular format or post-processing configuration 
-fails - this might be a sign of a recent regression in assimp's codebase. 
+run.py checks all model in the <root>/test/models* folders and compares the result
+against a regression database provided with assimp (db.zip). A few failures
+are totally fine (see sections 7+). You need to worry if a huge
+majority of all files in a particular format (or post-processing configuration)
+fails as this might be a sign of a recent regression in assimp's codebase or
+gross incompatibility with your system or compiler. 
 
 
 2) What do I need?
 2) What do I need?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
- - you need Python installed - 3.x !!
- - you need to build tools/assimp_cmd as described in the INSTALL file (
-	make && make install on unixes,release-dll target with msvc).
+ - You need Python installed (2.7+, 3.x). On Windows, run the scripts using "py".
+ - You need to build the assimp command line tool (ASSIMP_BUILD_ASSIMP_TOOLS
+   CMake build flag). Both run.py and gen_db.py take the full path to the binary
+   as first command line parameter.
 
 
 3) How to add more test files?
 3) How to add more test files?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
 Use the following procedure:
 Use the following procedure:
- - verify the correctness of your assimp build - run the regression suite.
-   DO NOT continue if one or more tests fail.
- - add your additional test files to <root>/test/models/<fileformat>, where
-   <fileformat> is the file type (typically the file extension)
- - rebuild the regression database using gen_db.py
- - run the regression suite again - all tests should pass, including
-   those for the new files.
-
- - contributors: commit the db.zip plus your additional test files to
-   the SVN repository. 
-
-4) I made a change/fix/.. to a loader, how to update the database?
+ - Verify the correctness of your assimp build - run the regression suite.
+   DO NOT continue if more tests fail than usual.
+ - Add your additional test files to <root>/test/models/<fileformat>, where
+   <fileformat> is the file type (typically the file extension).
+ - If you test file does not meet the BSD license requirements, add it to
+   <root>/test/models-nonbsd/<fileformat> so people know to be careful with it.
+ - Rebuild the regression database:
+   "gen_db.py <binary> -ixyz" where .xyz is the file extension of the new file.
+ - Run the regression suite again. There should be no new failures and the new
+   file should not be among the failures.
+ - Include the db.zip file with your Pull Request. Travis CI enforces a passing
+   regression suite (with offenders whitelisted as a last resort).
+
+4) I made a change/fix/patch to a loader, how to update the database?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
- - rebuild the regression database using gen_db.py
- - run the suite - all tests should pass now. If they do not, don't continue
- 
- - contributors: commit the db.zip to the SVN repository 
-
-5) How to add my whole model repository to the suite?
+ - Rebuild the regression database using "gen_db.py <binary> -ixyz"
+   where .xyz is the file extension for which the loader was patched.
+ - Run the regression suite again. There should be no new failures and the new
+   file should not be among the failures.
+ - Include the db.zip file with your Pull Request. Travis CI enforces a passing
+   regression suite (with offenders whitelisted as a last resort).
+
+5) How to add my whole model repository to the database?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
 
 
 Edit the reg_settings.py file and add the path to your repository to
 Edit the reg_settings.py file and add the path to your repository to
-<<model_directories>>. Then, rebuild the suite.
+<<model_directories>>. Then, rebuild the database.
 
 
-6) So what is actually verified?
+6) So what is actually tested?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
-The regression database includes mini dumps of the aiScene data structure -
+The regression database includes mini dumps of the aiScene data structure, i.e.
 the scene hierarchy plus the sizes of all data arrays MUST match. Floating-point
 the scene hierarchy plus the sizes of all data arrays MUST match. Floating-point
-data buffers, such as vertex positions, are handled less strictly: min,max and
-average values are stored with lower precision. This takes hardware- or 
+data buffers, such as vertex positions are handled less strictly: min, max and
+average values are stored with low precision. This takes hardware- or 
 compiler-specific differences in floating-point computations into account. 
 compiler-specific differences in floating-point computations into account. 
 Generally, almost all significant regressions will be detected while the
 Generally, almost all significant regressions will be detected while the
 number of false positives is relatively low.
 number of false positives is relatively low.
 
 
 7) The test suite fails, what do do?
 7) The test suite fails, what do do?
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
-Get back to ../results and check out regression_suite_failures.txt 
-It contains a list of all files which failed the test ... they're copied to
-../results/tmp. Both an EXPECTED and an ACTUAL file is produced per test.
-The output of `assimp cmpdump` is written to regressions_suite_output.txt. 
-To quickly find all all reports pertaining to tests which failed, I'd
-recommend grepping for 'but' because its a constituent of all error messages
-produced by assimp_cmd :) Error reports contain detailed information
-regarding the point of failure inside the data structure, the values of
-the two corresponding fields that were found to be different from EXPECTED
-and ACTUAL, respectively, ... this should offer you enough information to start
-debugging.
+Get back to <root>/test/results and look at regression_suite_failures.txt.
+It contains a list of all files which failed the test. Failing dumps are copied to
+root>/test/results/tmp. Both an EXPECTED and an ACTUAL file is produced per test.
+The output of "assimp cmpdump" is written to regressions_suite_output.txt. Grep
+for the file name in question and locate the log for the failed comparison. It
+contains a full trace of which scene elements have been compared before, which
+makes it reasonably easy to locate the offending field.
 
 
 8) fp:fast vs fp:precise fails the test suite (same for gcc equivalents)
 8) fp:fast vs fp:precise fails the test suite (same for gcc equivalents)
 ---------------------------------------------------------------------------------
 ---------------------------------------------------------------------------------
 As mentioned above, floating-point inaccuracies between differently optimized
 As mentioned above, floating-point inaccuracies between differently optimized
 builds are not considered regressions and all float comparisons done by the test
 builds are not considered regressions and all float comparisons done by the test
-suite involve an epsilon. Changing floating-point optimizations can, however,
- lead to *real* changes in the output data structure, such as different number 
-of vertices or faces, ... this violates one of our primary targets, that is
-produce reliable and portable output. We're working hard on removing these
-issues, but at the moment you have to live with few of them.
-
-Currently, the regression database is build on Windows using MSVC8 with 
-fp:precise. This leads to a small number of failures with fp:fast and
-virtally every build with gcc. Be patient, it will be fixed.
+suite involve an epsilon to accomodate. However compiler settings that allow
+compilers to perform non-IEEE754 compliant optimizations can cause arbitrary
+failures in the test suite. Even if the compiler is configured to be IEE754
+comformant, there is lots of code in assimp that leaves the compiler a choice
+and different compilers make different choices (for example the precision of
+float intermediaries is implementation-specified).
 
 
 
 
 
 

+ 15 - 13
test/regression/gen_db.py

@@ -69,6 +69,9 @@ configs for an IDE, make sure to build the assimp_cmd project.
 
 
 -i,--include: List of file extensions to update dumps for. If omitted,
 -i,--include: List of file extensions to update dumps for. If omitted,
          all file extensions are updated except those in `exclude`.
          all file extensions are updated except those in `exclude`.
+         Example: -ixyz,abc
+                  -i.xyz,.abc
+                  --include=xyz,abc
 
 
 -e,--exclude: Merged with settings.exclude_extensions to produce a
 -e,--exclude: Merged with settings.exclude_extensions to produce a
          list of all file extensions to ignore. If dumps exist,
          list of all file extensions to ignore. If dumps exist,
@@ -78,8 +81,6 @@ configs for an IDE, make sure to build the assimp_cmd project.
          Dont' change anything.
          Dont' change anything.
 
 
 -n,--nozip: Don't pack to ZIP archive. Keep all dumps in individual files.
 -n,--nozip: Don't pack to ZIP archive. Keep all dumps in individual files.
-
-(lists of file extensions are comma delimited, i.e. `3ds,lwo,x`)
 """
 """
 
 
 # -------------------------------------------------------------------------------
 # -------------------------------------------------------------------------------
@@ -172,30 +173,32 @@ def gen_db(ext_list,outfile):
 
 
 # -------------------------------------------------------------------------------
 # -------------------------------------------------------------------------------
 if __name__ == "__main__":
 if __name__ == "__main__":
-    assimp_bin_path = sys.argv[1] if len(sys.argv) > 1 else 'assimp'
-
     def clean(f):
     def clean(f):
         f = f.strip("* \'")
         f = f.strip("* \'")
         return "."+f if f[:1] != '.' else f
         return "."+f if f[:1] != '.' else f
 
 
-    if len(sys.argv)>1 and (sys.argv[1] == "--help" or sys.argv[1] == "-h"):
+    if len(sys.argv) <= 1 or sys.argv[1] == "--help" or sys.argv[1] == "-h":
         print(usage)
         print(usage)
         sys.exit(0)
         sys.exit(0)
 
 
+    assimp_bin_path = sys.argv[1]    
     ext_list, preview, nozip = None, False, False
     ext_list, preview, nozip = None, False, False
-    for m in sys.argv[1:]:
+    for m in sys.argv[2:]:
         if m[:10]=="--exclude=":
         if m[:10]=="--exclude=":
             settings.exclude_extensions += map(clean, m[10:].split(","))
             settings.exclude_extensions += map(clean, m[10:].split(","))
-        elif m[:3]=="-e=":
-            settings.exclude_extensions += map(clean, m[3:].split(","))
+        elif m[:2]=="-e":
+            settings.exclude_extensions += map(clean, m[2:].split(","))
         elif m[:10]=="--include=":
         elif m[:10]=="--include=":
             ext_list = m[10:].split(",")
             ext_list = m[10:].split(",")
-        elif m[:3]=="-i=":
-            ext_list = m[3:].split(",")
+        elif m[:2]=="-i":
+            ext_list = m[2:].split(",")
         elif m=="-p" or m == "--preview":
         elif m=="-p" or m == "--preview":
             preview = True
             preview = True
         elif m=="-n" or m == "--nozip":
         elif m=="-n" or m == "--nozip":
             nozip = True
             nozip = True
+        else:
+            print("Unrecognized parameter: " + m)
+            sys.exit(-1)
             
             
     outfile = open(os.path.join("..", "results", "gen_regression_db_output.txt"), "w")
     outfile = open(os.path.join("..", "results", "gen_regression_db_output.txt"), "w")
     if ext_list is None:
     if ext_list is None:
@@ -206,9 +209,8 @@ if __name__ == "__main__":
     # todo: Fix for multi dot extensions like .skeleton.xml
     # todo: Fix for multi dot extensions like .skeleton.xml
     ext_list = list(filter(lambda f: not f in settings.exclude_extensions,
     ext_list = list(filter(lambda f: not f in settings.exclude_extensions,
         map(clean, ext_list)))
         map(clean, ext_list)))
-
-    if preview:
-        print(','.join(ext_list))
+    print('File extensions processed: ' + ', '.join(ext_list))
+    if preview:       
         sys.exit(1)
         sys.exit(1)
 
 
     extract_zip()    
     extract_zip()    

部分文件因为文件数量过多而无法显示