Browse Source

- IFC reader regenerated from schema to include IfcArbitraryProfileDefWithVoids
- implemented IfcArbitraryProfileDefWithVoids to fix solar panel covers in test\models-nonbsd\IFC\rac_basic_sample_project.ifc
- warning: another dirty hack on top of dirty hacks - one day all these CSG implementations will blow up in our faces. Mark my words.

ulf 10 years ago
parent
commit
806d3ac8e1
6 changed files with 11784 additions and 2164 deletions
  1. 95 76
      code/IFCGeometry.cpp
  2. 896 896
      code/IFCReaderGen.cpp
  3. 1216 1188
      code/IFCReaderGen.h
  4. 1 0
      code/IFCUtil.h
  5. 5 4
      scripts/IFCImporter/entitylist.txt
  6. 9571 0
      scripts/IFCImporter/schema.exp

+ 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();

File diff suppressed because it is too large
+ 896 - 896
code/IFCReaderGen.cpp


File diff suppressed because it is too large
+ 1216 - 1188
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);

+ 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;

Some files were not shown because too many files changed in this diff