Ver Fonte

Merge pull request #2151 from assimp/kimmi_dev

Kimmi dev
Kim Kulling há 7 anos atrás
pai
commit
d585030310
59 ficheiros alterados com 810 adições e 13252 exclusões
  1. 14 16
      code/3DSHelper.h
  2. 64 184
      code/AMFImporter.hpp
  3. 59 41
      code/AMFImporter_Material.cpp
  4. 62 123
      code/AMFImporter_Node.hpp
  5. 46 67
      code/ASEParser.h
  6. 1 1
      code/BaseImporter.cpp
  7. 1 1
      code/BaseProcess.cpp
  8. 2 6
      code/BaseProcess.h
  9. 1 3
      code/COBLoader.cpp
  10. 1 1
      code/EmbedTexturesProcess.cpp
  11. 2 2
      code/Importer.h
  12. 19 20
      code/LWOAnimation.h
  13. 7 7
      code/LWOFileData.h
  14. 1 1
      code/LimitBoneWeightsProcess.h
  15. 2 2
      code/MD3Loader.h
  16. 7 7
      code/MD5Parser.h
  17. 26 38
      code/MDCFileData.h
  18. 16 21
      code/MDLFileData.h
  19. 10 8
      code/OptimizeMeshes.h
  20. 19 13
      code/PlyParser.h
  21. 21 20
      code/SMDLoader.h
  22. 2 2
      code/ScenePrivate.h
  23. 16 17
      code/TextureTransform.h
  24. 76 42
      code/XFileHelper.h
  25. 1 2
      contrib/irrXML/irrArray.h
  26. 2 4
      include/assimp/BaseImporter.h
  27. 2 3
      include/assimp/ByteSwapper.h
  28. 11 13
      include/assimp/DefaultIOStream.h
  29. 2 2
      include/assimp/IOStream.hpp
  30. 2 5
      include/assimp/IOSystem.hpp
  31. 3 3
      include/assimp/LogStream.hpp
  32. 7 5
      include/assimp/Logger.hpp
  33. 1 1
      include/assimp/ProgressHandler.hpp
  34. 20 12
      include/assimp/SGSpatialSort.h
  35. 4 6
      include/assimp/SmoothingGroups.h
  36. 1 1
      include/assimp/SpatialSort.h
  37. 16 16
      include/assimp/anim.h
  38. 1 1
      include/assimp/camera.h
  39. 1 1
      include/assimp/color4.h
  40. 10 0
      include/assimp/defs.h
  41. 1 1
      include/assimp/fast_atof.h
  42. 1 1
      include/assimp/light.h
  43. 2 2
      include/assimp/material.h
  44. 1 1
      include/assimp/matrix3x3.h
  45. 1 1
      include/assimp/matrix4x4.h
  46. 2 2
      include/assimp/matrix4x4.inl
  47. 102 88
      include/assimp/mesh.h
  48. 3 3
      include/assimp/metadata.h
  49. 1 1
      include/assimp/quaternion.h
  50. 12 11
      include/assimp/texture.h
  51. 10 13
      include/assimp/types.h
  52. 1 1
      include/assimp/vector3.h
  53. 1 6
      scripts/StepImporter/CppGenerator.py
  54. 0 12401
      scripts/StepImporter/schema_ifc4.exp
  55. 1 0
      test/CMakeLists.txt
  56. 38 0
      test/models/AMF/test_with_mat.amf
  57. 64 0
      test/unit/ImportExport/utCOBImportExport.cpp
  58. 9 1
      test/unit/utAMFImportExport.cpp
  59. 1 1
      test/unit/utSceneCombiner.cpp

+ 14 - 16
code/3DSHelper.h

@@ -66,7 +66,7 @@ namespace D3DS  {
 */
 */
 class Discreet3DS {
 class Discreet3DS {
 private:
 private:
-    Discreet3DS() {
+    Discreet3DS() AI_NO_EXCEPT {
         // empty
         // empty
     }
     }
 
 
@@ -328,19 +328,17 @@ struct Face : public FaceWithSmoothingGroup
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure representing a texture */
 /** Helper structure representing a texture */
-struct Texture
-{
+struct Texture {
     //! Default constructor
     //! Default constructor
-    Texture()
-        : mOffsetU  (0.0)
-        , mOffsetV  (0.0)
-        , mScaleU   (1.0)
-        , mScaleV   (1.0)
-        , mRotation (0.0)
-        , mMapMode  (aiTextureMapMode_Wrap)
-        , bPrivate()
-        , iUVSrc    (0)
-    {
+    Texture() AI_NO_EXCEPT
+    : mOffsetU  (0.0)
+    , mOffsetV  (0.0)
+    , mScaleU   (1.0)
+    , mScaleV   (1.0)
+    , mRotation (0.0)
+    , mMapMode  (aiTextureMapMode_Wrap)
+    , bPrivate()
+    , iUVSrc    (0) {
         mTextureBlend = get_qnan();
         mTextureBlend = get_qnan();
     }
     }
 
 
@@ -394,7 +392,7 @@ struct Material
 
 
 
 
     //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it
     //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it
-    Material(Material &&other)
+    Material(Material &&other) AI_NO_EXCEPT
     : mName(std::move(other.mName))
     : mName(std::move(other.mName))
     , mDiffuse(std::move(other.mDiffuse))
     , mDiffuse(std::move(other.mDiffuse))
     , mSpecularExponent(std::move(other.mSpecularExponent))
     , mSpecularExponent(std::move(other.mSpecularExponent))
@@ -418,7 +416,7 @@ struct Material
     }
     }
 
 
 
 
-    Material &operator=(Material &&other) {
+    Material &operator=(Material &&other) AI_NO_EXCEPT {
         if (this == &other) {
         if (this == &other) {
             return *this;
             return *this;
         }
         }
@@ -447,7 +445,7 @@ struct Material
     }
     }
 
 
 
 
-    ~Material() {}
+    virtual ~Material() {}
 
 
 
 
     //! Name of the material
     //! Name of the material

+ 64 - 184
code/AMFImporter.hpp

@@ -63,8 +63,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // Header files, stdlib.
 // Header files, stdlib.
 #include <set>
 #include <set>
 
 
-namespace Assimp
-{
+namespace Assimp {
+
 /// \class AMFImporter
 /// \class AMFImporter
 /// Class that holding scene graph which include: geometry, metadata, materials etc.
 /// Class that holding scene graph which include: geometry, metadata, materials etc.
 ///
 ///
@@ -99,100 +99,49 @@ namespace Assimp
 ///            new - <texmap> and children <utex1>, <utex2>, <utex3>, <vtex1>, <vtex2>, <vtex3>
 ///            new - <texmap> and children <utex1>, <utex2>, <utex3>, <vtex1>, <vtex2>, <vtex3>
 ///            old - <map> and children <u1>, <u2>, <u3>, <v1>, <v2>, <v3>
 ///            old - <map> and children <u1>, <u2>, <u3>, <v1>, <v2>, <v3>
 ///
 ///
-class AMFImporter : public BaseImporter
-{
-	/***********************************************/
-	/******************** Types ********************/
-	/***********************************************/
-
+class AMFImporter : public BaseImporter {
 private:
 private:
+    struct SPP_Material;// forward declaration
+
+                        /// \struct SPP_Composite
+                        /// Data type for post-processing step. More suitable container for part of material's composition.
+    struct SPP_Composite {
+        SPP_Material* Material;///< Pointer to material - part of composition.
+        std::string Formula;///< Formula for calculating ratio of \ref Material.
+    };
+
+    /// \struct SPP_Material
+    /// Data type for post-processing step. More suitable container for material.
+    struct SPP_Material {
+        std::string ID;///< Material ID.
+        std::list<CAMFImporter_NodeElement_Metadata*> Metadata;///< Metadata of material.
+        CAMFImporter_NodeElement_Color* Color;///< Color of material.
+        std::list<SPP_Composite> Composition;///< List of child materials if current material is composition of few another.
+
+        /// Return color calculated for specified coordinate.
+        /// \param [in] pX - "x" coordinate.
+        /// \param [in] pY - "y" coordinate.
+        /// \param [in] pZ - "z" coordinate.
+        /// \return calculated color.
+        aiColor4D GetColor(const float pX, const float pY, const float pZ) const;
+    };
+
+    /// Data type for post-processing step. More suitable container for texture.
+    struct SPP_Texture {
+        std::string ID;
+        size_t      Width, Height, Depth;
+        bool        Tiled;
+        char        FormatHint[9];// 8 for string + 1 for terminator.
+        uint8_t    *Data;
+    };
+
+    /// Data type for post-processing step. Contain face data.
+    struct SComplexFace {
+        aiFace Face;///< Face vertices.
+        const CAMFImporter_NodeElement_Color* Color;///< Face color. Equal to nullptr if color is not set for the face.
+        const CAMFImporter_NodeElement_TexMap* TexMap;///< Face texture mapping data. Equal to nullptr if texture mapping is not set for the face.
+    };
 
 
-	struct SPP_Material;// forward declaration
-
-	/// \struct SPP_Composite
-	/// Data type for postprocessing step. More suitable container for part of material's composition.
-	struct SPP_Composite
-	{
-		SPP_Material* Material;///< Pointer to material - part of composition.
-		std::string Formula;///< Formula for calculating ratio of \ref Material.
-	};
-
-	/// \struct SPP_Material
-	/// Data type for postprocessing step. More suitable container for material.
-	struct SPP_Material
-	{
-		std::string ID;///< Material ID.
-		std::list<CAMFImporter_NodeElement_Metadata*> Metadata;///< Metadata of material.
-		CAMFImporter_NodeElement_Color* Color;///< Color of material.
-		std::list<SPP_Composite> Composition;///< List of child materials if current material is composition of few another.
-
-		/// \fn aiColor4D GetColor(const float pX, const float pY, const float pZ) const
-		/// Return color calculated for specified coordinate.
-		/// \param [in] pX - "x" coordinate.
-		/// \param [in] pY - "y" coordinate.
-		/// \param [in] pZ - "z" coordinate.
-		/// \return calculated color.
-		aiColor4D GetColor(const float pX, const float pY, const float pZ) const;
-	};
-
-	/// \struct SPP_Texture
-	/// Data type for post-processing step. More suitable container for texture.
-	struct SPP_Texture
-	{
-		std::string ID;
-		size_t      Width, Height, Depth;
-		bool        Tiled;
-        char        FormatHint[ 9 ];// 8 for string + 1 for terminator.
-		uint8_t    *Data;
-	};
-
-	///	\struct SComplexFace
-	/// Data type for post-processing step. Contain face data.
-	struct SComplexFace
-	{
-		aiFace Face;///< Face vertices.
-		const CAMFImporter_NodeElement_Color* Color;///< Face color. Equal to nullptr if color is not set for the face.
-		const CAMFImporter_NodeElement_TexMap* TexMap;///< Face texture mapping data. Equal to nullptr if texture mapping is not set for the face.
-	};
-
-
-
-	/***********************************************/
-	/****************** Constants ******************/
-	/***********************************************/
-
-private:
-
-	static const aiImporterDesc Description;
-
-	/***********************************************/
-	/****************** Variables ******************/
-	/***********************************************/
-
-private:
-
-    CAMFImporter_NodeElement* mNodeElement_Cur;///< Current element.
-    std::list<CAMFImporter_NodeElement*> mNodeElement_List;///< All elements of scene graph.
-	irr::io::IrrXMLReader* mReader;///< Pointer to XML-reader object
-	std::string mUnit;
-	std::list<SPP_Material> mMaterial_Converted;///< List of converted materials for postprocessing step.
-	std::list<SPP_Texture> mTexture_Converted;///< List of converted textures for postprocessing step.
-
-	/***********************************************/
-	/****************** Functions ******************/
-	/***********************************************/
-
-private:
-
-	/// \fn AMFImporter(const AMFImporter& pScene)
-	/// Disabled copy constructor.
-	AMFImporter(const AMFImporter& pScene);
-
-	/// \fn AMFImporter& operator=(const AMFImporter& pScene)
-	/// Disabled assign operator.
-	AMFImporter& operator=(const AMFImporter& pScene);
-
-	/// \fn void Clear()
 	/// Clear all temporary data.
 	/// Clear all temporary data.
 	void Clear();
 	void Clear();
 
 
@@ -200,7 +149,6 @@ private:
 	/************* Functions: find set *************/
 	/************* Functions: find set *************/
 	/***********************************************/
 	/***********************************************/
 
 
-	/// \fn bool Find_NodeElement(const std::string& pID, const CAMFImporter_NodeElement::EType pType, aiNode** pNode) const
 	/// Find specified node element in node elements list ( \ref mNodeElement_List).
 	/// Find specified node element in node elements list ( \ref mNodeElement_List).
 	/// \param [in] pID - ID(name) of requested node element.
 	/// \param [in] pID - ID(name) of requested node element.
 	/// \param [in] pType - type of node element.
 	/// \param [in] pType - type of node element.
@@ -208,7 +156,6 @@ private:
 	/// \return true - if the node element is found, else - false.
 	/// \return true - if the node element is found, else - false.
 	bool Find_NodeElement(const std::string& pID, const CAMFImporter_NodeElement::EType pType, CAMFImporter_NodeElement** pNodeElement) const;
 	bool Find_NodeElement(const std::string& pID, const CAMFImporter_NodeElement::EType pType, CAMFImporter_NodeElement** pNodeElement) const;
 
 
-	/// \fn bool Find_ConvertedNode(const std::string& pID, std::list<aiNode*>& pNodeList, aiNode** pNode) const
 	/// Find requested aiNode in node list.
 	/// Find requested aiNode in node list.
 	/// \param [in] pID - ID(name) of requested node.
 	/// \param [in] pID - ID(name) of requested node.
 	/// \param [in] pNodeList - list of nodes where to find the node.
 	/// \param [in] pNodeList - list of nodes where to find the node.
@@ -216,15 +163,13 @@ private:
 	/// \return true - if the node is found, else - false.
 	/// \return true - if the node is found, else - false.
 	bool Find_ConvertedNode(const std::string& pID, std::list<aiNode*>& pNodeList, aiNode** pNode) const;
 	bool Find_ConvertedNode(const std::string& pID, std::list<aiNode*>& pNodeList, aiNode** pNode) const;
 
 
-	/// \fn bool Find_ConvertedMaterial(const std::string& pID, const SPP_Material** pConvertedMaterial) const
 	/// Find material in list for converted materials. Use at postprocessing step.
 	/// Find material in list for converted materials. Use at postprocessing step.
 	/// \param [in] pID - material ID.
 	/// \param [in] pID - material ID.
 	/// \param [out] pConvertedMaterial - pointer to found converted material (\ref SPP_Material).
 	/// \param [out] pConvertedMaterial - pointer to found converted material (\ref SPP_Material).
 	/// \return true - if the material is found, else - false.
 	/// \return true - if the material is found, else - false.
 	bool Find_ConvertedMaterial(const std::string& pID, const SPP_Material** pConvertedMaterial) const;
 	bool Find_ConvertedMaterial(const std::string& pID, const SPP_Material** pConvertedMaterial) const;
 
 
-	/// \fn bool Find_ConvertedTexture(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A, uint32_t* pConvertedTextureIndex = nullptr) const
-	/// Find texture in list of converted textures. Use at postprocessing step,
+    /// Find texture in list of converted textures. Use at postprocessing step,
 	/// \param [in] pID_R - ID of source "red" texture.
 	/// \param [in] pID_R - ID of source "red" texture.
 	/// \param [in] pID_G - ID of source "green" texture.
 	/// \param [in] pID_G - ID of source "green" texture.
 	/// \param [in] pID_B - ID of source "blue" texture.
 	/// \param [in] pID_B - ID of source "blue" texture.
@@ -235,11 +180,7 @@ private:
 	bool Find_ConvertedTexture(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A,
 	bool Find_ConvertedTexture(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A,
 								uint32_t* pConvertedTextureIndex = nullptr) const;
 								uint32_t* pConvertedTextureIndex = nullptr) const;
 
 
-	/***********************************************/
-	/********* Functions: postprocess set **********/
-	/***********************************************/
 
 
-	/// \fn void PostprocessHelper_CreateMeshDataArray(const CAMFImporter_NodeElement_Mesh& pNodeElement, std::vector<aiVector3D>& pVertexCoordinateArray, std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray) const
 	/// Get data stored in <vertices> and place it to arrays.
 	/// Get data stored in <vertices> and place it to arrays.
 	/// \param [in] pNodeElement - reference to node element which kept <object> data.
 	/// \param [in] pNodeElement - reference to node element which kept <object> data.
 	/// \param [in] pVertexCoordinateArray - reference to vertices coordinates kept in <vertices>.
 	/// \param [in] pVertexCoordinateArray - reference to vertices coordinates kept in <vertices>.
@@ -248,7 +189,6 @@ private:
 	void PostprocessHelper_CreateMeshDataArray(const CAMFImporter_NodeElement_Mesh& pNodeElement, std::vector<aiVector3D>& pVertexCoordinateArray,
 	void PostprocessHelper_CreateMeshDataArray(const CAMFImporter_NodeElement_Mesh& pNodeElement, std::vector<aiVector3D>& pVertexCoordinateArray,
 												std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray) const;
 												std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray) const;
 
 
-	/// \fn size_t PostprocessHelper_GetTextureID_Or_Create(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A)
 	/// Return converted texture ID which related to specified source textures ID's. If converted texture does not exist then it will be created and ID on new
 	/// Return converted texture ID which related to specified source textures ID's. If converted texture does not exist then it will be created and ID on new
 	/// converted texture will be returned. Conversion: set of textures from \ref CAMFImporter_NodeElement_Texture to one \ref SPP_Texture and place it
 	/// converted texture will be returned. Conversion: set of textures from \ref CAMFImporter_NodeElement_Texture to one \ref SPP_Texture and place it
 	/// to converted textures list.
 	/// to converted textures list.
@@ -260,27 +200,23 @@ private:
 	/// \return index of the texture in array of the converted textures.
 	/// \return index of the texture in array of the converted textures.
 	size_t PostprocessHelper_GetTextureID_Or_Create(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A);
 	size_t PostprocessHelper_GetTextureID_Or_Create(const std::string& pID_R, const std::string& pID_G, const std::string& pID_B, const std::string& pID_A);
 
 
-	/// \fn void PostprocessHelper_SplitFacesByTextureID(std::list<SComplexFace>& pInputList, std::list<std::list<SComplexFace> > pOutputList_Separated)
 	/// Separate input list by texture IDs. This step is needed because aiMesh can contain mesh which is use only one texture (or set: diffuse, bump etc).
 	/// Separate input list by texture IDs. This step is needed because aiMesh can contain mesh which is use only one texture (or set: diffuse, bump etc).
 	/// \param [in] pInputList - input list with faces. Some of them can contain color or texture mapping, or both of them, or nothing. Will be cleared after
 	/// \param [in] pInputList - input list with faces. Some of them can contain color or texture mapping, or both of them, or nothing. Will be cleared after
 	/// processing.
 	/// processing.
 	/// \param [out] pOutputList_Separated - output list of the faces lists. Separated faces list by used texture IDs. Will be cleared before processing.
 	/// \param [out] pOutputList_Separated - output list of the faces lists. Separated faces list by used texture IDs. Will be cleared before processing.
 	void PostprocessHelper_SplitFacesByTextureID(std::list<SComplexFace>& pInputList, std::list<std::list<SComplexFace> >& pOutputList_Separated);
 	void PostprocessHelper_SplitFacesByTextureID(std::list<SComplexFace>& pInputList, std::list<std::list<SComplexFace> >& pOutputList_Separated);
 
 
-	/// \fn void Postprocess_AddMetadata(const std::list<CAMFImporter_NodeElement_Metadata*>& pMetadataList, aiNode& pSceneNode) const
 	/// Check if child elements of node element is metadata and add it to scene node.
 	/// Check if child elements of node element is metadata and add it to scene node.
 	/// \param [in] pMetadataList - reference to list with collected metadata.
 	/// \param [in] pMetadataList - reference to list with collected metadata.
 	/// \param [out] pSceneNode - scene node in which metadata will be added.
 	/// \param [out] pSceneNode - scene node in which metadata will be added.
 	void Postprocess_AddMetadata(const std::list<CAMFImporter_NodeElement_Metadata*>& pMetadataList, aiNode& pSceneNode) const;
 	void Postprocess_AddMetadata(const std::list<CAMFImporter_NodeElement_Metadata*>& pMetadataList, aiNode& pSceneNode) const;
 
 
-	/// \fn void Postprocess_BuildNodeAndObject(const CAMFImporter_NodeElement_Object& pNodeElement, std::list<aiMesh*>& pMeshList, aiNode** pSceneNode)
 	/// To create aiMesh and aiNode for it from <object>.
 	/// To create aiMesh and aiNode for it from <object>.
 	/// \param [in] pNodeElement - reference to node element which kept <object> data.
 	/// \param [in] pNodeElement - reference to node element which kept <object> data.
 	/// \param [out] pMeshList - reference to a list with all aiMesh of the scene.
 	/// \param [out] pMeshList - reference to a list with all aiMesh of the scene.
 	/// \param [out] pSceneNode - pointer to place where new aiNode will be created.
 	/// \param [out] pSceneNode - pointer to place where new aiNode will be created.
 	void Postprocess_BuildNodeAndObject(const CAMFImporter_NodeElement_Object& pNodeElement, std::list<aiMesh*>& pMeshList, aiNode** pSceneNode);
 	void Postprocess_BuildNodeAndObject(const CAMFImporter_NodeElement_Object& pNodeElement, std::list<aiMesh*>& pMeshList, aiNode** pSceneNode);
 
 
-	/// \fn void Postprocess_BuildMeshSet(const CAMFImporter_NodeElement_Mesh& pNodeElement, const std::vector<aiVector3D>& pVertexCoordinateArray, const std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray, const CAMFImporter_NodeElement_Color* pObjectColor, std::list<aiMesh*>& pMeshList, aiNode& pSceneNode)
 	/// Create mesh for every <volume> in <mesh>.
 	/// Create mesh for every <volume> in <mesh>.
 	/// \param [in] pNodeElement - reference to node element which kept <mesh> data.
 	/// \param [in] pNodeElement - reference to node element which kept <mesh> data.
 	/// \param [in] pVertexCoordinateArray - reference to vertices coordinates for all <volume>'s.
 	/// \param [in] pVertexCoordinateArray - reference to vertices coordinates for all <volume>'s.
@@ -294,27 +230,20 @@ private:
 									const std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray, const CAMFImporter_NodeElement_Color* pObjectColor,
 									const std::vector<CAMFImporter_NodeElement_Color*>& pVertexColorArray, const CAMFImporter_NodeElement_Color* pObjectColor,
 									std::list<aiMesh*>& pMeshList, aiNode& pSceneNode);
 									std::list<aiMesh*>& pMeshList, aiNode& pSceneNode);
 
 
-	/// \fn void Postprocess_BuildMaterial(const CAMFImporter_NodeElement_Material& pMaterial)
 	/// Convert material from \ref CAMFImporter_NodeElement_Material to \ref SPP_Material.
 	/// Convert material from \ref CAMFImporter_NodeElement_Material to \ref SPP_Material.
 	/// \param [in] pMaterial - source CAMFImporter_NodeElement_Material.
 	/// \param [in] pMaterial - source CAMFImporter_NodeElement_Material.
 	void Postprocess_BuildMaterial(const CAMFImporter_NodeElement_Material& pMaterial);
 	void Postprocess_BuildMaterial(const CAMFImporter_NodeElement_Material& pMaterial);
 
 
-	/// \fn void Postprocess_BuildConstellation(CAMFImporter_NodeElement_Constellation& pConstellation, std::list<aiNode*>& pNodeList) const
 	/// Create and add to aiNode's list new part of scene graph defined by <constellation>.
 	/// Create and add to aiNode's list new part of scene graph defined by <constellation>.
 	/// \param [in] pConstellation - reference to <constellation> node.
 	/// \param [in] pConstellation - reference to <constellation> node.
 	/// \param [out] pNodeList - reference to aiNode's list.
 	/// \param [out] pNodeList - reference to aiNode's list.
 	void Postprocess_BuildConstellation(CAMFImporter_NodeElement_Constellation& pConstellation, std::list<aiNode*>& pNodeList) const;
 	void Postprocess_BuildConstellation(CAMFImporter_NodeElement_Constellation& pConstellation, std::list<aiNode*>& pNodeList) const;
 
 
-	/// \fn void Postprocess_BuildScene()
 	/// Build Assimp scene graph in aiScene from collected data.
 	/// Build Assimp scene graph in aiScene from collected data.
 	/// \param [out] pScene - pointer to aiScene where tree will be built.
 	/// \param [out] pScene - pointer to aiScene where tree will be built.
 	void Postprocess_BuildScene(aiScene* pScene);
 	void Postprocess_BuildScene(aiScene* pScene);
 
 
-	/***********************************************/
-	/************* Functions: throw set ************/
-	/***********************************************/
 
 
-	/// \fn void Throw_CloseNotFound(const std::string& pNode)
 	/// Call that function when close tag of node not found and exception must be raised.
 	/// Call that function when close tag of node not found and exception must be raised.
 	/// E.g.:
 	/// E.g.:
 	/// <amf>
 	/// <amf>
@@ -324,19 +253,16 @@ private:
 	/// \param [in] pNode - node name in which exception happened.
 	/// \param [in] pNode - node name in which exception happened.
 	void Throw_CloseNotFound(const std::string& pNode);
 	void Throw_CloseNotFound(const std::string& pNode);
 
 
-	/// \fn void Throw_IncorrectAttr(const std::string& pAttrName)
 	/// Call that function when attribute name is incorrect and exception must be raised.
 	/// Call that function when attribute name is incorrect and exception must be raised.
 	/// \param [in] pAttrName - attribute name.
 	/// \param [in] pAttrName - attribute name.
 	/// \throw DeadlyImportError.
 	/// \throw DeadlyImportError.
 	void Throw_IncorrectAttr(const std::string& pAttrName);
 	void Throw_IncorrectAttr(const std::string& pAttrName);
 
 
-	/// \fn void Throw_IncorrectAttrValue(const std::string& pAttrName)
 	/// Call that function when attribute value is incorrect and exception must be raised.
 	/// Call that function when attribute value is incorrect and exception must be raised.
 	/// \param [in] pAttrName - attribute name.
 	/// \param [in] pAttrName - attribute name.
 	/// \throw DeadlyImportError.
 	/// \throw DeadlyImportError.
 	void Throw_IncorrectAttrValue(const std::string& pAttrName);
 	void Throw_IncorrectAttrValue(const std::string& pAttrName);
 
 
-	/// \fn void Throw_MoreThanOnceDefined(const std::string& pNode, const std::string& pDescription)
 	/// Call that function when some type of nodes are defined twice or more when must be used only once and exception must be raised.
 	/// Call that function when some type of nodes are defined twice or more when must be used only once and exception must be raised.
 	/// E.g.:
 	/// E.g.:
 	/// <object>
 	/// <object>
@@ -348,204 +274,158 @@ private:
 	/// \param [in] pDescription - message about error. E.g. what the node defined while exception raised.
 	/// \param [in] pDescription - message about error. E.g. what the node defined while exception raised.
 	void Throw_MoreThanOnceDefined(const std::string& pNodeType, const std::string& pDescription);
 	void Throw_MoreThanOnceDefined(const std::string& pNodeType, const std::string& pDescription);
 
 
-	/// \fn void Throw_ID_NotFound(const std::string& pID) const
 	/// Call that function when referenced element ID are not found in graph and exception must be raised.
 	/// Call that function when referenced element ID are not found in graph and exception must be raised.
 	/// \param [in] pID - ID of of element which not found.
 	/// \param [in] pID - ID of of element which not found.
 	/// \throw DeadlyImportError.
 	/// \throw DeadlyImportError.
 	void Throw_ID_NotFound(const std::string& pID) const;
 	void Throw_ID_NotFound(const std::string& pID) const;
 
 
-	/***********************************************/
-	/************** Functions: LOG set *************/
-	/***********************************************/
-
-	/***********************************************/
-	/************** Functions: XML set *************/
-	/***********************************************/
-
-	/// \fn void XML_CheckNode_MustHaveChildren()
 	/// Check if current node have children: <node>...</node>. If not then exception will throwed.
 	/// Check if current node have children: <node>...</node>. If not then exception will throwed.
 	void XML_CheckNode_MustHaveChildren();
 	void XML_CheckNode_MustHaveChildren();
 
 
-	/// \fn bool XML_CheckNode_NameEqual(const std::string& pNodeName)
 	/// Check if current node name is equal to pNodeName.
 	/// Check if current node name is equal to pNodeName.
 	/// \param [in] pNodeName - name for checking.
 	/// \param [in] pNodeName - name for checking.
 	/// return true if current node name is equal to pNodeName, else - false.
 	/// return true if current node name is equal to pNodeName, else - false.
 	bool XML_CheckNode_NameEqual(const std::string& pNodeName) { return mReader->getNodeName() == pNodeName; }
 	bool XML_CheckNode_NameEqual(const std::string& pNodeName) { return mReader->getNodeName() == pNodeName; }
 
 
-	/// \fn void XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName)
 	/// Skip unsupported node and report about that. Depend on node name can be skipped begin tag of node all whole node.
 	/// Skip unsupported node and report about that. Depend on node name can be skipped begin tag of node all whole node.
 	/// \param [in] pParentNodeName - parent node name. Used for reporting.
 	/// \param [in] pParentNodeName - parent node name. Used for reporting.
 	void XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName);
 	void XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName);
 
 
-	/// \fn bool XML_SearchNode(const std::string& pNodeName)
 	/// Search for specified node in file. XML file read pointer(mReader) will point to found node or file end after search is end.
 	/// Search for specified node in file. XML file read pointer(mReader) will point to found node or file end after search is end.
 	/// \param [in] pNodeName - requested node name.
 	/// \param [in] pNodeName - requested node name.
 	/// return true - if node is found, else - false.
 	/// return true - if node is found, else - false.
 	bool XML_SearchNode(const std::string& pNodeName);
 	bool XML_SearchNode(const std::string& pNodeName);
 
 
-	/// \fn bool XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx)
 	/// Read attribute value.
 	/// Read attribute value.
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \return read data.
 	/// \return read data.
 	bool XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx);
 	bool XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx);
 
 
-	/// \fn float XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx)
 	/// Read attribute value.
 	/// Read attribute value.
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \return read data.
 	/// \return read data.
 	float XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx);
 	float XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx);
 
 
-	/// \fn uint32_t XML_ReadNode_GetAttrVal_AsU32(const int pAttrIdx)
 	/// Read attribute value.
 	/// Read attribute value.
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
 	/// \return read data.
 	/// \return read data.
 	uint32_t XML_ReadNode_GetAttrVal_AsU32(const int pAttrIdx);
 	uint32_t XML_ReadNode_GetAttrVal_AsU32(const int pAttrIdx);
 
 
-	/// \fn float XML_ReadNode_GetVal_AsFloat()
 	/// Read node value.
 	/// Read node value.
 	/// \return read data.
 	/// \return read data.
 	float XML_ReadNode_GetVal_AsFloat();
 	float XML_ReadNode_GetVal_AsFloat();
 
 
-	/// \fn uint32_t XML_ReadNode_GetVal_AsU32()
 	/// Read node value.
 	/// Read node value.
 	/// \return read data.
 	/// \return read data.
 	uint32_t XML_ReadNode_GetVal_AsU32();
 	uint32_t XML_ReadNode_GetVal_AsU32();
 
 
-	/// \fn void XML_ReadNode_GetVal_AsString(std::string& pValue)
 	/// Read node value.
 	/// Read node value.
 	/// \return read data.
 	/// \return read data.
 	void XML_ReadNode_GetVal_AsString(std::string& pValue);
 	void XML_ReadNode_GetVal_AsString(std::string& pValue);
 
 
-	/***********************************************/
-	/******** Functions: parse set private *********/
-	/***********************************************/
-
-	/// \fn void ParseHelper_Node_Enter(CAMFImporter_NodeElement* pNode)
 	/// Make pNode as current and enter deeper for parsing child nodes. At end \ref ParseHelper_Node_Exit must be called.
 	/// Make pNode as current and enter deeper for parsing child nodes. At end \ref ParseHelper_Node_Exit must be called.
 	/// \param [in] pNode - new current node.
 	/// \param [in] pNode - new current node.
 	void ParseHelper_Node_Enter(CAMFImporter_NodeElement* pNode);
 	void ParseHelper_Node_Enter(CAMFImporter_NodeElement* pNode);
 
 
-	/// \fn void ParseHelper_Group_End()
 	/// This function must be called when exiting from grouping node. \ref ParseHelper_Group_Begin.
 	/// This function must be called when exiting from grouping node. \ref ParseHelper_Group_Begin.
 	void ParseHelper_Node_Exit();
 	void ParseHelper_Node_Exit();
 
 
-	/// \fn void ParseHelper_FixTruncatedFloatString(const char* pInStr, std::string& pOutString)
 	/// Attribute values of floating point types can take form ".x"(without leading zero). irrXMLReader can not read this form of values and it
 	/// Attribute values of floating point types can take form ".x"(without leading zero). irrXMLReader can not read this form of values and it
 	/// must be converted to right form - "0.xxx".
 	/// must be converted to right form - "0.xxx".
 	/// \param [in] pInStr - pointer to input string which can contain incorrect form of values.
 	/// \param [in] pInStr - pointer to input string which can contain incorrect form of values.
 	/// \param [out[ pOutString - output string with right form of values.
 	/// \param [out[ pOutString - output string with right form of values.
 	void ParseHelper_FixTruncatedFloatString(const char* pInStr, std::string& pOutString);
 	void ParseHelper_FixTruncatedFloatString(const char* pInStr, std::string& pOutString);
 
 
-	/// \fn void ParseHelper_Decode_Base64(const std::string& pInputBase64, std::vector<uint8_t>& pOutputData) const
 	/// Decode Base64-encoded data.
 	/// Decode Base64-encoded data.
 	/// \param [in] pInputBase64 - reference to input Base64-encoded string.
 	/// \param [in] pInputBase64 - reference to input Base64-encoded string.
 	/// \param [out] pOutputData - reference to output array for decoded data.
 	/// \param [out] pOutputData - reference to output array for decoded data.
 	void ParseHelper_Decode_Base64(const std::string& pInputBase64, std::vector<uint8_t>& pOutputData) const;
 	void ParseHelper_Decode_Base64(const std::string& pInputBase64, std::vector<uint8_t>& pOutputData) const;
 
 
-	/// \fn void ParseNode_Root()
 	/// Parse <AMF> node of the file.
 	/// Parse <AMF> node of the file.
 	void ParseNode_Root();
 	void ParseNode_Root();
 
 
-	/******** Functions: top nodes *********/
-
-	/// \fn void ParseNode_Constellation()
 	/// Parse <constellation> node of the file.
 	/// Parse <constellation> node of the file.
 	void ParseNode_Constellation();
 	void ParseNode_Constellation();
 
 
-	/// \fn void ParseNode_Constellation()
 	/// Parse <instance> node of the file.
 	/// Parse <instance> node of the file.
 	void ParseNode_Instance();
 	void ParseNode_Instance();
 
 
-	/// \fn void ParseNode_Material()
 	/// Parse <material> node of the file.
 	/// Parse <material> node of the file.
 	void ParseNode_Material();
 	void ParseNode_Material();
 
 
-	/// \fn void ParseNode_Metadata()
 	/// Parse <metadata> node.
 	/// Parse <metadata> node.
 	void ParseNode_Metadata();
 	void ParseNode_Metadata();
 
 
-	/// \fn void ParseNode_Object()
 	/// Parse <object> node of the file.
 	/// Parse <object> node of the file.
 	void ParseNode_Object();
 	void ParseNode_Object();
 
 
-	/// \fn void ParseNode_Texture()
 	/// Parse <texture> node of the file.
 	/// Parse <texture> node of the file.
 	void ParseNode_Texture();
 	void ParseNode_Texture();
 
 
-	/******** Functions: geometry nodes *********/
-
-	/// \fn void ParseNode_Coordinates()
 	/// Parse <coordinates> node of the file.
 	/// Parse <coordinates> node of the file.
 	void ParseNode_Coordinates();
 	void ParseNode_Coordinates();
 
 
-	/// \fn void ParseNode_Edge()
 	/// Parse <edge> node of the file.
 	/// Parse <edge> node of the file.
 	void ParseNode_Edge();
 	void ParseNode_Edge();
 
 
-	/// \fn void ParseNode_Mesh()
 	/// Parse <mesh> node of the file.
 	/// Parse <mesh> node of the file.
 	void ParseNode_Mesh();
 	void ParseNode_Mesh();
 
 
-	/// \fn void ParseNode_Triangle()
 	/// Parse <triangle> node of the file.
 	/// Parse <triangle> node of the file.
 	void ParseNode_Triangle();
 	void ParseNode_Triangle();
 
 
-	/// \fn void ParseNode_Vertex()
 	/// Parse <vertex> node of the file.
 	/// Parse <vertex> node of the file.
 	void ParseNode_Vertex();
 	void ParseNode_Vertex();
 
 
-	/// \fn void ParseNode_Vertices()
 	/// Parse <vertices> node of the file.
 	/// Parse <vertices> node of the file.
 	void ParseNode_Vertices();
 	void ParseNode_Vertices();
 
 
-	/// \fn void ParseNode_Volume()
 	/// Parse <volume> node of the file.
 	/// Parse <volume> node of the file.
 	void ParseNode_Volume();
 	void ParseNode_Volume();
 
 
-	/******** Functions: material nodes *********/
-
-	/// \fn void ParseNode_Color()
 	/// Parse <color> node of the file.
 	/// Parse <color> node of the file.
 	void ParseNode_Color();
 	void ParseNode_Color();
 
 
-	/// \fn void ParseNode_TexMap(const bool pUseOldName = false)
 	/// Parse <texmap> of <map> node of the file.
 	/// Parse <texmap> of <map> node of the file.
 	/// \param [in] pUseOldName - if true then use old name of node(and children) - <map>, instead of new name - <texmap>.
 	/// \param [in] pUseOldName - if true then use old name of node(and children) - <map>, instead of new name - <texmap>.
 	void ParseNode_TexMap(const bool pUseOldName = false);
 	void ParseNode_TexMap(const bool pUseOldName = false);
 
 
 public:
 public:
-
-	/// \fn AMFImporter()
 	/// Default constructor.
 	/// Default constructor.
-	AMFImporter()
-		: mNodeElement_Cur(nullptr), mReader(nullptr)
-	{}
+	AMFImporter() AI_NO_EXCEPT
+    : mNodeElement_Cur(nullptr)
+    , mReader(nullptr) {
+        // empty
+    }
 
 
-	/// \fn ~AMFImporter()
 	/// Default destructor.
 	/// Default destructor.
 	~AMFImporter();
 	~AMFImporter();
 
 
-	/***********************************************/
-	/******** Functions: parse set, public *********/
-	/***********************************************/
-
-	/// \fn void ParseFile(const std::string& pFile, IOSystem* pIOHandler)
 	/// Parse AMF file and fill scene graph. The function has no return value. Result can be found by analyzing the generated graph.
 	/// Parse AMF file and fill scene graph. The function has no return value. Result can be found by analyzing the generated graph.
-	/// Also exception can be throwed if trouble will found.
+	/// Also exception can be thrown if trouble will found.
 	/// \param [in] pFile - name of file to be parsed.
 	/// \param [in] pFile - name of file to be parsed.
 	/// \param [in] pIOHandler - pointer to IO helper object.
 	/// \param [in] pIOHandler - pointer to IO helper object.
 	void ParseFile(const std::string& pFile, IOSystem* pIOHandler);
 	void ParseFile(const std::string& pFile, IOSystem* pIOHandler);
 
 
-	/***********************************************/
-	/********* Functions: BaseImporter set *********/
-	/***********************************************/
-
 	bool CanRead(const std::string& pFile, IOSystem* pIOHandler, bool pCheckSig) const;
 	bool CanRead(const std::string& pFile, IOSystem* pIOHandler, bool pCheckSig) const;
 	void GetExtensionList(std::set<std::string>& pExtensionList);
 	void GetExtensionList(std::set<std::string>& pExtensionList);
 	void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler);
 	void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler);
 	const aiImporterDesc* GetInfo ()const;
 	const aiImporterDesc* GetInfo ()const;
 
 
-};// class AMFImporter
+    AMFImporter(const AMFImporter& pScene) = delete;
+    AMFImporter& operator=(const AMFImporter& pScene) = delete;
+
+private:
+    static const aiImporterDesc Description;
+
+    CAMFImporter_NodeElement* mNodeElement_Cur;///< Current element.
+    std::list<CAMFImporter_NodeElement*> mNodeElement_List;///< All elements of scene graph.
+    irr::io::IrrXMLReader* mReader;///< Pointer to XML-reader object
+    std::string mUnit;
+    std::list<SPP_Material> mMaterial_Converted;///< List of converted materials for postprocessing step.
+    std::list<SPP_Texture> mTexture_Converted;///< List of converted textures for postprocessing step.
+
+};
 
 
 }// namespace Assimp
 }// namespace Assimp
 
 

+ 59 - 41
code/AMFImporter_Material.cpp

@@ -68,10 +68,9 @@ namespace Assimp
 //   Multi elements - No.
 //   Multi elements - No.
 //   Red, Greed, Blue and Alpha (transparency) component of a color in sRGB space, values ranging from 0 to 1. The
 //   Red, Greed, Blue and Alpha (transparency) component of a color in sRGB space, values ranging from 0 to 1. The
 //   values can be specified as constants, or as a formula depending on the coordinates.
 //   values can be specified as constants, or as a formula depending on the coordinates.
-void AMFImporter::ParseNode_Color()
-{
-std::string profile;
-CAMFImporter_NodeElement* ne;
+void AMFImporter::ParseNode_Color() {
+    std::string profile;
+    CAMFImporter_NodeElement* ne;
 
 
 	// Read attributes for node <color>.
 	// Read attributes for node <color>.
 	MACRO_ATTRREAD_LOOPBEG;
 	MACRO_ATTRREAD_LOOPBEG;
@@ -98,15 +97,19 @@ CAMFImporter_NodeElement* ne;
 		MACRO_NODECHECK_LOOPEND("color");
 		MACRO_NODECHECK_LOOPEND("color");
 		ParseHelper_Node_Exit();
 		ParseHelper_Node_Exit();
 		// check that all components was defined
 		// check that all components was defined
-		if(!(read_flag[0] && read_flag[1] && read_flag[2])) throw DeadlyImportError("Not all color components are defined.");
-		// check if <a> is absent. Then manually add "a == 1".
-		if(!read_flag[3]) als.Color.a = 1;
-
-	}// if(!mReader->isEmptyElement())
+        if (!(read_flag[0] && read_flag[1] && read_flag[2])) {
+            throw DeadlyImportError("Not all color components are defined.");
+        }
+
+        // check if <a> is absent. Then manually add "a == 1".
+        if (!read_flag[3]) {
+            als.Color.a = 1;
+        }
+	}
 	else
 	else
 	{
 	{
 		mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
 		mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
-	}// if(!mReader->isEmptyElement()) else
+	}
 
 
 	als.Composed = false;
 	als.Composed = false;
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
@@ -119,10 +122,9 @@ CAMFImporter_NodeElement* ne;
 // An available material.
 // An available material.
 // Multi elements - Yes.
 // Multi elements - Yes.
 // Parent element - <amf>.
 // Parent element - <amf>.
-void AMFImporter::ParseNode_Material()
-{
-std::string id;
-CAMFImporter_NodeElement* ne;
+void AMFImporter::ParseNode_Material() {
+    std::string id;
+    CAMFImporter_NodeElement* ne;
 
 
 	// Read attributes for node <color>.
 	// Read attributes for node <color>.
 	MACRO_ATTRREAD_LOOPBEG;
 	MACRO_ATTRREAD_LOOPBEG;
@@ -131,9 +133,11 @@ CAMFImporter_NodeElement* ne;
 
 
 	// create new object.
 	// create new object.
 	ne = new CAMFImporter_NodeElement_Material(mNodeElement_Cur);
 	ne = new CAMFImporter_NodeElement_Material(mNodeElement_Cur);
-	// and assign read data
+
+    // and assign read data
 	((CAMFImporter_NodeElement_Material*)ne)->ID = id;
 	((CAMFImporter_NodeElement_Material*)ne)->ID = id;
-	// Check for child nodes
+
+    // Check for child nodes
 	if(!mReader->isEmptyElement())
 	if(!mReader->isEmptyElement())
 	{
 	{
 		bool col_read = false;
 		bool col_read = false;
@@ -154,11 +158,11 @@ CAMFImporter_NodeElement* ne;
 			if(XML_CheckNode_NameEqual("metadata")) { ParseNode_Metadata(); continue; }
 			if(XML_CheckNode_NameEqual("metadata")) { ParseNode_Metadata(); continue; }
 		MACRO_NODECHECK_LOOPEND("material");
 		MACRO_NODECHECK_LOOPEND("material");
 		ParseHelper_Node_Exit();
 		ParseHelper_Node_Exit();
-	}// if(!mReader->isEmptyElement())
+	}
 	else
 	else
 	{
 	{
 		mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
 		mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
-	}// if(!mReader->isEmptyElement()) else
+	}
 
 
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
 }
 }
@@ -181,14 +185,13 @@ CAMFImporter_NodeElement* ne;
 // Parent element - <amf>.
 // Parent element - <amf>.
 void AMFImporter::ParseNode_Texture()
 void AMFImporter::ParseNode_Texture()
 {
 {
-std::string id;
-uint32_t width = 0;
-uint32_t height = 0;
-uint32_t depth = 1;
-std::string type;
-bool tiled = false;
-std::string enc64_data;
-CAMFImporter_NodeElement* ne;
+    std::string id;
+    uint32_t width = 0;
+    uint32_t height = 0;
+    uint32_t depth = 1;
+    std::string type;
+    bool tiled = false;
+    std::string enc64_data;
 
 
 	// Read attributes for node <color>.
 	// Read attributes for node <color>.
 	MACRO_ATTRREAD_LOOPBEG;
 	MACRO_ATTRREAD_LOOPBEG;
@@ -201,20 +204,34 @@ CAMFImporter_NodeElement* ne;
 	MACRO_ATTRREAD_LOOPEND;
 	MACRO_ATTRREAD_LOOPEND;
 
 
 	// create new texture object.
 	// create new texture object.
-	ne = new CAMFImporter_NodeElement_Texture(mNodeElement_Cur);
+    CAMFImporter_NodeElement *ne = new CAMFImporter_NodeElement_Texture(mNodeElement_Cur);
 
 
 	CAMFImporter_NodeElement_Texture& als = *((CAMFImporter_NodeElement_Texture*)ne);// alias for convenience
 	CAMFImporter_NodeElement_Texture& als = *((CAMFImporter_NodeElement_Texture*)ne);// alias for convenience
 
 
 	// Check for child nodes
 	// Check for child nodes
-	if(!mReader->isEmptyElement()) XML_ReadNode_GetVal_AsString(enc64_data);
+    if (!mReader->isEmptyElement()) {
+        XML_ReadNode_GetVal_AsString(enc64_data);
+    }
 
 
 	// check that all components was defined
 	// check that all components was defined
-	if(id.empty()) throw DeadlyImportError("ID for texture must be defined.");
-	if(width < 1) Throw_IncorrectAttrValue("width");
-	if(height < 1) Throw_IncorrectAttrValue("height");
-	if(depth < 1) Throw_IncorrectAttrValue("depth");
-	if(type != "grayscale") Throw_IncorrectAttrValue("type");
-	if(enc64_data.empty()) throw DeadlyImportError("Texture data not defined.");
+    if (id.empty()) {
+        throw DeadlyImportError("ID for texture must be defined.");
+    }
+    if (width < 1) {
+        Throw_IncorrectAttrValue("width");
+    }
+    if (height < 1) {
+        Throw_IncorrectAttrValue("height");
+    }
+    if (depth < 1) {
+        Throw_IncorrectAttrValue("depth");
+    }
+    if (type != "grayscale") {
+        Throw_IncorrectAttrValue("type");
+    }
+    if (enc64_data.empty()) {
+        throw DeadlyImportError("Texture data not defined.");
+    }
 	// copy data
 	// copy data
 	als.ID = id;
 	als.ID = id;
 	als.Width = width;
 	als.Width = width;
@@ -222,8 +239,11 @@ CAMFImporter_NodeElement* ne;
 	als.Depth = depth;
 	als.Depth = depth;
 	als.Tiled = tiled;
 	als.Tiled = tiled;
 	ParseHelper_Decode_Base64(enc64_data, als.Data);
 	ParseHelper_Decode_Base64(enc64_data, als.Data);
-	// check data size
-	if((width * height * depth) != als.Data.size()) throw DeadlyImportError("Texture has incorrect data size.");
+
+    // check data size
+    if ((width * height * depth) != als.Data.size()) {
+        throw DeadlyImportError("Texture has incorrect data size.");
+    }
 
 
 	mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
 	mNodeElement_Cur->Child.push_back(ne);// Add element to child list of current element
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
 	mNodeElement_List.push_back(ne);// and to node element list because its a new object in graph.
@@ -243,10 +263,8 @@ CAMFImporter_NodeElement* ne;
 //   <utex1>, <utex2>, <utex3>, <vtex1>, <vtex2>, <vtex3>. Old name: <u1>, <u2>, <u3>, <v1>, <v2>, <v3>.
 //   <utex1>, <utex2>, <utex3>, <vtex1>, <vtex2>, <vtex3>. Old name: <u1>, <u2>, <u3>, <v1>, <v2>, <v3>.
 //   Multi elements - No.
 //   Multi elements - No.
 //   Texture coordinates for every vertex of triangle.
 //   Texture coordinates for every vertex of triangle.
-void AMFImporter::ParseNode_TexMap(const bool pUseOldName)
-{
-std::string rtexid, gtexid, btexid, atexid;
-CAMFImporter_NodeElement* ne;
+void AMFImporter::ParseNode_TexMap(const bool pUseOldName) {
+    std::string rtexid, gtexid, btexid, atexid;
 
 
 	// Read attributes for node <color>.
 	// Read attributes for node <color>.
 	MACRO_ATTRREAD_LOOPBEG;
 	MACRO_ATTRREAD_LOOPBEG;
@@ -257,7 +275,7 @@ CAMFImporter_NodeElement* ne;
 	MACRO_ATTRREAD_LOOPEND;
 	MACRO_ATTRREAD_LOOPEND;
 
 
 	// create new texture coordinates object.
 	// create new texture coordinates object.
-	ne = new CAMFImporter_NodeElement_TexMap(mNodeElement_Cur);
+    CAMFImporter_NodeElement *ne = new CAMFImporter_NodeElement_TexMap(mNodeElement_Cur);
 
 
 	CAMFImporter_NodeElement_TexMap& als = *((CAMFImporter_NodeElement_TexMap*)ne);// alias for convenience
 	CAMFImporter_NodeElement_TexMap& als = *((CAMFImporter_NodeElement_TexMap*)ne);// alias for convenience
 	// check data
 	// check data

+ 62 - 123
code/AMFImporter_Node.hpp

@@ -62,7 +62,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 /// \class CAMFImporter_NodeElement
 /// \class CAMFImporter_NodeElement
 /// Base class for elements of nodes.
 /// Base class for elements of nodes.
 class CAMFImporter_NodeElement {
 class CAMFImporter_NodeElement {
-
 public:
 public:
 	/// Define what data type contain node element.
 	/// Define what data type contain node element.
 	enum EType {
 	enum EType {
@@ -96,15 +95,11 @@ public:                                               /// Destructor, virtual..
         // empty
         // empty
     }
     }
 
 
-private:
-	/// Disabled copy constructor.
-	CAMFImporter_NodeElement(const CAMFImporter_NodeElement& pNodeElement);
-
-	/// Disabled assign operator.
-	CAMFImporter_NodeElement& operator=(const CAMFImporter_NodeElement& pNodeElement);
-
-	/// Disabled default constructor.
-	CAMFImporter_NodeElement();
+	/// Disabled copy constructor and co.
+	CAMFImporter_NodeElement(const CAMFImporter_NodeElement& pNodeElement) = delete;
+    CAMFImporter_NodeElement(CAMFImporter_NodeElement&&) = delete;
+    CAMFImporter_NodeElement& operator=(const CAMFImporter_NodeElement& pNodeElement) = delete;
+	CAMFImporter_NodeElement() = delete;
 
 
 protected:
 protected:
 	/// In constructor inheritor must set element type.
 	/// In constructor inheritor must set element type.
@@ -121,9 +116,7 @@ protected:
 
 
 /// \struct CAMFImporter_NodeElement_Constellation
 /// \struct CAMFImporter_NodeElement_Constellation
 /// A collection of objects or constellations with specific relative locations.
 /// A collection of objects or constellations with specific relative locations.
-struct CAMFImporter_NodeElement_Constellation : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Constellation(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Constellation : public CAMFImporter_NodeElement {
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Constellation(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Constellation(CAMFImporter_NodeElement* pParent)
@@ -134,9 +127,7 @@ struct CAMFImporter_NodeElement_Constellation : public CAMFImporter_NodeElement
 
 
 /// \struct CAMFImporter_NodeElement_Instance
 /// \struct CAMFImporter_NodeElement_Instance
 /// Part of constellation.
 /// Part of constellation.
-struct CAMFImporter_NodeElement_Instance : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
+struct CAMFImporter_NodeElement_Instance : public CAMFImporter_NodeElement {
 
 
 	std::string ObjectID;///< ID of object for instantiation.
 	std::string ObjectID;///< ID of object for instantiation.
 	/// \var Delta - The distance of translation in the x, y, or z direction, respectively, in the referenced object's coordinate system, to
 	/// \var Delta - The distance of translation in the x, y, or z direction, respectively, in the referenced object's coordinate system, to
@@ -147,237 +138,185 @@ struct CAMFImporter_NodeElement_Instance : public CAMFImporter_NodeElement
 	/// instance of the object in the current constellation. Rotations shall be executed in order of x first, then y, then z.
 	/// instance of the object in the current constellation. Rotations shall be executed in order of x first, then y, then z.
 	aiVector3D Rotation;
 	aiVector3D Rotation;
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Instance(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Instance(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Instance(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Instance, pParent)
 		: CAMFImporter_NodeElement(ENET_Instance, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Instance
+};
 
 
 /// \struct CAMFImporter_NodeElement_Metadata
 /// \struct CAMFImporter_NodeElement_Metadata
 /// Structure that define metadata node.
 /// Structure that define metadata node.
-struct CAMFImporter_NodeElement_Metadata : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
+struct CAMFImporter_NodeElement_Metadata : public CAMFImporter_NodeElement {
 
 
-	std::string Type;///< Type of "Value".
+	std::string Type;///< Type of "Value". 
 	std::string Value;///< Value.
 	std::string Value;///< Value.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Metadata(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Metadata(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Metadata(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Metadata, pParent)
 		: CAMFImporter_NodeElement(ENET_Metadata, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Metadata
+};
 
 
 /// \struct CAMFImporter_NodeElement_Root
 /// \struct CAMFImporter_NodeElement_Root
 /// Structure that define root node.
 /// Structure that define root node.
-struct CAMFImporter_NodeElement_Root : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
+struct CAMFImporter_NodeElement_Root : public CAMFImporter_NodeElement {
 
 
 	std::string Unit;///< The units to be used. May be "inch", "millimeter", "meter", "feet", or "micron".
 	std::string Unit;///< The units to be used. May be "inch", "millimeter", "meter", "feet", or "micron".
 	std::string Version;///< Version of format.
 	std::string Version;///< Version of format.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Root(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Root(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Root(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Root, pParent)
 		: CAMFImporter_NodeElement(ENET_Root, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Root
+};
 
 
 /// \struct CAMFImporter_NodeElement_Color
 /// \struct CAMFImporter_NodeElement_Color
 /// Structure that define object node.
 /// Structure that define object node.
-struct CAMFImporter_NodeElement_Color : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
-
-	bool Composed;///< Type of color stored: if true then look for formula in \ref Color_Composed[4], else - in \ref Color.
-	std::string Color_Composed[4];///< By components formulas of composed color. [0..3] => RGBA.
-	aiColor4D Color;///< Constant color.
-	std::string Profile;///< The ICC color space used to interpret the three color channels <r>, <g> and <b>..
-
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Color(CAMFImporter_NodeElement* pParent)
-	/// Constructor.
-	/// \param [in] pParent - pointer to parent node.
+struct CAMFImporter_NodeElement_Color : public CAMFImporter_NodeElement {
+	bool Composed;                  ///< Type of color stored: if true then look for formula in \ref Color_Composed[4], else - in \ref Color.
+	std::string Color_Composed[4];  ///< By components formulas of composed color. [0..3] - RGBA.
+	aiColor4D Color;                ///< Constant color.
+	std::string Profile;            ///< The ICC color space used to interpret the three color channels r, g and b..
+
+	/// @brief  Constructor.
+	/// @param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Color(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Color(CAMFImporter_NodeElement* pParent)
-		: CAMFImporter_NodeElement(ENET_Color, pParent)
-	{}
-
-};// struct CAMFImporter_NodeElement_Color
+	: CAMFImporter_NodeElement(ENET_Color, pParent)
+    , Composed( false )
+    , Color()
+    , Profile() {
+        // empty
+    }
+};
 
 
 /// \struct CAMFImporter_NodeElement_Material
 /// \struct CAMFImporter_NodeElement_Material
 /// Structure that define material node.
 /// Structure that define material node.
-struct CAMFImporter_NodeElement_Material : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Material(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Material : public CAMFImporter_NodeElement {
+	
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Material(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Material(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Material, pParent)
 		: CAMFImporter_NodeElement(ENET_Material, pParent)
 	{}
 	{}
 
 
-};// struct CAMFImporter_NodeElement_Material
+};
 
 
 /// \struct CAMFImporter_NodeElement_Object
 /// \struct CAMFImporter_NodeElement_Object
 /// Structure that define object node.
 /// Structure that define object node.
-struct CAMFImporter_NodeElement_Object : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Object(CAMFImporter_NodeElement* pParent)
-	/// Constructor.
+struct CAMFImporter_NodeElement_Object : public CAMFImporter_NodeElement {
+
+    /// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Object(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Object(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Object, pParent)
 		: CAMFImporter_NodeElement(ENET_Object, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Object
+};
 
 
 /// \struct CAMFImporter_NodeElement_Mesh
 /// \struct CAMFImporter_NodeElement_Mesh
 /// Structure that define mesh node.
 /// Structure that define mesh node.
-struct CAMFImporter_NodeElement_Mesh : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Mesh(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Mesh : public CAMFImporter_NodeElement {
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Mesh(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Mesh(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Mesh, pParent)
 		: CAMFImporter_NodeElement(ENET_Mesh, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Mesh
+};
 
 
 /// \struct CAMFImporter_NodeElement_Vertex
 /// \struct CAMFImporter_NodeElement_Vertex
 /// Structure that define vertex node.
 /// Structure that define vertex node.
-struct CAMFImporter_NodeElement_Vertex : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Vertex(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Vertex : public CAMFImporter_NodeElement {
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Vertex(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Vertex(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Vertex, pParent)
 		: CAMFImporter_NodeElement(ENET_Vertex, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Vertex
+};
 
 
 /// \struct CAMFImporter_NodeElement_Edge
 /// \struct CAMFImporter_NodeElement_Edge
 /// Structure that define edge node.
 /// Structure that define edge node.
-struct CAMFImporter_NodeElement_Edge : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Edge(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Edge : public CAMFImporter_NodeElement {
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Edge(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Edge(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Edge, pParent)
 		: CAMFImporter_NodeElement(ENET_Edge, pParent)
 	{}
 	{}
 
 
-};// struct CAMFImporter_NodeElement_Vertex
+};
 
 
 /// \struct CAMFImporter_NodeElement_Vertices
 /// \struct CAMFImporter_NodeElement_Vertices
 /// Structure that define vertices node.
 /// Structure that define vertices node.
-struct CAMFImporter_NodeElement_Vertices : public CAMFImporter_NodeElement
-{
-	/// \fn CAMFImporter_NodeElement_Vertices(CAMFImporter_NodeElement* pParent)
+struct CAMFImporter_NodeElement_Vertices : public CAMFImporter_NodeElement {
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Vertices(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Vertices(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Vertices, pParent)
 		: CAMFImporter_NodeElement(ENET_Vertices, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Vertices
+};
 
 
 /// \struct CAMFImporter_NodeElement_Volume
 /// \struct CAMFImporter_NodeElement_Volume
 /// Structure that define volume node.
 /// Structure that define volume node.
-struct CAMFImporter_NodeElement_Volume : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
-
+struct CAMFImporter_NodeElement_Volume : public CAMFImporter_NodeElement {
 	std::string MaterialID;///< Which material to use.
 	std::string MaterialID;///< Which material to use.
 	std::string Type;///< What this volume describes can be “region” or “support”. If none specified, “object” is assumed.
 	std::string Type;///< What this volume describes can be “region” or “support”. If none specified, “object” is assumed.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Volume(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Volume(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Volume(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Volume, pParent)
 		: CAMFImporter_NodeElement(ENET_Volume, pParent)
 	{}
 	{}
-
-};// struct CAMFImporter_NodeElement_Volume
+};
 
 
 /// \struct CAMFImporter_NodeElement_Coordinates
 /// \struct CAMFImporter_NodeElement_Coordinates
 /// Structure that define coordinates node.
 /// Structure that define coordinates node.
 struct CAMFImporter_NodeElement_Coordinates : public CAMFImporter_NodeElement
 struct CAMFImporter_NodeElement_Coordinates : public CAMFImporter_NodeElement
 {
 {
-	/****************** Variables ******************/
-
 	aiVector3D Coordinate;///< Coordinate.
 	aiVector3D Coordinate;///< Coordinate.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Coordinates(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Coordinates(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Coordinates(CAMFImporter_NodeElement* pParent)
 		: CAMFImporter_NodeElement(ENET_Coordinates, pParent)
 		: CAMFImporter_NodeElement(ENET_Coordinates, pParent)
 	{}
 	{}
 
 
-};// struct CAMFImporter_NodeElement_Coordinates
+};
 
 
 /// \struct CAMFImporter_NodeElement_TexMap
 /// \struct CAMFImporter_NodeElement_TexMap
 /// Structure that define texture coordinates node.
 /// Structure that define texture coordinates node.
-struct CAMFImporter_NodeElement_TexMap : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
-
+struct CAMFImporter_NodeElement_TexMap : public CAMFImporter_NodeElement {
 	aiVector3D TextureCoordinate[3];///< Texture coordinates.
 	aiVector3D TextureCoordinate[3];///< Texture coordinates.
 	std::string TextureID_R;///< Texture ID for red color component.
 	std::string TextureID_R;///< Texture ID for red color component.
 	std::string TextureID_G;///< Texture ID for green color component.
 	std::string TextureID_G;///< Texture ID for green color component.
 	std::string TextureID_B;///< Texture ID for blue color component.
 	std::string TextureID_B;///< Texture ID for blue color component.
 	std::string TextureID_A;///< Texture ID for alpha color component.
 	std::string TextureID_A;///< Texture ID for alpha color component.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_TexMap(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_TexMap(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_TexMap(CAMFImporter_NodeElement* pParent)
-		: CAMFImporter_NodeElement(ENET_TexMap, pParent)
-	{}
-
-};// struct CAMFImporter_NodeElement_TexMap
+	: CAMFImporter_NodeElement(ENET_TexMap, pParent)
+    , TextureCoordinate{}
+    , TextureID_R()
+    , TextureID_G()
+    , TextureID_B()
+    , TextureID_A()	{
+        // empty
+    }
+};
 
 
 /// \struct CAMFImporter_NodeElement_Triangle
 /// \struct CAMFImporter_NodeElement_Triangle
 /// Structure that define triangle node.
 /// Structure that define triangle node.
-struct CAMFImporter_NodeElement_Triangle : public CAMFImporter_NodeElement
-{
-	/****************** Variables ******************/
-
+struct CAMFImporter_NodeElement_Triangle : public CAMFImporter_NodeElement {
 	size_t V[3];///< Triangle vertices.
 	size_t V[3];///< Triangle vertices.
 
 
-	/****************** Functions ******************/
-
-	/// \fn CAMFImporter_NodeElement_Triangle(CAMFImporter_NodeElement* pParent)
 	/// Constructor.
 	/// Constructor.
 	/// \param [in] pParent - pointer to parent node.
 	/// \param [in] pParent - pointer to parent node.
 	CAMFImporter_NodeElement_Triangle(CAMFImporter_NodeElement* pParent)
 	CAMFImporter_NodeElement_Triangle(CAMFImporter_NodeElement* pParent)
-		: CAMFImporter_NodeElement(ENET_Triangle, pParent)
-	{}
-
-};// struct CAMFImporter_NodeElement_Triangle
+	: CAMFImporter_NodeElement(ENET_Triangle, pParent) {
+        // empty
+    }
+};
 
 
 /// Structure that define texture node.
 /// Structure that define texture node.
 struct CAMFImporter_NodeElement_Texture : public CAMFImporter_NodeElement {
 struct CAMFImporter_NodeElement_Texture : public CAMFImporter_NodeElement {
@@ -396,6 +335,6 @@ struct CAMFImporter_NodeElement_Texture : public CAMFImporter_NodeElement {
     , Tiled( false ){
     , Tiled( false ){
         // empty
         // empty
     }
     }
-};// struct CAMFImporter_NodeElement_Texture
+};
 
 
 #endif // INCLUDED_AI_AMF_IMPORTER_NODE_H
 #endif // INCLUDED_AI_AMF_IMPORTER_NODE_H

+ 46 - 67
code/ASEParser.h

@@ -71,21 +71,20 @@ struct Material : public D3DS::Material
     //! Default constructor has been deleted
     //! Default constructor has been deleted
     Material() = delete;
     Material() = delete;
 
 
-
     //! Constructor with explicit name
     //! Constructor with explicit name
     explicit Material(const std::string &name)
     explicit Material(const std::string &name)
     : D3DS::Material(name)
     : D3DS::Material(name)
     , pcInstance(NULL)
     , pcInstance(NULL)
-    , bNeed (false)
-    {}
-
+    , bNeed (false) {
+        // empty
+    }
 
 
     Material(const Material &other)            = default;
     Material(const Material &other)            = default;
     Material &operator=(const Material &other) = default;
     Material &operator=(const Material &other) = default;
 
 
 
 
     //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it
     //! Move constructor. This is explicitly written because MSVC doesn't support defaulting it
-    Material(Material &&other)
+    Material(Material &&other) AI_NO_EXCEPT
     : D3DS::Material(std::move(other))
     : D3DS::Material(std::move(other))
     , avSubMaterials(std::move(other.avSubMaterials))
     , avSubMaterials(std::move(other.avSubMaterials))
     , pcInstance(std::move(other.pcInstance))
     , pcInstance(std::move(other.pcInstance))
@@ -95,7 +94,7 @@ struct Material : public D3DS::Material
     }
     }
 
 
 
 
-    Material &operator=(Material &&other) {
+    Material &operator=(Material &&other) AI_NO_EXCEPT {
         if (this == &other) {
         if (this == &other) {
             return *this;
             return *this;
         }
         }
@@ -127,19 +126,12 @@ struct Material : public D3DS::Material
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE file face */
 /** Helper structure to represent an ASE file face */
-struct Face : public FaceWithSmoothingGroup
-{
+struct Face : public FaceWithSmoothingGroup {
     //! Default constructor. Initializes everything with 0
     //! Default constructor. Initializes everything with 0
-    Face()
-    {
-        mColorIndices[0] = mColorIndices[1] = mColorIndices[2] = 0;
-        for (unsigned int i = 0; i < AI_MAX_NUMBER_OF_TEXTURECOORDS;++i)
-        {
-            amUVIndices[i][0] = amUVIndices[i][1] = amUVIndices[i][2] = 0;
-        }
-
-        iMaterial = DEFAULT_MATINDEX;
-        iFace = 0;
+    Face() AI_NO_EXCEPT
+    : iMaterial(DEFAULT_MATINDEX)
+    , iFace(0) {
+        // empty
     }
     }
 
 
     //! special value to indicate that no material index has
     //! special value to indicate that no material index has
@@ -147,8 +139,6 @@ struct Face : public FaceWithSmoothingGroup
     //! will replace this value later.
     //! will replace this value later.
     static const unsigned int DEFAULT_MATINDEX = 0xFFFFFFFF;
     static const unsigned int DEFAULT_MATINDEX = 0xFFFFFFFF;
 
 
-
-
     //! Indices into each list of texture coordinates
     //! Indices into each list of texture coordinates
     unsigned int amUVIndices[AI_MAX_NUMBER_OF_TEXTURECOORDS][3];
     unsigned int amUVIndices[AI_MAX_NUMBER_OF_TEXTURECOORDS][3];
 
 
@@ -166,15 +156,15 @@ struct Face : public FaceWithSmoothingGroup
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE file bone */
 /** Helper structure to represent an ASE file bone */
-struct Bone
-{
+struct Bone {
     //! Constructor
     //! Constructor
     Bone() = delete;
     Bone() = delete;
 
 
     //! Construction from an existing name
     //! Construction from an existing name
     explicit Bone( const std::string& name)
     explicit Bone( const std::string& name)
-        :   mName   (name)
-    {}
+    : mName(name) {
+        // empty
+    }
 
 
     //! Name of the bone
     //! Name of the bone
     std::string mName;
     std::string mName;
@@ -182,29 +172,22 @@ struct Bone
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE file bone vertex */
 /** Helper structure to represent an ASE file bone vertex */
-struct BoneVertex
-{
+struct BoneVertex {
     //! Bone and corresponding vertex weight.
     //! Bone and corresponding vertex weight.
     //! -1 for unrequired bones ....
     //! -1 for unrequired bones ....
     std::vector<std::pair<int,float> > mBoneWeights;
     std::vector<std::pair<int,float> > mBoneWeights;
-
-    //! Position of the bone vertex.
-    //! MUST be identical to the vertex position
-    //aiVector3D mPosition;
 };
 };
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE file animation */
 /** Helper structure to represent an ASE file animation */
-struct Animation
-{
-    enum Type
-    {
+struct Animation {
+    enum Type {
         TRACK   = 0x0,
         TRACK   = 0x0,
         BEZIER  = 0x1,
         BEZIER  = 0x1,
         TCB     = 0x2
         TCB     = 0x2
     } mRotationType, mScalingType, mPositionType;
     } mRotationType, mScalingType, mPositionType;
 
 
-    Animation()
+    Animation() AI_NO_EXCEPT
         :   mRotationType   (TRACK)
         :   mRotationType   (TRACK)
         ,   mScalingType    (TRACK)
         ,   mScalingType    (TRACK)
         ,   mPositionType   (TRACK)
         ,   mPositionType   (TRACK)
@@ -218,19 +201,16 @@ struct Animation
 
 
     //! List of track scaling keyframes
     //! List of track scaling keyframes
     std::vector< aiVectorKey > akeyScaling;
     std::vector< aiVectorKey > akeyScaling;
-
 };
 };
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent the inheritance information of an ASE node */
 /** Helper structure to represent the inheritance information of an ASE node */
-struct InheritanceInfo
-{
+struct InheritanceInfo {
     //! Default constructor
     //! Default constructor
-    InheritanceInfo()
-    {
-        // set the inheritance flag for all axes by default to true
-        for (unsigned int i = 0; i < 3;++i)
+    InheritanceInfo() AI_NO_EXCEPT {
+        for ( size_t i=0; i<3; ++i ) {
             abInheritPosition[i] = abInheritRotation[i] = abInheritScaling[i] = true;
             abInheritPosition[i] = abInheritRotation[i] = abInheritScaling[i] = true;
+        }
     }
     }
 
 
     //! Inherit the parent's position?, axis order is x,y,z
     //! Inherit the parent's position?, axis order is x,y,z
@@ -245,17 +225,19 @@ struct InheritanceInfo
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Represents an ASE file node. Base class for mesh, light and cameras */
 /** Represents an ASE file node. Base class for mesh, light and cameras */
-struct BaseNode
-{
-    enum Type {Light, Camera, Mesh, Dummy} mType;
-
+struct BaseNode {
+    enum Type {
+        Light, 
+        Camera, 
+        Mesh, 
+        Dummy
+    } mType;
 
 
     //! Construction from an existing name
     //! Construction from an existing name
     BaseNode(Type _mType, const std::string &name)
     BaseNode(Type _mType, const std::string &name)
     : mType         (_mType)
     : mType         (_mType)
     , mName         (name)
     , mName         (name)
-    , mProcessed    (false)
-    {
+    , mProcessed    (false) {
         // Set mTargetPosition to qnan
         // Set mTargetPosition to qnan
         const ai_real qnan = get_qnan();
         const ai_real qnan = get_qnan();
         mTargetPosition.x = qnan;
         mTargetPosition.x = qnan;
@@ -291,24 +273,23 @@ struct BaseNode
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE file mesh */
 /** Helper structure to represent an ASE file mesh */
-struct Mesh : public MeshWithSmoothingGroups<ASE::Face>, public BaseNode
-{
+struct Mesh : public MeshWithSmoothingGroups<ASE::Face>, public BaseNode {
     //! Default constructor has been deleted
     //! Default constructor has been deleted
     Mesh() = delete;
     Mesh() = delete;
 
 
-
     //! Construction from an existing name
     //! Construction from an existing name
     explicit Mesh(const std::string &name)
     explicit Mesh(const std::string &name)
-    : BaseNode  (BaseNode::Mesh, name)
+    : BaseNode( BaseNode::Mesh, name )
+    , mVertexColors()
+    , mBoneVertices()
+    , mBones()
     , iMaterialIndex(Face::DEFAULT_MATINDEX)
     , iMaterialIndex(Face::DEFAULT_MATINDEX)
-    , bSkip     (false)
-    {
-        // use 2 texture vertex components by default
-        for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c)
+    , bSkip     (false) {
+        for (unsigned int c = 0; c < AI_MAX_NUMBER_OF_TEXTURECOORDS;++c) {
             this->mNumUVComponents[c] = 2;
             this->mNumUVComponents[c] = 2;
+        }
     }
     }
 
 
-
     //! List of all texture coordinate sets
     //! List of all texture coordinate sets
     std::vector<aiVector3D> amTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
     std::vector<aiVector3D> amTexCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];
 
 
@@ -396,12 +377,11 @@ struct Camera : public BaseNode
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure to represent an ASE helper object (dummy) */
 /** Helper structure to represent an ASE helper object (dummy) */
-struct Dummy : public BaseNode
-{
+struct Dummy : public BaseNode {
     //! Constructor
     //! Constructor
-    Dummy()
-        : BaseNode  (BaseNode::Dummy, "DUMMY")
-    {
+    Dummy() AI_NO_EXCEPT
+    : BaseNode  (BaseNode::Dummy, "DUMMY") {
+        // empty
     }
     }
 };
 };
 
 
@@ -416,12 +396,11 @@ struct Dummy : public BaseNode
 // -------------------------------------------------------------------------------
 // -------------------------------------------------------------------------------
 /** \brief Class to parse ASE files
 /** \brief Class to parse ASE files
  */
  */
-class Parser
-{
-
+class Parser {
 private:
 private:
-
-    Parser() {}
+    Parser() AI_NO_EXCEPT {
+        // empty
+    }
 
 
 public:
 public:
 
 

+ 1 - 1
code/BaseImporter.cpp

@@ -65,7 +65,7 @@ using namespace Assimp;
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Constructor to be privately used by Importer
 // Constructor to be privately used by Importer
-BaseImporter::BaseImporter()
+BaseImporter::BaseImporter() AI_NO_EXCEPT
 : m_progress() {
 : m_progress() {
     // nothing to do here
     // nothing to do here
 }
 }

+ 1 - 1
code/BaseProcess.cpp

@@ -53,7 +53,7 @@ using namespace Assimp;
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Constructor to be privately used by Importer
 // Constructor to be privately used by Importer
-BaseProcess::BaseProcess()
+BaseProcess::BaseProcess() AI_NO_EXCEPT
 : shared()
 : shared()
 , progress()
 , progress()
 {
 {

+ 2 - 6
code/BaseProcess.h

@@ -211,20 +211,16 @@ private:
  * should be executed. If the function returns true, the class' Execute()
  * should be executed. If the function returns true, the class' Execute()
  * function is called subsequently.
  * function is called subsequently.
  */
  */
-class ASSIMP_API_WINONLY BaseProcess
-{
+class ASSIMP_API_WINONLY BaseProcess {
     friend class Importer;
     friend class Importer;
 
 
 public:
 public:
-
     /** Constructor to be privately used by Importer */
     /** Constructor to be privately used by Importer */
-    BaseProcess();
+    BaseProcess() AI_NO_EXCEPT;
 
 
     /** Destructor, private as well */
     /** Destructor, private as well */
     virtual ~BaseProcess();
     virtual ~BaseProcess();
 
 
-public:
-
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** Returns whether the processing step is present in the given flag.
     /** Returns whether the processing step is present in the given flag.
      * @param pFlags The processing flags the importer was called with. A
      * @param pFlags The processing flags the importer was called with. A

+ 1 - 3
code/COBLoader.cpp

@@ -137,9 +137,7 @@ void COBImporter::SetupProperties(const Importer* /*pImp*/)
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
 // Imports the given file into the given scene structure.
 // Imports the given file into the given scene structure.
-void COBImporter::InternReadFile( const std::string& pFile,
-    aiScene* pScene, IOSystem* pIOHandler)
-{
+void COBImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) {
     COB::Scene scene;
     COB::Scene scene;
     std::unique_ptr<StreamReaderLE> stream(new StreamReaderLE( pIOHandler->Open(pFile,"rb")) );
     std::unique_ptr<StreamReaderLE> stream(new StreamReaderLE( pIOHandler->Open(pFile,"rb")) );
 
 

+ 1 - 1
code/EmbedTexturesProcess.cpp

@@ -119,7 +119,7 @@ bool EmbedTexturesProcess::addTexture(aiScene* pScene, std::string path) const {
         }
         }
     }
     }
 
 
-    aiTexel* imageContent = new aiTexel[1u + imageSize / sizeof(aiTexel)];
+    aiTexel* imageContent = new aiTexel[ 1ul + static_cast<unsigned long>( imageSize ) / sizeof(aiTexel)];
     file.seekg(0, std::ios::beg);
     file.seekg(0, std::ios::beg);
     file.read(reinterpret_cast<char*>(imageContent), imageSize);
     file.read(reinterpret_cast<char*>(imageContent), imageSize);
 
 

+ 2 - 2
code/Importer.h

@@ -120,11 +120,11 @@ public:
     SharedPostProcessInfo* mPPShared;
     SharedPostProcessInfo* mPPShared;
 
 
     /// The default class constructor.
     /// The default class constructor.
-    ImporterPimpl();
+    ImporterPimpl() AI_NO_EXCEPT;
 };
 };
 
 
 inline
 inline
-ImporterPimpl::ImporterPimpl()
+ImporterPimpl::ImporterPimpl() AI_NO_EXCEPT
 : mIOHandler( nullptr )
 : mIOHandler( nullptr )
 , mIsDefaultHandler( false )
 , mIsDefaultHandler( false )
 , mProgressHandler( nullptr )
 , mProgressHandler( nullptr )

+ 19 - 20
code/LWOAnimation.h

@@ -113,14 +113,14 @@ enum PrePostBehaviour
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a LWO animation keyframe
 /** \brief Data structure for a LWO animation keyframe
  */
  */
-struct Key
-{
-    Key()
-        : time(),
-        value(),
-        inter   (IT_LINE),
-        params()
-    {}
+struct Key {
+    Key() AI_NO_EXCEPT 
+    : time()
+    , value()
+    , inter(IT_LINE)
+    , params() {
+        // empty
+    }
 
 
     //! Current time
     //! Current time
     double time;
     double time;
@@ -144,17 +144,16 @@ struct Key
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a LWO animation envelope
 /** \brief Data structure for a LWO animation envelope
  */
  */
-struct Envelope
-{
-    Envelope()
-        :   index()
-        ,   type    (EnvelopeType_Unknown)
-        ,   pre     (PrePostBehaviour_Constant)
-        ,   post    (PrePostBehaviour_Constant)
-
-        ,   old_first (0)
-        ,   old_last  (0)
-    {}
+struct Envelope {
+    Envelope() AI_NO_EXCEPT
+    : index()
+    , type(EnvelopeType_Unknown)
+    , pre(PrePostBehaviour_Constant)
+    , post(PrePostBehaviour_Constant)
+    , old_first(0)
+    , old_last(0) {
+        // empty
+    }
 
 
     //! Index of this envelope
     //! Index of this envelope
     unsigned int index;
     unsigned int index;
@@ -162,7 +161,7 @@ struct Envelope
     //! Type of envelope
     //! Type of envelope
     EnvelopeType type;
     EnvelopeType type;
 
 
-    //! Pre and post-behaviour
+    //! Pre- and post-behavior
     PrePostBehaviour pre,post;
     PrePostBehaviour pre,post;
 
 
     //! Keyframes for this envelope
     //! Keyframes for this envelope

+ 7 - 7
code/LWOFileData.h

@@ -261,14 +261,14 @@ namespace LWO {
  * \note We can't use the code in SmoothingGroups.inl here - the mesh
  * \note We can't use the code in SmoothingGroups.inl here - the mesh
  *   structures of 3DS/ASE and LWO are too different.
  *   structures of 3DS/ASE and LWO are too different.
  */
  */
-struct Face : public aiFace
-{
+struct Face : public aiFace {
     //! Default construction
     //! Default construction
-    Face()
-        : surfaceIndex  (0)
-        , smoothGroup   (0)
-        , type          (AI_LWO_FACE)
-    {}
+    Face() AI_NO_EXCEPT
+    : surfaceIndex( 0 )
+    , smoothGroup( 0 )
+    , type( AI_LWO_FACE ) {
+        // empty
+    }
 
 
     //! Construction from given type
     //! Construction from given type
     explicit Face(uint32_t _type)
     explicit Face(uint32_t _type)

+ 1 - 1
code/LimitBoneWeightsProcess.h

@@ -120,7 +120,7 @@ public:
     {
     {
         unsigned int mBone; ///< Index of the bone
         unsigned int mBone; ///< Index of the bone
         float mWeight;      ///< Weight of that bone on this vertex
         float mWeight;      ///< Weight of that bone on this vertex
-        Weight()
+        Weight() AI_NO_EXCEPT
         : mBone(0)
         : mBone(0)
         , mWeight(0.0f)
         , mWeight(0.0f)
         { }
         { }

+ 2 - 2
code/MD3Loader.h

@@ -125,7 +125,7 @@ enum AlphaTestFunc
  */
  */
 struct ShaderMapBlock
 struct ShaderMapBlock
 {
 {
-    ShaderMapBlock()
+    ShaderMapBlock() AI_NO_EXCEPT
          :  blend_src   (BLEND_NONE)
          :  blend_src   (BLEND_NONE)
          ,  blend_dest  (BLEND_NONE)
          ,  blend_dest  (BLEND_NONE)
          ,  alpha_test  (AT_NONE)
          ,  alpha_test  (AT_NONE)
@@ -150,7 +150,7 @@ struct ShaderMapBlock
  */
  */
 struct ShaderDataBlock
 struct ShaderDataBlock
 {
 {
-    ShaderDataBlock()
+    ShaderDataBlock() AI_NO_EXCEPT
         :   cull    (CULL_CW)
         :   cull    (CULL_CW)
     {}
     {}
 
 

+ 7 - 7
code/MD5Parser.h

@@ -192,14 +192,14 @@ typedef std::vector< FrameDesc > FrameList;
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Represents a vertex  descriptor in a MD5 file
 /** Represents a vertex  descriptor in a MD5 file
 */
 */
-struct VertexDesc
-{
-    VertexDesc()
-        : mFirstWeight  (0)
-        , mNumWeights   (0)
-    {}
+struct VertexDesc {
+    VertexDesc() AI_NO_EXCEPT
+    : mFirstWeight(0)
+    , mNumWeights(0) {
+        // empty
+    }
 
 
-    //! UV cordinate of the vertex
+    //! UV coordinate of the vertex
     aiVector2D mUV;
     aiVector2D mUV;
 
 
     //! Index of the first weight of the vertex in
     //! Index of the first weight of the vertex in

+ 26 - 38
code/MDCFileData.h

@@ -61,7 +61,6 @@ http://themdcfile.planetwolfenstein.gamespy.com/MDC_File_Format.pdf
 namespace Assimp {
 namespace Assimp {
 namespace MDC {
 namespace MDC {
 
 
-
 // to make it easier for us, we test the magic word against both "endianesses"
 // to make it easier for us, we test the magic word against both "endianesses"
 #define AI_MDC_MAGIC_NUMBER_BE  AI_MAKE_MAGIC("CPDI")
 #define AI_MDC_MAGIC_NUMBER_BE  AI_MAKE_MAGIC("CPDI")
 #define AI_MDC_MAGIC_NUMBER_LE  AI_MAKE_MAGIC("IDPC")
 #define AI_MDC_MAGIC_NUMBER_LE  AI_MAKE_MAGIC("IDPC")
@@ -79,8 +78,7 @@ namespace MDC {
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC file's main header
 /** \brief Data structure for a MDC file's main header
  */
  */
-struct Header
-{
+struct Header {
     uint32_t ulIdent ;
     uint32_t ulIdent ;
     uint32_t ulVersion ;
     uint32_t ulVersion ;
     char ucName [ AI_MDC_MAXQPATH ] ;
     char ucName [ AI_MDC_MAXQPATH ] ;
@@ -100,8 +98,7 @@ struct Header
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC file's surface header
 /** \brief Data structure for a MDC file's surface header
  */
  */
-struct Surface
-{
+struct Surface {
     uint32_t ulIdent ;
     uint32_t ulIdent ;
     char ucName [ AI_MDC_MAXQPATH ] ;
     char ucName [ AI_MDC_MAXQPATH ] ;
     uint32_t ulFlags ;
     uint32_t ulFlags ;
@@ -118,23 +115,22 @@ struct Surface
     uint32_t ulOffsetFrameBaseFrames ;
     uint32_t ulOffsetFrameBaseFrames ;
     uint32_t ulOffsetFrameCompFrames ;
     uint32_t ulOffsetFrameCompFrames ;
     uint32_t ulOffsetEnd;
     uint32_t ulOffsetEnd;
-    Surface()
-        : ulIdent(),
-        ulFlags(),
-        ulNumCompFrames(),
-        ulNumBaseFrames(),
-        ulNumShaders(),
-        ulNumVertices(),
-        ulNumTriangles(),
-        ulOffsetTriangles(),
-        ulOffsetShaders(),
-        ulOffsetTexCoords(),
-        ulOffsetBaseVerts(),
-        ulOffsetCompVerts(),
-        ulOffsetFrameBaseFrames(),
-        ulOffsetFrameCompFrames(),
-        ulOffsetEnd()
-    {
+    Surface() AI_NO_EXCEPT
+    : ulIdent()
+    , ulFlags()
+    , ulNumCompFrames()
+    , ulNumBaseFrames()
+    , ulNumShaders() 
+    , ulNumVertices()
+    , ulNumTriangles()
+    , ulOffsetTriangles()
+    , ulOffsetShaders()
+    , ulOffsetTexCoords()
+    , ulOffsetBaseVerts() 
+    , ulOffsetCompVerts()
+    , ulOffsetFrameBaseFrames()
+    , ulOffsetFrameCompFrames()
+    , ulOffsetEnd() {
         ucName[AI_MDC_MAXQPATH-1] = '\0';
         ucName[AI_MDC_MAXQPATH-1] = '\0';
     }
     }
 } PACK_STRUCT;
 } PACK_STRUCT;
@@ -142,8 +138,7 @@ struct Surface
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC frame
 /** \brief Data structure for a MDC frame
  */
  */
-struct Frame
-{
+struct Frame {
     //! bounding box minimum coords
     //! bounding box minimum coords
     aiVector3D bboxMin ;
     aiVector3D bboxMin ;
 
 
@@ -163,24 +158,21 @@ struct Frame
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC triangle
 /** \brief Data structure for a MDC triangle
  */
  */
-struct Triangle
-{
+struct Triangle {
     uint32_t aiIndices[3];
     uint32_t aiIndices[3];
 } PACK_STRUCT;
 } PACK_STRUCT;
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC texture coordinate
 /** \brief Data structure for a MDC texture coordinate
  */
  */
-struct TexturCoord
-{
+struct TexturCoord {
     float u,v;
     float u,v;
 } PACK_STRUCT;
 } PACK_STRUCT;
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC base vertex
 /** \brief Data structure for a MDC base vertex
  */
  */
-struct BaseVertex
-{
+struct BaseVertex {
     int16_t x,y,z;
     int16_t x,y,z;
     uint16_t normal;
     uint16_t normal;
 } PACK_STRUCT;
 } PACK_STRUCT;
@@ -188,25 +180,20 @@ struct BaseVertex
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC compressed vertex
 /** \brief Data structure for a MDC compressed vertex
  */
  */
-struct CompressedVertex
-{
+struct CompressedVertex {
     uint8_t xd,yd,zd,nd;
     uint8_t xd,yd,zd,nd;
 } PACK_STRUCT;
 } PACK_STRUCT;
 
 
-
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** \brief Data structure for a MDC shader
 /** \brief Data structure for a MDC shader
  */
  */
-struct Shader
-{
+struct Shader {
     char ucName [ AI_MDC_MAXQPATH ] ;
     char ucName [ AI_MDC_MAXQPATH ] ;
     uint32_t ulPath;
     uint32_t ulPath;
-
 } PACK_STRUCT;
 } PACK_STRUCT;
 
 
 #include <assimp/Compiler/poppack1.h>
 #include <assimp/Compiler/poppack1.h>
 
 
-
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Build a floating point vertex from the compressed data in MDC files
 /** Build a floating point vertex from the compressed data in MDC files
  */
  */
@@ -215,6 +202,7 @@ void BuildVertex(const Frame& frame,
     const CompressedVertex& cvert,
     const CompressedVertex& cvert,
     aiVector3D& vXYZOut,
     aiVector3D& vXYZOut,
     aiVector3D& vNorOut);
     aiVector3D& vNorOut);
-}}
+}
+}
 
 
 #endif // !! AI_MDCFILEHELPER_H_INC
 #endif // !! AI_MDCFILEHELPER_H_INC

+ 16 - 21
code/MDLFileData.h

@@ -717,11 +717,9 @@ struct GroupFrame
  */
  */
 struct IntFace_MDL7 {
 struct IntFace_MDL7 {
     // provide a constructor for our own convenience
     // provide a constructor for our own convenience
-    IntFace_MDL7()
-    {
-        // set everything to zero
-        mIndices[0] = mIndices[1] = mIndices[2] = 0;
-        iMatIndex[0] = iMatIndex[1] = 0;
+    IntFace_MDL7() AI_NO_EXCEPT {
+        ::memset( mIndices, 0, sizeof(uint32_t) *3);
+        ::memset( iMatIndex, 0, sizeof( unsigned int) *2);
     }
     }
 
 
     //! Vertex indices
     //! Vertex indices
@@ -737,13 +735,11 @@ struct IntFace_MDL7 {
  *  which has been created from two single materials along with the
  *  which has been created from two single materials along with the
  *  original material indices.
  *  original material indices.
  */
  */
-struct IntMaterial_MDL7
-{
+struct IntMaterial_MDL7 {
     // provide a constructor for our own convenience
     // provide a constructor for our own convenience
-    IntMaterial_MDL7()
-    {
-        pcMat = NULL;
-        iOldMatIndices[0] = iOldMatIndices[1] = 0;
+    IntMaterial_MDL7() AI_NO_EXCEPT
+    : pcMat( nullptr ) {
+        ::memset( iOldMatIndices, 0, sizeof(unsigned int) *2);
     }
     }
 
 
     //! Material instance
     //! Material instance
@@ -761,7 +757,7 @@ struct IntMaterial_MDL7
 struct IntBone_MDL7 : aiBone
 struct IntBone_MDL7 : aiBone
 {
 {
     //! Default constructor
     //! Default constructor
-    IntBone_MDL7() : iParent (0xffff)
+    IntBone_MDL7() AI_NO_EXCEPT : iParent (0xffff)
     {
     {
         pkeyPositions.reserve(30);
         pkeyPositions.reserve(30);
         pkeyScalings.reserve(30);
         pkeyScalings.reserve(30);
@@ -806,12 +802,12 @@ struct IntFrameInfo_MDL7
 struct IntGroupInfo_MDL7
 struct IntGroupInfo_MDL7
 {
 {
     //! Default constructor
     //! Default constructor
-    IntGroupInfo_MDL7()
+    IntGroupInfo_MDL7() AI_NO_EXCEPT
         :   iIndex(0)
         :   iIndex(0)
-        ,   pcGroup(NULL)
-        ,   pcGroupUVs(NULL)
-        ,   pcGroupTris(NULL)
-        ,   pcGroupVerts(NULL)
+        ,   pcGroup(nullptr)
+        ,   pcGroupUVs(nullptr)
+        ,   pcGroupTris(nullptr)
+        ,   pcGroupVerts(nullptr)
         {}
         {}
 
 
     //! Construction from an existing group header
     //! Construction from an existing group header
@@ -843,7 +839,7 @@ struct IntGroupInfo_MDL7
 //! Holds the data that belongs to a MDL7 mesh group
 //! Holds the data that belongs to a MDL7 mesh group
 struct IntGroupData_MDL7
 struct IntGroupData_MDL7
 {
 {
-    IntGroupData_MDL7()
+    IntGroupData_MDL7() AI_NO_EXCEPT
         : bNeed2UV(false)
         : bNeed2UV(false)
     {}
     {}
 
 
@@ -872,10 +868,9 @@ struct IntGroupData_MDL7
 
 
 // -------------------------------------------------------------------------------------
 // -------------------------------------------------------------------------------------
 //! Holds data from an MDL7 file that is shared by all mesh groups
 //! Holds data from an MDL7 file that is shared by all mesh groups
-struct IntSharedData_MDL7
-{
+struct IntSharedData_MDL7 {
     //! Default constructor
     //! Default constructor
-    IntSharedData_MDL7()
+    IntSharedData_MDL7() AI_NO_EXCEPT
         : apcOutBones(),
         : apcOutBones(),
         iNum()
         iNum()
     {
     {

+ 10 - 8
code/OptimizeMeshes.h

@@ -67,20 +67,22 @@ namespace Assimp    {
 class OptimizeMeshesProcess : public BaseProcess
 class OptimizeMeshesProcess : public BaseProcess
 {
 {
 public:
 public:
-
+    /// @brief  The class constructor.
     OptimizeMeshesProcess();
     OptimizeMeshesProcess();
+
+    /// @brief  The class destcructor,
     ~OptimizeMeshesProcess();
     ~OptimizeMeshesProcess();
 
 
 
 
     /** @brief Internal utility to store additional mesh info
     /** @brief Internal utility to store additional mesh info
      */
      */
-    struct MeshInfo
-    {
-        MeshInfo()
-            :   instance_cnt  (0)
-            ,   vertex_format (0)
-            ,   output_id     (0xffffffff)
-        {}
+    struct MeshInfo {
+        MeshInfo() AI_NO_EXCEPT
+        : instance_cnt(0)
+        , vertex_format(0)
+        , output_id(0xffffffff) {
+            // empty
+        }
 
 
         //! Number of times this mesh is referenced
         //! Number of times this mesh is referenced
         unsigned int instance_cnt;
         unsigned int instance_cnt;

+ 19 - 13
code/PlyParser.h

@@ -209,7 +209,7 @@ enum EElementSemantic {
 class Property {
 class Property {
 public:
 public:
     //! Default constructor
     //! Default constructor
-    Property()
+    Property() AI_NO_EXCEPT
     : eType (EDT_Int)
     : eType (EDT_Int)
     , Semantic()
     , Semantic()
     , bIsList(false)
     , bIsList(false)
@@ -257,7 +257,7 @@ public:
 class Element {
 class Element {
 public:
 public:
     //! Default constructor
     //! Default constructor
-    Element()
+    Element() AI_NO_EXCEPT
     : eSemantic (EEST_INVALID)
     : eSemantic (EEST_INVALID)
     , NumOccur(0) {
     , NumOccur(0) {
         // empty
         // empty
@@ -297,8 +297,9 @@ class PropertyInstance
 public:
 public:
 
 
     //! Default constructor
     //! Default constructor
-    PropertyInstance ()
-    {}
+    PropertyInstance() AI_NO_EXCEPT {
+        // empty
+    }
 
 
     union ValueUnion
     union ValueUnion
     {
     {
@@ -356,13 +357,13 @@ public:
 // ---------------------------------------------------------------------------------
 // ---------------------------------------------------------------------------------
 /** \brief Class for an element instance in a PLY file
 /** \brief Class for an element instance in a PLY file
  */
  */
-class ElementInstance
-{
+class ElementInstance {
 public:
 public:
-
     //! Default constructor
     //! Default constructor
-    ElementInstance ()
-    {}
+    ElementInstance()  AI_NO_EXCEPT
+    : alProperties() {
+        // empty
+    }
 
 
     //! List of all parsed properties
     //! List of all parsed properties
     std::vector< PropertyInstance > alProperties;
     std::vector< PropertyInstance > alProperties;
@@ -386,8 +387,10 @@ class ElementInstanceList
 public:
 public:
 
 
     //! Default constructor
     //! Default constructor
-    ElementInstanceList ()
-    {}
+    ElementInstanceList() AI_NO_EXCEPT
+    : alInstances() {
+        // empty
+    }
 
 
     //! List of all element instances
     //! List of all element instances
     std::vector< ElementInstance > alInstances;
     std::vector< ElementInstance > alInstances;
@@ -411,8 +414,11 @@ class DOM
 public:
 public:
 
 
     //! Default constructor
     //! Default constructor
-    DOM()
-    {}
+    DOM() AI_NO_EXCEPT
+    : alElements()
+    , alElementData() {
+
+    }
 
 
 
 
     //! Contains all elements of the file format
     //! Contains all elements of the file format

+ 21 - 20
code/SMDLoader.h

@@ -62,17 +62,17 @@ struct aiNode;
 // STL headers
 // STL headers
 #include <vector>
 #include <vector>
 
 
-namespace Assimp    {
-
-namespace SMD   {
+namespace Assimp {
+namespace SMD {
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Data structure for a vertex in a SMD file
 /** Data structure for a vertex in a SMD file
 */
 */
-struct Vertex
-{
-    Vertex() : iParentNode(UINT_MAX)
-     {}
+struct Vertex {
+    Vertex() AI_NO_EXCEPT
+    : iParentNode(UINT_MAX) {
+        // empty
+    }
 
 
     //! Vertex position, normal and texture coordinate
     //! Vertex position, normal and texture coordinate
     aiVector3D pos,nor,uv;
     aiVector3D pos,nor,uv;
@@ -90,10 +90,12 @@ struct Vertex
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Data structure for a face in a SMD file
 /** Data structure for a face in a SMD file
 */
 */
-struct Face
-{
-    Face() : iTexture(0x0)
-     {}
+struct Face {
+    Face() AI_NO_EXCEPT
+    : iTexture(0x0)
+    , avVertices{} {
+        // empty
+    }
 
 
     //! Texture index for the face
     //! Texture index for the face
     unsigned int iTexture;
     unsigned int iTexture;
@@ -105,11 +107,12 @@ struct Face
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Data structure for a bone in a SMD file
 /** Data structure for a bone in a SMD file
 */
 */
-struct Bone
-{
+struct Bone {
     //! Default constructor
     //! Default constructor
-    Bone() : iParent(UINT_MAX), bIsUsed(false)
-    {
+    Bone() AI_NO_EXCEPT
+    : iParent(UINT_MAX)
+    , bIsUsed(false) {
+        // empty
     }
     }
 
 
     //! Destructor
     //! Destructor
@@ -124,12 +127,10 @@ struct Bone
     uint32_t iParent;
     uint32_t iParent;
 
 
     //! Animation of the bone
     //! Animation of the bone
-    struct Animation
-    {
+    struct Animation {
         //! Public default constructor
         //! Public default constructor
-        Animation()
-            : iFirstTimeKey()
-        {
+        Animation() AI_NO_EXCEPT
+        : iFirstTimeKey() {
             asKeys.reserve(20);
             asKeys.reserve(20);
         }
         }
 
 

+ 2 - 2
code/ScenePrivate.h

@@ -56,7 +56,7 @@ class Importer;
 
 
 struct ScenePrivateData {
 struct ScenePrivateData {
     //  The struct constructor.
     //  The struct constructor.
-    ScenePrivateData();
+    ScenePrivateData() AI_NO_EXCEPT;
 
 
     // Importer that originally loaded the scene though the C-API
     // Importer that originally loaded the scene though the C-API
     // If set, this object is owned by this private data instance.
     // If set, this object is owned by this private data instance.
@@ -74,7 +74,7 @@ struct ScenePrivateData {
 };
 };
 
 
 inline
 inline
-ScenePrivateData::ScenePrivateData()
+ScenePrivateData::ScenePrivateData() AI_NO_EXCEPT
 : mOrigImporter( nullptr )
 : mOrigImporter( nullptr )
 , mPPStepsApplied( 0 )
 , mPPStepsApplied( 0 )
 , mIsCopy( false ) {
 , mIsCopy( false ) {

+ 16 - 17
code/TextureTransform.h

@@ -65,14 +65,14 @@ namespace Assimp    {
 /** Small helper structure representing a shortcut into the material list
 /** Small helper structure representing a shortcut into the material list
  *  to be able to update some values quickly.
  *  to be able to update some values quickly.
 */
 */
-struct TTUpdateInfo
-{
-    TTUpdateInfo() :
-            directShortcut  (NULL)
-        ,   mat             (NULL)
-        ,   semantic        (0)
-        ,   index           (0)
-    {}
+struct TTUpdateInfo {
+    TTUpdateInfo() AI_NO_EXCEPT
+    : directShortcut(nullptr)
+    , mat(nullptr)
+    , semantic(0)
+    , index(0) {
+        // empty
+    }
 
 
     //! Direct shortcut, if available
     //! Direct shortcut, if available
     unsigned int* directShortcut;
     unsigned int* directShortcut;
@@ -88,15 +88,14 @@ struct TTUpdateInfo
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper class representing texture coordinate transformations
 /** Helper class representing texture coordinate transformations
 */
 */
-struct STransformVecInfo : public aiUVTransform
-{
-
-    STransformVecInfo()
-        :   uvIndex     (0)
-        ,   mapU        (aiTextureMapMode_Wrap)
-        ,   mapV        (aiTextureMapMode_Wrap)
-        ,   lockedPos   (AI_TT_UV_IDX_LOCK_NONE)
-    {}
+struct STransformVecInfo : public aiUVTransform {
+    STransformVecInfo() AI_NO_EXCEPT
+    : uvIndex(0)
+    , mapU(aiTextureMapMode_Wrap)
+    , mapV(aiTextureMapMode_Wrap)
+    , lockedPos(AI_TT_UV_IDX_LOCK_NONE) {
+        // empty
+    }
 
 
     //! Source texture coordinate index
     //! Source texture coordinate index
     unsigned int uvIndex;
     unsigned int uvIndex;

+ 76 - 42
code/XFileHelper.h

@@ -55,32 +55,33 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include <assimp/anim.h>
 #include <assimp/anim.h>
 #include <assimp/Defines.h>
 #include <assimp/Defines.h>
 
 
-namespace Assimp
-{
-namespace XFile
-{
+namespace Assimp {
+namespace XFile {
 
 
 /** Helper structure representing a XFile mesh face */
 /** Helper structure representing a XFile mesh face */
-struct Face
-{
+struct Face {
     std::vector<unsigned int> mIndices;
     std::vector<unsigned int> mIndices;
 };
 };
 
 
 /** Helper structure representing a texture filename inside a material and its potential source */
 /** Helper structure representing a texture filename inside a material and its potential source */
-struct TexEntry
-{
+struct TexEntry {
     std::string mName;
     std::string mName;
     bool mIsNormalMap; // true if the texname was specified in a NormalmapFilename tag
     bool mIsNormalMap; // true if the texname was specified in a NormalmapFilename tag
 
 
-    TexEntry() { mIsNormalMap = false; }
-    TexEntry( const std::string& pName, bool pIsNormalMap = false)
-        : mName( pName), mIsNormalMap( pIsNormalMap)
-    { /* done */ }
+    TexEntry() AI_NO_EXCEPT
+    : mName()
+    , mIsNormalMap(false) {
+        // empty
+    }
+    TexEntry(const std::string& pName, bool pIsNormalMap = false)
+    : mName(pName)
+    , mIsNormalMap(pIsNormalMap) {
+        // empty
+    }
 };
 };
 
 
 /** Helper structure representing a XFile material */
 /** Helper structure representing a XFile material */
-struct Material
-{
+struct Material {
     std::string mName;
     std::string mName;
     bool mIsReference; // if true, mName holds a name by which the actual material can be found in the material list
     bool mIsReference; // if true, mName holds a name by which the actual material can be found in the material list
     aiColor4D mDiffuse;
     aiColor4D mDiffuse;
@@ -88,19 +89,18 @@ struct Material
     aiColor3D mSpecular;
     aiColor3D mSpecular;
     aiColor3D mEmissive;
     aiColor3D mEmissive;
     std::vector<TexEntry> mTextures;
     std::vector<TexEntry> mTextures;
-
     size_t sceneIndex; ///< the index under which it was stored in the scene's material list
     size_t sceneIndex; ///< the index under which it was stored in the scene's material list
 
 
-    Material()
-        : mIsReference(false),
-        mSpecularExponent(),
-        sceneIndex(SIZE_MAX)
-    {}
+    Material() AI_NO_EXCEPT
+    : mIsReference(false)
+    , mSpecularExponent()
+    , sceneIndex(SIZE_MAX) {
+        // empty
+    }
 };
 };
 
 
 /** Helper structure to represent a bone weight */
 /** Helper structure to represent a bone weight */
-struct BoneWeight
-{
+struct BoneWeight {
     unsigned int mVertex;
     unsigned int mVertex;
     ai_real mWeight;
     ai_real mWeight;
 };
 };
@@ -114,8 +114,7 @@ struct Bone
 };
 };
 
 
 /** Helper structure to represent an XFile mesh */
 /** Helper structure to represent an XFile mesh */
-struct Mesh
-{
+struct Mesh {
     std::string mName;
     std::string mName;
     std::vector<aiVector3D> mPositions;
     std::vector<aiVector3D> mPositions;
     std::vector<Face> mPosFaces;
     std::vector<Face> mPosFaces;
@@ -131,38 +130,65 @@ struct Mesh
 
 
     std::vector<Bone> mBones;
     std::vector<Bone> mBones;
 
 
-    explicit Mesh(const std::string &pName = "") { mName = pName; mNumTextures = 0; mNumColorSets = 0; }
+    explicit Mesh(const std::string &pName = "") AI_NO_EXCEPT
+    : mName( pName )
+    , mPositions()
+    , mPosFaces()
+    , mNormals()
+    , mNormFaces()
+    , mNumTextures(0)
+    , mTexCoords{}
+    , mNumColorSets(0)
+    , mColors{}
+    , mFaceMaterials()
+    , mMaterials()
+    , mBones() {
+        // empty
+    }
 };
 };
 
 
 /** Helper structure to represent a XFile frame */
 /** Helper structure to represent a XFile frame */
-struct Node
-{
+struct Node {
     std::string mName;
     std::string mName;
     aiMatrix4x4 mTrafoMatrix;
     aiMatrix4x4 mTrafoMatrix;
     Node* mParent;
     Node* mParent;
     std::vector<Node*> mChildren;
     std::vector<Node*> mChildren;
     std::vector<Mesh*> mMeshes;
     std::vector<Mesh*> mMeshes;
 
 
-    Node() { mParent = NULL; }
-    explicit Node( Node* pParent) { mParent = pParent; }
-    ~Node()
-    {
-        for( unsigned int a = 0; a < mChildren.size(); a++)
+    Node() AI_NO_EXCEPT
+    : mName()
+    , mTrafoMatrix()
+    , mParent(nullptr)
+    , mChildren()
+    , mMeshes() {
+        // empty
+    }
+    explicit Node( Node* pParent)
+    : mName()
+    , mTrafoMatrix()
+    , mParent(pParent)
+    , mChildren()
+    , mMeshes() {
+        // empty
+    }
+
+    ~Node() {
+        for (unsigned int a = 0; a < mChildren.size(); ++a ) {
             delete mChildren[a];
             delete mChildren[a];
-        for( unsigned int a = 0; a < mMeshes.size(); a++)
+        }
+        for (unsigned int a = 0; a < mMeshes.size(); ++a) {
             delete mMeshes[a];
             delete mMeshes[a];
+        }
     }
     }
 };
 };
 
 
-struct MatrixKey
-{
+struct MatrixKey {
     double mTime;
     double mTime;
     aiMatrix4x4 mMatrix;
     aiMatrix4x4 mMatrix;
 };
 };
 
 
 /** Helper structure representing a single animated bone in a XFile */
 /** Helper structure representing a single animated bone in a XFile */
-struct AnimBone
-{
+struct AnimBone {
     std::string mBoneName;
     std::string mBoneName;
     std::vector<aiVectorKey> mPosKeys;  // either three separate key sequences for position, rotation, scaling
     std::vector<aiVectorKey> mPosKeys;  // either three separate key sequences for position, rotation, scaling
     std::vector<aiQuatKey> mRotKeys;
     std::vector<aiQuatKey> mRotKeys;
@@ -194,14 +220,22 @@ struct Scene
     std::vector<Animation*> mAnims;
     std::vector<Animation*> mAnims;
     unsigned int mAnimTicksPerSecond;
     unsigned int mAnimTicksPerSecond;
 
 
-    Scene() { mRootNode = NULL; mAnimTicksPerSecond = 0; }
-    ~Scene()
-    {
+    Scene() AI_NO_EXCEPT
+    : mRootNode(nullptr)
+    , mGlobalMeshes()
+    , mGlobalMaterials()
+    , mAnimTicksPerSecond(0) {
+        // empty
+    }
+    ~Scene() {
         delete mRootNode;
         delete mRootNode;
-        for( unsigned int a = 0; a < mGlobalMeshes.size(); a++)
+        mRootNode = nullptr;
+        for (unsigned int a = 0; a < mGlobalMeshes.size(); ++a ) {
             delete mGlobalMeshes[a];
             delete mGlobalMeshes[a];
-        for( unsigned int a = 0; a < mAnims.size(); a++)
+        }
+        for (unsigned int a = 0; a < mAnims.size(); ++a ) {
             delete mAnims[a];
             delete mAnims[a];
+        }
     }
     }
 };
 };
 
 

+ 1 - 2
contrib/irrXML/irrArray.h

@@ -21,8 +21,7 @@ class array
 {
 {
 
 
 public:
 public:
-
-	array()
+	array() 
 		: data(0), allocated(0), used(0),
 		: data(0), allocated(0), used(0),
 			free_when_destroyed(true), is_sorted(true)
 			free_when_destroyed(true), is_sorted(true)
 	{
 	{

+ 2 - 4
include/assimp/BaseImporter.h

@@ -77,19 +77,17 @@ class IOStream;
  * imports the given file. ReadFile is not overridable, it just calls
  * imports the given file. ReadFile is not overridable, it just calls
  * InternReadFile() and catches any ImportErrorException that might occur.
  * InternReadFile() and catches any ImportErrorException that might occur.
  */
  */
-class ASSIMP_API BaseImporter
-{
+class ASSIMP_API BaseImporter {
     friend class Importer;
     friend class Importer;
 
 
 public:
 public:
 
 
     /** Constructor to be privately used by #Importer */
     /** Constructor to be privately used by #Importer */
-    BaseImporter();
+    BaseImporter() AI_NO_EXCEPT;
 
 
     /** Destructor, private as well */
     /** Destructor, private as well */
     virtual ~BaseImporter();
     virtual ~BaseImporter();
 
 
-public:
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** Returns whether the class can handle the format of the given file.
     /** Returns whether the class can handle the format of the given file.
      *
      *

+ 2 - 3
include/assimp/ByteSwapper.h

@@ -60,9 +60,8 @@ namespace Assimp    {
  * This is required to read big-endian model formats on little-endian machines,
  * This is required to read big-endian model formats on little-endian machines,
  * and vice versa. Direct use of this class is DEPRECATED. Use #StreamReader instead. */
  * and vice versa. Direct use of this class is DEPRECATED. Use #StreamReader instead. */
 // --------------------------------------------------------------------------------------
 // --------------------------------------------------------------------------------------
-class ByteSwap
-{
-    ByteSwap() {}
+class ByteSwap {
+    ByteSwap() AI_NO_EXCEPT {}
 
 
 public:
 public:
 
 

+ 11 - 13
include/assimp/DefaultIOStream.h

@@ -69,7 +69,7 @@ class ASSIMP_API DefaultIOStream : public IOStream
 #endif // __ANDROID__
 #endif // __ANDROID__
 
 
 protected:
 protected:
-    DefaultIOStream();
+    DefaultIOStream() AI_NO_EXCEPT;
     DefaultIOStream(FILE* pFile, const std::string &strFilename);
     DefaultIOStream(FILE* pFile, const std::string &strFilename);
 
 
 public:
 public:
@@ -111,27 +111,25 @@ private:
     FILE* mFile;
     FILE* mFile;
     //  Filename
     //  Filename
     std::string mFilename;
     std::string mFilename;
-
     // Cached file size
     // Cached file size
     mutable size_t mCachedSize;
     mutable size_t mCachedSize;
 };
 };
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
-inline DefaultIOStream::DefaultIOStream () :
-    mFile       (NULL),
-    mFilename   (""),
-    mCachedSize(SIZE_MAX)
-{
+inline
+DefaultIOStream::DefaultIOStream() AI_NO_EXCEPT
+: mFile(nullptr)
+, mFilename("")
+, mCachedSize(SIZE_MAX) {
     // empty
     // empty
 }
 }
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
-inline DefaultIOStream::DefaultIOStream (FILE* pFile,
-        const std::string &strFilename) :
-    mFile(pFile),
-    mFilename(strFilename),
-    mCachedSize(SIZE_MAX)
-{
+inline
+DefaultIOStream::DefaultIOStream (FILE* pFile, const std::string &strFilename)
+: mFile(pFile)
+, mFilename(strFilename)
+, mCachedSize(SIZE_MAX) {
     // empty
     // empty
 }
 }
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------

+ 2 - 2
include/assimp/IOStream.hpp

@@ -71,7 +71,7 @@ class ASSIMP_API IOStream
 {
 {
 protected:
 protected:
     /** Constructor protected, use IOSystem::Open() to create an instance. */
     /** Constructor protected, use IOSystem::Open() to create an instance. */
-    IOStream();
+    IOStream() AI_NO_EXCEPT;
 
 
 public:
 public:
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
@@ -126,7 +126,7 @@ public:
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 inline
 inline
-IOStream::IOStream() {
+IOStream::IOStream() AI_NO_EXCEPT {
     // empty
     // empty
 }
 }
 
 

+ 2 - 5
include/assimp/IOSystem.hpp

@@ -95,7 +95,7 @@ public:
      *  Create an instance of your derived class and assign it to an
      *  Create an instance of your derived class and assign it to an
      *  #Assimp::Importer instance by calling Importer::SetIOHandler().
      *  #Assimp::Importer instance by calling Importer::SetIOHandler().
      */
      */
-    IOSystem();
+    IOSystem() AI_NO_EXCEPT;
 
 
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** @brief Virtual destructor.
     /** @brief Virtual destructor.
@@ -105,9 +105,6 @@ public:
      */
      */
     virtual ~IOSystem();
     virtual ~IOSystem();
 
 
-
-public:
-
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** @brief For backward compatibility
     /** @brief For backward compatibility
      *  @see Exists(const char*)
      *  @see Exists(const char*)
@@ -233,7 +230,7 @@ private:
 
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 AI_FORCE_INLINE
 AI_FORCE_INLINE
-IOSystem::IOSystem()
+IOSystem::IOSystem() AI_NO_EXCEPT
 : m_pathStack() {
 : m_pathStack() {
     // empty
     // empty
 }
 }

+ 3 - 3
include/assimp/LogStream.hpp

@@ -65,7 +65,7 @@ class ASSIMP_API LogStream
 {
 {
 protected:
 protected:
     /** @brief  Default constructor */
     /** @brief  Default constructor */
-    LogStream();
+    LogStream() AI_NO_EXCEPT;
 
 
 public:
 public:
     /** @brief  Virtual destructor  */
     /** @brief  Virtual destructor  */
@@ -91,12 +91,12 @@ public:
      *  @return New LogStream instance.  */
      *  @return New LogStream instance.  */
     static LogStream* createDefaultStream(aiDefaultLogStream stream,
     static LogStream* createDefaultStream(aiDefaultLogStream stream,
         const char* name = "AssimpLog.txt",
         const char* name = "AssimpLog.txt",
-        IOSystem* io = NULL);
+        IOSystem* io = nullptr );
 
 
 }; // !class LogStream
 }; // !class LogStream
 
 
 inline
 inline
-LogStream::LogStream() {
+LogStream::LogStream() AI_NO_EXCEPT {
     // empty
     // empty
 }
 }
 
 

+ 7 - 5
include/assimp/Logger.hpp

@@ -161,7 +161,7 @@ protected:
     /**
     /**
      *  Default constructor
      *  Default constructor
      */
      */
-    Logger();
+    Logger() AI_NO_EXCEPT;
 
 
     /**
     /**
      *  Construction with a given log severity
      *  Construction with a given log severity
@@ -215,8 +215,9 @@ protected:
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 //  Default constructor
 //  Default constructor
 inline
 inline
-Logger::Logger() {
-    setLogSeverity(NORMAL);
+Logger::Logger() AI_NO_EXCEPT
+: m_Severity(NORMAL) {
+    // empty
 }
 }
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
@@ -229,8 +230,9 @@ Logger::~Logger() {
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 // Construction with given logging severity
 // Construction with given logging severity
 inline
 inline
-Logger::Logger(LogSeverity severity) {
-    setLogSeverity(severity);
+Logger::Logger(LogSeverity severity)
+: m_Severity(severity) {
+    // empty
 }
 }
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------

+ 1 - 1
include/assimp/ProgressHandler.hpp

@@ -63,7 +63,7 @@ class ASSIMP_API ProgressHandler
 {
 {
 protected:
 protected:
     /** @brief  Default constructor */
     /** @brief  Default constructor */
-    ProgressHandler () {
+    ProgressHandler () AI_NO_EXCEPT  {
     }
     }
 public:
 public:
     /** @brief  Virtual destructor  */
     /** @brief  Virtual destructor  */

+ 20 - 12
include/assimp/SGSpatialSort.h

@@ -111,26 +111,34 @@ protected:
 
 
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
     /** An entry in a spatially sorted position array. Consists of a
     /** An entry in a spatially sorted position array. Consists of a
-     *  vertex index, its position and its precalculated distance from
+     *  vertex index, its position and its pre-calculated distance from
      *  the reference plane */
      *  the reference plane */
     // -------------------------------------------------------------------
     // -------------------------------------------------------------------
-    struct Entry
-    {
+    struct Entry {
         unsigned int mIndex;    ///< The vertex referred by this entry
         unsigned int mIndex;    ///< The vertex referred by this entry
         aiVector3D mPosition;   ///< Position
         aiVector3D mPosition;   ///< Position
         uint32_t mSmoothGroups;
         uint32_t mSmoothGroups;
         float mDistance;        ///< Distance of this vertex to the sorting plane
         float mDistance;        ///< Distance of this vertex to the sorting plane
 
 
-        Entry() { /** intentionally not initialized.*/ }
+        Entry() AI_NO_EXCEPT
+        : mIndex(0)
+        , mPosition()
+        , mSmoothGroups(0)
+        , mDistance(0.0f) {
+            // empty
+        }
+
         Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance,uint32_t pSG)
         Entry( unsigned int pIndex, const aiVector3D& pPosition, float pDistance,uint32_t pSG)
-        :
-            mIndex( pIndex),
-            mPosition( pPosition),
-            mSmoothGroups (pSG),
-            mDistance( pDistance)
-            {   }
-
-        bool operator < (const Entry& e) const { return mDistance < e.mDistance; }
+        : mIndex( pIndex)
+        , mPosition( pPosition)
+        , mSmoothGroups(pSG)
+        , mDistance( pDistance) {
+            // empty
+        }
+
+        bool operator < (const Entry& e) const {
+            return mDistance < e.mDistance;
+        }
     };
     };
 
 
     // all positions, sorted by distance to the sorting plane
     // all positions, sorted by distance to the sorting plane

+ 4 - 6
include/assimp/SmoothingGroups.h

@@ -52,12 +52,10 @@ http://www.jalix.org/ressources/graphics/3DS/_unofficials/3ds-unofficial.txt */
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 /** Helper structure representing a face with smoothing groups assigned */
 /** Helper structure representing a face with smoothing groups assigned */
-struct FaceWithSmoothingGroup
-{
-    FaceWithSmoothingGroup()
-        : mIndices(),
-        iSmoothGroup(0)
-    {
+struct FaceWithSmoothingGroup {
+    FaceWithSmoothingGroup() AI_NO_EXCEPT
+    : mIndices()
+    , iSmoothGroup(0) {
         // in debug builds set all indices to a common magic value
         // in debug builds set all indices to a common magic value
 #ifdef ASSIMP_BUILD_DEBUG
 #ifdef ASSIMP_BUILD_DEBUG
         this->mIndices[0] = 0xffffffff;
         this->mIndices[0] = 0xffffffff;

+ 1 - 1
include/assimp/SpatialSort.h

@@ -153,7 +153,7 @@ protected:
         aiVector3D mPosition; ///< Position
         aiVector3D mPosition; ///< Position
         ai_real mDistance; ///< Distance of this vertex to the sorting plane
         ai_real mDistance; ///< Distance of this vertex to the sorting plane
 
 
-        Entry()
+        Entry() AI_NO_EXCEPT
         : mIndex( 999999999 ), mPosition(), mDistance( 99999. ) {
         : mIndex( 999999999 ), mPosition(), mDistance( 99999. ) {
             // empty        
             // empty        
         }
         }

+ 16 - 16
include/assimp/anim.h

@@ -70,7 +70,7 @@ struct aiVectorKey
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     /// @brief  The default constructor.
     /// @brief  The default constructor.
-    aiVectorKey() 
+    aiVectorKey() AI_NO_EXCEPT
     : mTime( 0.0 )
     : mTime( 0.0 )
     , mValue() {
     , mValue() {
         // empty
         // empty
@@ -116,7 +116,7 @@ struct aiQuatKey
     C_STRUCT aiQuaternion mValue;
     C_STRUCT aiQuaternion mValue;
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiQuatKey()
+    aiQuatKey() AI_NO_EXCEPT
     : mTime( 0.0 )
     : mTime( 0.0 )
     , mValue() {
     , mValue() {
         // empty
         // empty
@@ -163,7 +163,7 @@ struct aiMeshKey
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiMeshKey()
+    aiMeshKey() AI_NO_EXCEPT
     : mTime(0.0)
     : mTime(0.0)
     , mValue(0)
     , mValue(0)
     {
     {
@@ -210,10 +210,10 @@ struct aiMeshMorphKey
     /** The number of values and weights */
     /** The number of values and weights */
     unsigned int mNumValuesAndWeights;
     unsigned int mNumValuesAndWeights;
 #ifdef __cplusplus
 #ifdef __cplusplus
-	aiMeshMorphKey()
+	aiMeshMorphKey() AI_NO_EXCEPT
 		: mTime(0.0)
 		: mTime(0.0)
-		, mValues(NULL)
-		, mWeights(NULL)
+		, mValues(nullptr)
+		, mWeights(nullptr)
 		, mNumValuesAndWeights(0)
 		, mNumValuesAndWeights(0)
 	{
 	{
 
 
@@ -324,13 +324,13 @@ struct aiNodeAnim {
     C_ENUM aiAnimBehaviour mPostState;
     C_ENUM aiAnimBehaviour mPostState;
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiNodeAnim() 
+    aiNodeAnim() AI_NO_EXCEPT
     : mNumPositionKeys( 0 )
     : mNumPositionKeys( 0 )
-    , mPositionKeys( NULL )
+    , mPositionKeys( nullptr )
     , mNumRotationKeys( 0 )
     , mNumRotationKeys( 0 )
-    , mRotationKeys( NULL )
+    , mRotationKeys( nullptr )
     , mNumScalingKeys( 0 )
     , mNumScalingKeys( 0 )
-    , mScalingKeys( NULL )
+    , mScalingKeys( nullptr )
     , mPreState( aiAnimBehaviour_DEFAULT )
     , mPreState( aiAnimBehaviour_DEFAULT )
     , mPostState( aiAnimBehaviour_DEFAULT ) {
     , mPostState( aiAnimBehaviour_DEFAULT ) {
          // empty
          // empty
@@ -366,7 +366,7 @@ struct aiMeshAnim
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiMeshAnim()
+    aiMeshAnim() AI_NO_EXCEPT
         : mNumKeys()
         : mNumKeys()
         , mKeys()
         , mKeys()
     {}
     {}
@@ -397,7 +397,7 @@ struct aiMeshMorphAnim
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiMeshMorphAnim()
+    aiMeshMorphAnim() AI_NO_EXCEPT
         : mNumKeys()
         : mNumKeys()
         , mKeys()
         , mKeys()
     {}
     {}
@@ -451,15 +451,15 @@ struct aiAnimation {
     C_STRUCT aiMeshMorphAnim **mMorphMeshChannels;
     C_STRUCT aiMeshMorphAnim **mMorphMeshChannels;
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiAnimation()
+    aiAnimation() AI_NO_EXCEPT
     : mDuration(-1.)
     : mDuration(-1.)
     , mTicksPerSecond(0.)
     , mTicksPerSecond(0.)
     , mNumChannels(0)
     , mNumChannels(0)
-    , mChannels(NULL)
+    , mChannels(nullptr)
     , mNumMeshChannels(0)
     , mNumMeshChannels(0)
-    , mMeshChannels(NULL)
+    , mMeshChannels(nullptr)
     , mNumMorphMeshChannels(0)
     , mNumMorphMeshChannels(0)
-    , mMorphMeshChannels(NULL) {
+    , mMorphMeshChannels(nullptr) {
         // empty
         // empty
     }
     }
 
 

+ 1 - 1
include/assimp/camera.h

@@ -174,7 +174,7 @@ struct aiCamera
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiCamera()
+    aiCamera() AI_NO_EXCEPT
         : mUp               (0.f,1.f,0.f)
         : mUp               (0.f,1.f,0.f)
         , mLookAt           (0.f,0.f,1.f)
         , mLookAt           (0.f,0.f,1.f)
         , mHorizontalFOV    (0.25f * (float)AI_MATH_PI)
         , mHorizontalFOV    (0.25f * (float)AI_MATH_PI)

+ 1 - 1
include/assimp/color4.h

@@ -59,7 +59,7 @@ template <typename TReal>
 class aiColor4t
 class aiColor4t
 {
 {
 public:
 public:
-    aiColor4t () : r(), g(), b(), a() {}
+    aiColor4t() AI_NO_EXCEPT : r(), g(), b(), a() {}
     aiColor4t (TReal _r, TReal _g, TReal _b, TReal _a)
     aiColor4t (TReal _r, TReal _g, TReal _b, TReal _a)
         : r(_r), g(_g), b(_b), a(_a) {}
         : r(_r), g(_g), b(_b), a(_a) {}
     explicit aiColor4t (TReal _r) : r(_r), g(_r), b(_r), a(_r) {}
     explicit aiColor4t (TReal _r) : r(_r), g(_r), b(_r), a(_r) {}

+ 10 - 0
include/assimp/defs.h

@@ -289,4 +289,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
  */
 #define AI_MAX_ALLOC(type) ((256U * 1024 * 1024) / sizeof(type))
 #define AI_MAX_ALLOC(type) ((256U * 1024 * 1024) / sizeof(type))
 
 
+#ifndef _MSC_VER
+#  define AI_NO_EXCEPT noexcept
+#else
+#  if (_MSC_VER == 1915 )
+#    define AI_NO_EXCEPT noexcept
+#  else
+#    define AI_NO_EXCEPT
+#  endif
+#endif
+
 #endif // !! AI_DEFINES_H_INC
 #endif // !! AI_DEFINES_H_INC

+ 1 - 1
include/assimp/fast_atof.h

@@ -195,7 +195,7 @@ uint64_t strtoul10_64( const char* in, const char** out=0, unsigned int* max_ino
             break;
             break;
         }
         }
 
 
-        const uint64_t new_value = ( value * 10 ) + ( *in - '0' );
+        const uint64_t new_value = ( value * (uint64_t) 10 ) + ( (uint64_t) ( *in - '0' ) );
 
 
         // numeric overflow, we rely on you
         // numeric overflow, we rely on you
         if ( new_value < value ) {
         if ( new_value < value ) {

+ 1 - 1
include/assimp/light.h

@@ -237,7 +237,7 @@ struct aiLight
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiLight()
+    aiLight() AI_NO_EXCEPT
         :   mType                 (aiLightSource_UNDEFINED)
         :   mType                 (aiLightSource_UNDEFINED)
         ,   mAttenuationConstant  (0.f)
         ,   mAttenuationConstant  (0.f)
         ,   mAttenuationLinear    (1.f)
         ,   mAttenuationLinear    (1.f)

+ 2 - 2
include/assimp/material.h

@@ -483,7 +483,7 @@ struct aiUVTransform
 
 
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiUVTransform()
+    aiUVTransform() AI_NO_EXCEPT
         :   mTranslation (0.0,0.0)
         :   mTranslation (0.0,0.0)
         ,   mScaling    (1.0,1.0)
         ,   mScaling    (1.0,1.0)
         ,   mRotation   (0.0)
         ,   mRotation   (0.0)
@@ -607,7 +607,7 @@ struct aiMaterialProperty
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiMaterialProperty()
+    aiMaterialProperty() AI_NO_EXCEPT
     : mSemantic( 0 )
     : mSemantic( 0 )
     , mIndex( 0 )
     , mIndex( 0 )
     , mDataLength( 0 )
     , mDataLength( 0 )

+ 1 - 1
include/assimp/matrix3x3.h

@@ -69,7 +69,7 @@ class aiMatrix3x3t
 {
 {
 public:
 public:
 
 
-    aiMatrix3x3t () :
+    aiMatrix3x3t() AI_NO_EXCEPT :
         a1(static_cast<TReal>(1.0f)), a2(), a3(),
         a1(static_cast<TReal>(1.0f)), a2(), a3(),
         b1(), b2(static_cast<TReal>(1.0f)), b3(),
         b1(), b2(static_cast<TReal>(1.0f)), b3(),
         c1(), c2(), c3(static_cast<TReal>(1.0f)) {}
         c1(), c2(), c3(static_cast<TReal>(1.0f)) {}

+ 1 - 1
include/assimp/matrix4x4.h

@@ -71,7 +71,7 @@ class aiMatrix4x4t
 public:
 public:
 
 
     /** set to identity */
     /** set to identity */
-    aiMatrix4x4t ();
+    aiMatrix4x4t() AI_NO_EXCEPT;
 
 
     /** construction from single values */
     /** construction from single values */
     aiMatrix4x4t (  TReal _a1, TReal _a2, TReal _a3, TReal _a4,
     aiMatrix4x4t (  TReal _a1, TReal _a2, TReal _a3, TReal _a4,

+ 2 - 2
include/assimp/matrix4x4.inl

@@ -60,7 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 // ----------------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
-aiMatrix4x4t<TReal> ::aiMatrix4x4t () :
+aiMatrix4x4t<TReal>::aiMatrix4x4t() AI_NO_EXCEPT :
     a1(1.0f), a2(), a3(), a4(),
     a1(1.0f), a2(), a3(), a4(),
     b1(), b2(1.0f), b3(), b4(),
     b1(), b2(1.0f), b3(), b4(),
     c1(), c2(), c3(1.0f), c4(),
     c1(), c2(), c3(1.0f), c4(),
@@ -71,7 +71,7 @@ aiMatrix4x4t<TReal> ::aiMatrix4x4t () :
 
 
 // ----------------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------------
 template <typename TReal>
 template <typename TReal>
-aiMatrix4x4t<TReal> ::aiMatrix4x4t (TReal _a1, TReal _a2, TReal _a3, TReal _a4,
+aiMatrix4x4t<TReal>::aiMatrix4x4t (TReal _a1, TReal _a2, TReal _a3, TReal _a4,
               TReal _b1, TReal _b2, TReal _b3, TReal _b4,
               TReal _b1, TReal _b2, TReal _b3, TReal _b4,
               TReal _c1, TReal _c2, TReal _c3, TReal _c4,
               TReal _c1, TReal _c2, TReal _c3, TReal _c4,
               TReal _d1, TReal _d2, TReal _d3, TReal _d4) :
               TReal _d1, TReal _d2, TReal _d3, TReal _d4) :

+ 102 - 88
include/assimp/mesh.h

@@ -136,10 +136,10 @@ struct aiFace
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     //! Default constructor
     //! Default constructor
-    aiFace()
-      : mNumIndices( 0 )
-      , mIndices( NULL )
-    {
+    aiFace() AI_NO_EXCEPT
+    : mNumIndices( 0 )
+    , mIndices( nullptr ) {
+        // empty
     }
     }
 
 
     //! Default destructor. Delete the index array
     //! Default destructor. Delete the index array
@@ -150,47 +150,56 @@ struct aiFace
 
 
     //! Copy constructor. Copy the index array
     //! Copy constructor. Copy the index array
     aiFace( const aiFace& o)
     aiFace( const aiFace& o)
-      : mIndices( NULL )
-    {
+    : mNumIndices(0)
+    , mIndices( nullptr ) {
         *this = o;
         *this = o;
     }
     }
 
 
     //! Assignment operator. Copy the index array
     //! Assignment operator. Copy the index array
-    aiFace& operator = ( const aiFace& o)
-    {
-        if (&o == this)
+    aiFace& operator = ( const aiFace& o) {
+        if (&o == this) {
             return *this;
             return *this;
+        }
 
 
         delete[] mIndices;
         delete[] mIndices;
         mNumIndices = o.mNumIndices;
         mNumIndices = o.mNumIndices;
         if (mNumIndices) {
         if (mNumIndices) {
             mIndices = new unsigned int[mNumIndices];
             mIndices = new unsigned int[mNumIndices];
             ::memcpy( mIndices, o.mIndices, mNumIndices * sizeof( unsigned int));
             ::memcpy( mIndices, o.mIndices, mNumIndices * sizeof( unsigned int));
+        } else {
+            mIndices = nullptr;
         }
         }
-        else {
-            mIndices = NULL;
-        }
+
         return *this;
         return *this;
     }
     }
 
 
     //! Comparison operator. Checks whether the index array
     //! Comparison operator. Checks whether the index array
     //! of two faces is identical
     //! of two faces is identical
-    bool operator== (const aiFace& o) const
-    {
-        if (mIndices == o.mIndices)return true;
-        else if (mIndices && mNumIndices == o.mNumIndices)
-        {
-            for (unsigned int i = 0;i < this->mNumIndices;++i)
-                if (mIndices[i] != o.mIndices[i])return false;
+    bool operator== (const aiFace& o) const {
+        if (mIndices == o.mIndices) {
             return true;
             return true;
         }
         }
-        return false;
+
+        if (nullptr != mIndices && mNumIndices != o.mNumIndices) {
+            return false;
+        }
+
+        if (nullptr == mIndices) {
+            return false;
+        }
+
+        for (unsigned int i = 0; i < this->mNumIndices; ++i) {
+            if (mIndices[i] != o.mIndices[i]) {
+                return false;
+            }
+        }
+
+        return true;
     }
     }
 
 
     //! Inverse comparison operator. Checks whether the index
     //! Inverse comparison operator. Checks whether the index
     //! array of two faces is NOT identical
     //! array of two faces is NOT identical
-    bool operator != (const aiFace& o) const
-    {
+    bool operator != (const aiFace& o) const {
         return !(*this == o);
         return !(*this == o);
     }
     }
 #endif // __cplusplus
 #endif // __cplusplus
@@ -211,13 +220,13 @@ struct aiVertexWeight {
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     //! Default constructor
     //! Default constructor
-    aiVertexWeight()
+    aiVertexWeight() AI_NO_EXCEPT
     : mVertexId(0)
     : mVertexId(0)
     , mWeight(0.0f) {
     , mWeight(0.0f) {
         // empty
         // empty
     }
     }
 
 
-    //! Initialisation from a given index and vertex weight factor
+    //! Initialization from a given index and vertex weight factor
     //! \param pID ID
     //! \param pID ID
     //! \param pWeight Vertex weight factor
     //! \param pWeight Vertex weight factor
     aiVertexWeight( unsigned int pID, float pWeight )
     aiVertexWeight( unsigned int pID, float pWeight )
@@ -273,21 +282,21 @@ struct aiBone {
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     //! Default constructor
     //! Default constructor
-    aiBone()
+    aiBone() AI_NO_EXCEPT
     : mName()
     : mName()
     , mNumWeights( 0 )
     , mNumWeights( 0 )
-    , mWeights( nullptr ) {
+    , mWeights( nullptr )
+    , mOffsetMatrix() {
         // empty
         // empty
     }
     }
 
 
     //! Copy constructor
     //! Copy constructor
     aiBone(const aiBone& other)
     aiBone(const aiBone& other)
-      : mName( other.mName )
-      , mNumWeights( other.mNumWeights )
-      , mOffsetMatrix( other.mOffsetMatrix )
-    {
-        if (other.mWeights && other.mNumWeights)
-        {
+    : mName( other.mName )
+    , mNumWeights( other.mNumWeights )
+    , mWeights(nullptr)
+    , mOffsetMatrix( other.mOffsetMatrix ) {
+        if (other.mWeights && other.mNumWeights) {
             mWeights = new aiVertexWeight[mNumWeights];
             mWeights = new aiVertexWeight[mNumWeights];
             ::memcpy(mWeights,other.mWeights,mNumWeights * sizeof(aiVertexWeight));
             ::memcpy(mWeights,other.mWeights,mNumWeights * sizeof(aiVertexWeight));
         }
         }
@@ -295,8 +304,7 @@ struct aiBone {
 
 
 
 
     //! Assignment operator
     //! Assignment operator
-    aiBone &operator=(const aiBone& other)
-    {
+    aiBone &operator=(const aiBone& other) {
         if (this == &other) {
         if (this == &other) {
             return *this;
             return *this;
         }
         }
@@ -332,8 +340,7 @@ struct aiBone {
         return true;
         return true;
     }
     }
     //! Destructor - deletes the array of vertex weights
     //! Destructor - deletes the array of vertex weights
-    ~aiBone()
-    {
+    ~aiBone() {
         delete [] mWeights;
         delete [] mWeights;
     }
     }
 #endif // __cplusplus
 #endif // __cplusplus
@@ -447,11 +454,13 @@ struct aiAnimMesh
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
-    aiAnimMesh()
-        : mVertices( NULL )
-        , mNormals( NULL )
-        , mTangents( NULL )
-        , mBitangents( NULL )
+    aiAnimMesh() AI_NO_EXCEPT
+        : mVertices( nullptr )
+        , mNormals(nullptr)
+        , mTangents(nullptr)
+        , mBitangents(nullptr)
+        , mColors()
+        , mTextureCoords()
         , mNumVertices( 0 )
         , mNumVertices( 0 )
         , mWeight( 0.0f )
         , mWeight( 0.0f )
     {
     {
@@ -706,35 +715,36 @@ struct aiMesh
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     //! Default constructor. Initializes all members to 0
     //! Default constructor. Initializes all members to 0
-    aiMesh()
-        : mPrimitiveTypes( 0 )
-        , mNumVertices( 0 )
-        , mNumFaces( 0 )
-        , mVertices( NULL )
-        , mNormals( NULL )
-        , mTangents( NULL )
-        , mBitangents( NULL )
-        , mFaces( NULL )
-        , mNumBones( 0 )
-        , mBones( NULL )
-        , mMaterialIndex( 0 )
-        , mNumAnimMeshes( 0 )
-        , mAnimMeshes( NULL )
-        , mMethod( 0 )
-    {
-        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++)
-        {
+    aiMesh() AI_NO_EXCEPT
+    : mPrimitiveTypes( 0 )
+    , mNumVertices( 0 )
+    , mNumFaces( 0 )
+    , mVertices( nullptr )
+    , mNormals(nullptr)
+    , mTangents(nullptr)
+    , mBitangents(nullptr)
+    , mColors()
+    , mTextureCoords()
+    , mNumUVComponents()
+    , mFaces(nullptr)
+    , mNumBones( 0 )
+    , mBones(nullptr)
+    , mMaterialIndex( 0 )
+    , mNumAnimMeshes( 0 )
+    , mAnimMeshes(nullptr)
+    , mMethod( 0 ) {
+        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) {
             mNumUVComponents[a] = 0;
             mNumUVComponents[a] = 0;
-            mTextureCoords[a] = NULL;
+            mTextureCoords[a] = nullptr;
         }
         }
 
 
-        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++)
-            mColors[a] = NULL;
+        for (unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a) {
+            mColors[a] = nullptr;
+        }
     }
     }
 
 
     //! Deletes all storage allocated for the mesh
     //! Deletes all storage allocated for the mesh
-    ~aiMesh()
-    {
+    ~aiMesh() {
         delete [] mVertices;
         delete [] mVertices;
         delete [] mNormals;
         delete [] mNormals;
         delete [] mTangents;
         delete [] mTangents;
@@ -767,63 +777,67 @@ struct aiMesh
     //! Check whether the mesh contains positions. Provided no special
     //! Check whether the mesh contains positions. Provided no special
     //! scene flags are set, this will always be true
     //! scene flags are set, this will always be true
     bool HasPositions() const
     bool HasPositions() const
-        { return mVertices != NULL && mNumVertices > 0; }
+        { return mVertices != nullptr && mNumVertices > 0; }
 
 
     //! Check whether the mesh contains faces. If no special scene flags
     //! Check whether the mesh contains faces. If no special scene flags
     //! are set this should always return true
     //! are set this should always return true
     bool HasFaces() const
     bool HasFaces() const
-        { return mFaces != NULL && mNumFaces > 0; }
+        { return mFaces != nullptr && mNumFaces > 0; }
 
 
     //! Check whether the mesh contains normal vectors
     //! Check whether the mesh contains normal vectors
     bool HasNormals() const
     bool HasNormals() const
-        { return mNormals != NULL && mNumVertices > 0; }
+        { return mNormals != nullptr && mNumVertices > 0; }
 
 
     //! Check whether the mesh contains tangent and bitangent vectors
     //! Check whether the mesh contains tangent and bitangent vectors
     //! It is not possible that it contains tangents and no bitangents
     //! It is not possible that it contains tangents and no bitangents
     //! (or the other way round). The existence of one of them
     //! (or the other way round). The existence of one of them
     //! implies that the second is there, too.
     //! implies that the second is there, too.
     bool HasTangentsAndBitangents() const
     bool HasTangentsAndBitangents() const
-        { return mTangents != NULL && mBitangents != NULL && mNumVertices > 0; }
+        { return mTangents != nullptr && mBitangents != nullptr && mNumVertices > 0; }
 
 
     //! Check whether the mesh contains a vertex color set
     //! Check whether the mesh contains a vertex color set
     //! \param pIndex Index of the vertex color set
     //! \param pIndex Index of the vertex color set
-    bool HasVertexColors( unsigned int pIndex) const
-    {
-        if( pIndex >= AI_MAX_NUMBER_OF_COLOR_SETS)
+    bool HasVertexColors( unsigned int pIndex) const {
+        if (pIndex >= AI_MAX_NUMBER_OF_COLOR_SETS) {
             return false;
             return false;
-        else
-            return mColors[pIndex] != NULL && mNumVertices > 0;
+        } else {
+            return mColors[pIndex] != nullptr && mNumVertices > 0;
+        }
     }
     }
 
 
     //! Check whether the mesh contains a texture coordinate set
     //! Check whether the mesh contains a texture coordinate set
     //! \param pIndex Index of the texture coordinates set
     //! \param pIndex Index of the texture coordinates set
-    bool HasTextureCoords( unsigned int pIndex) const
-    {
-        if( pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS)
+    bool HasTextureCoords( unsigned int pIndex) const {
+        if (pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS) {
             return false;
             return false;
-        else
-            return mTextureCoords[pIndex] != NULL && mNumVertices > 0;
+        } else {
+            return mTextureCoords[pIndex] != nullptr && mNumVertices > 0;
+        }
     }
     }
 
 
     //! Get the number of UV channels the mesh contains
     //! Get the number of UV channels the mesh contains
-    unsigned int GetNumUVChannels() const
-    {
-        unsigned int n = 0;
-        while (n < AI_MAX_NUMBER_OF_TEXTURECOORDS && mTextureCoords[n])++n;
+    unsigned int GetNumUVChannels() const {
+        unsigned int n( 0 );
+        while (n < AI_MAX_NUMBER_OF_TEXTURECOORDS && mTextureCoords[n]) {
+            ++n;
+        }
+
         return n;
         return n;
     }
     }
 
 
     //! Get the number of vertex color channels the mesh contains
     //! Get the number of vertex color channels the mesh contains
-    unsigned int GetNumColorChannels() const
-    {
-        unsigned int n = 0;
-        while (n < AI_MAX_NUMBER_OF_COLOR_SETS && mColors[n])++n;
+    unsigned int GetNumColorChannels() const {
+        unsigned int n(0);
+        while (n < AI_MAX_NUMBER_OF_COLOR_SETS && mColors[n]) {
+            ++n;
+        }
         return n;
         return n;
     }
     }
 
 
     //! Check whether the mesh contains bones
     //! Check whether the mesh contains bones
-    inline bool HasBones() const
-        { return mBones != NULL && mNumBones > 0; }
+    bool HasBones() const {
+        return mBones != nullptr && mNumBones > 0;
+    }
 
 
 #endif // __cplusplus
 #endif // __cplusplus
 };
 };

+ 3 - 3
include/assimp/metadata.h

@@ -129,7 +129,7 @@ struct aiMetadata {
     /** 
     /** 
      *  @brief  The default constructor, set all members to zero by default.
      *  @brief  The default constructor, set all members to zero by default.
      */
      */
-    aiMetadata()
+    aiMetadata() AI_NO_EXCEPT
     : mNumProperties(0)
     : mNumProperties(0)
     , mKeys(nullptr)
     , mKeys(nullptr)
     , mValues(nullptr) {
     , mValues(nullptr) {
@@ -141,11 +141,11 @@ struct aiMetadata {
     , mKeys( nullptr )
     , mKeys( nullptr )
     , mValues( nullptr ) {
     , mValues( nullptr ) {
         mKeys = new aiString[ mNumProperties ];
         mKeys = new aiString[ mNumProperties ];
-        for ( unsigned int i = 0; i < mNumProperties; ++i ) {
+        for ( size_t i = 0; i < static_cast<size_t>( mNumProperties ); ++i ) {
             mKeys[ i ] = rhs.mKeys[ i ];
             mKeys[ i ] = rhs.mKeys[ i ];
         }
         }
         mValues = new aiMetadataEntry[ mNumProperties ];
         mValues = new aiMetadataEntry[ mNumProperties ];
-        for ( unsigned int i = 0; i < mNumProperties; ++i ) {
+        for ( size_t i = 0; i < static_cast<size_t>(mNumProperties); ++i ) {
             mValues[ i ].mType = rhs.mValues[ i ].mType;
             mValues[ i ].mType = rhs.mValues[ i ].mType;
             switch ( rhs.mValues[ i ].mType ) {
             switch ( rhs.mValues[ i ].mType ) {
             case AI_BOOL:
             case AI_BOOL:

+ 1 - 1
include/assimp/quaternion.h

@@ -60,7 +60,7 @@ template <typename TReal>
 class aiQuaterniont
 class aiQuaterniont
 {
 {
 public:
 public:
-    aiQuaterniont() : w(1.0), x(), y(), z() {}
+    aiQuaterniont() AI_NO_EXCEPT : w(1.0), x(), y(), z() {}
     aiQuaterniont(TReal pw, TReal px, TReal py, TReal pz)
     aiQuaterniont(TReal pw, TReal px, TReal py, TReal pz)
         : w(pw), x(px), y(py), z(pz) {}
         : w(pw), x(px), y(py), z(pz) {}
 
 

+ 12 - 11
include/assimp/texture.h

@@ -131,8 +131,7 @@ struct aiTexel
  * as the texture paths (a single asterisk character followed by the
  * as the texture paths (a single asterisk character followed by the
  * zero-based index of the texture in the aiScene::mTextures array).
  * zero-based index of the texture in the aiScene::mTextures array).
  */
  */
-struct aiTexture
-{
+struct aiTexture {
     /** Width of the texture, in pixels
     /** Width of the texture, in pixels
      *
      *
      * If mHeight is zero the texture is compressed in a format
      * If mHeight is zero the texture is compressed in a format
@@ -193,24 +192,26 @@ struct aiTexture
     //! @param s Input string. 3 characters are maximally processed.
     //! @param s Input string. 3 characters are maximally processed.
     //!        Example values: "jpg", "png"
     //!        Example values: "jpg", "png"
     //! @return true if the given string matches the format hint
     //! @return true if the given string matches the format hint
-    bool CheckFormat(const char* s) const
-    {
+    bool CheckFormat(const char* s) const {
+        if (nullptr == s) {
+            return false;
+        }
+
 		return (0 == ::strncmp(achFormatHint, s, sizeof(achFormatHint)));
 		return (0 == ::strncmp(achFormatHint, s, sizeof(achFormatHint)));
     }
     }
 
 
     // Construction
     // Construction
-    aiTexture ()
-        : mWidth  (0)
-        , mHeight (0)
-        , pcData  (NULL)
-    {
+    aiTexture() AI_NO_EXCEPT
+    : mWidth(0)
+    , mHeight(0)
+    , pcData(nullptr)
+    , mFilename() {
         achFormatHint[0] = achFormatHint[1] = 0;
         achFormatHint[0] = achFormatHint[1] = 0;
         achFormatHint[2] = achFormatHint[3] = 0;
         achFormatHint[2] = achFormatHint[3] = 0;
     }
     }
 
 
     // Destruction
     // Destruction
-    ~aiTexture ()
-    {
+    ~aiTexture () {
         delete[] pcData;
         delete[] pcData;
     }
     }
 #endif
 #endif

+ 10 - 13
include/assimp/types.h

@@ -119,10 +119,9 @@ extern "C" {
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 /** Represents a plane in a three-dimensional, euclidean space
 /** Represents a plane in a three-dimensional, euclidean space
 */
 */
-struct aiPlane
-{
+struct aiPlane {
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiPlane () : a(0.f), b(0.f), c(0.f), d(0.f) {}
+    aiPlane () AI_NO_EXCEPT : a(0.f), b(0.f), c(0.f), d(0.f) {}
     aiPlane (ai_real _a, ai_real _b, ai_real _c, ai_real _d)
     aiPlane (ai_real _a, ai_real _b, ai_real _c, ai_real _d)
         : a(_a), b(_b), c(_c), d(_d) {}
         : a(_a), b(_b), c(_c), d(_d) {}
 
 
@@ -137,10 +136,9 @@ struct aiPlane
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 /** Represents a ray
 /** Represents a ray
 */
 */
-struct aiRay
-{
+struct aiRay {
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiRay () {}
+    aiRay () AI_NO_EXCEPT {}
     aiRay (const aiVector3D& _pos, const aiVector3D& _dir)
     aiRay (const aiVector3D& _pos, const aiVector3D& _dir)
         : pos(_pos), dir(_dir) {}
         : pos(_pos), dir(_dir) {}
 
 
@@ -158,7 +156,7 @@ struct aiRay
 struct aiColor3D
 struct aiColor3D
 {
 {
 #ifdef __cplusplus
 #ifdef __cplusplus
-    aiColor3D () : r(0.0f), g(0.0f), b(0.0f) {}
+    aiColor3D () AI_NO_EXCEPT : r(0.0f), g(0.0f), b(0.0f) {}
     aiColor3D (ai_real _r, ai_real _g, ai_real _b) : r(_r), g(_g), b(_b) {}
     aiColor3D (ai_real _r, ai_real _g, ai_real _b) : r(_r), g(_g), b(_b) {}
     explicit aiColor3D (ai_real _r) : r(_r), g(_r), b(_r) {}
     explicit aiColor3D (ai_real _r) : r(_r), g(_r), b(_r) {}
     aiColor3D (const aiColor3D& o) : r(o.r), g(o.g), b(o.b) {}
     aiColor3D (const aiColor3D& o) : r(o.r), g(o.g), b(o.b) {}
@@ -253,9 +251,8 @@ struct aiString
 {
 {
 #ifdef __cplusplus
 #ifdef __cplusplus
     /** Default constructor, the string is set to have zero length */
     /** Default constructor, the string is set to have zero length */
-    aiString() :
-        length(0)
-    {
+    aiString() AI_NO_EXCEPT
+    : length( 0 ) {
         data[0] = '\0';
         data[0] = '\0';
 
 
 #ifdef ASSIMP_BUILD_DEBUG
 #ifdef ASSIMP_BUILD_DEBUG
@@ -305,7 +302,7 @@ struct aiString
     }
     }
 
 
 
 
-    /** Assigment operator */
+    /** Assignment operator */
     aiString& operator = (const aiString &rOther) {
     aiString& operator = (const aiString &rOther) {
         if (this == &rOther) {
         if (this == &rOther) {
             return *this;
             return *this;
@@ -373,7 +370,7 @@ struct aiString
 #endif // !__cplusplus
 #endif // !__cplusplus
 
 
     /** Binary length of the string excluding the terminal 0. This is NOT the
     /** Binary length of the string excluding the terminal 0. This is NOT the
-     *  logical length of strings containing UTF-8 multibyte sequences! It's
+     *  logical length of strings containing UTF-8 multi-byte sequences! It's
      *  the number of bytes from the beginning of the string to its end.*/
      *  the number of bytes from the beginning of the string to its end.*/
     size_t length;
     size_t length;
 
 
@@ -479,7 +476,7 @@ struct aiMemoryInfo
 #ifdef __cplusplus
 #ifdef __cplusplus
 
 
     /** Default constructor */
     /** Default constructor */
-    aiMemoryInfo()
+    aiMemoryInfo() AI_NO_EXCEPT
         : textures   (0)
         : textures   (0)
         , materials  (0)
         , materials  (0)
         , meshes     (0)
         , meshes     (0)

+ 1 - 1
include/assimp/vector3.h

@@ -66,7 +66,7 @@ template <typename TReal>
 class aiVector3t
 class aiVector3t
 {
 {
 public:
 public:
-    aiVector3t() : x(), y(), z() {}
+    aiVector3t() AI_NO_EXCEPT : x(), y(), z() {}
     aiVector3t(TReal _x, TReal _y, TReal _z) : x(_x), y(_y), z(_z) {}
     aiVector3t(TReal _x, TReal _y, TReal _z) : x(_x), y(_y), z(_z) {}
     explicit aiVector3t (TReal _xyz ) : x(_xyz), y(_xyz), z(_xyz) {}
     explicit aiVector3t (TReal _xyz ) : x(_xyz), y(_xyz), z(_xyz) {}
     aiVector3t( const aiVector3t& o ) : x(o.x), y(o.y), z(o.z) {}
     aiVector3t( const aiVector3t& o ) : x(o.x), y(o.y), z(o.z) {}

+ 1 - 6
scripts/StepImporter/CppGenerator.py

@@ -5,7 +5,7 @@
 # Open Asset Import Library (ASSIMP)
 # Open Asset Import Library (ASSIMP)
 # ---------------------------------------------------------------------------
 # ---------------------------------------------------------------------------
 #
 #
-# Copyright (c) 2006-2010, ASSIMP Development Team
+# Copyright (c) 2006-2018, ASSIMP Development Team
 #
 #
 # All rights reserved.
 # All rights reserved.
 #
 #
@@ -280,8 +280,3 @@ def work(filename):
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
     sys.exit(work(sys.argv[1] if len(sys.argv)>1 else 'schema.exp'))
     sys.exit(work(sys.argv[1] if len(sys.argv)>1 else 'schema.exp'))
-
-
-
-    
-    

+ 0 - 12401
scripts/StepImporter/schema_ifc4.exp

@@ -1,12401 +0,0 @@
-(*
-Copyright by:
-buildingSMART International Limited, 1996-2016
-
-Any technical documentation made available by buildingSMART International Limited
-is the copyrighted work of buildingSMART International Limited and is owned by the 
-buildingSMART International Limited. It may be photocopied, used in software development, 
-or translated into another computer language without prior written consent from 
-buildingSMART International Limited provided that full attribution is given. 
-Prior written consent is required if changes are made to the technical specification.
-
-This material is delivered to you as is and buildingSMART International Limited makes 
-no warranty of any kind with regard to it, including, but not limited to, the implied 
-warranties as to its accuracy or fitness for a particular purpose. Any use of the 
-technical documentation or the information contained therein is at the risk of the user. 
-Documentation may include technical or other inaccuracies or typographical errors. 
-buildingSMART International Limited shall not be liable for errors contained therein or 
-for incidental consequential damages in connection with the furnishing, performance or use 
-of the material. The information contained in this document is subject to change without notice.
-
-Issue date:
-Montag, 11. Juli 2016
-
-*)
-
-SCHEMA IFC4;
-
-TYPE IfcStrippedOptional = BOOLEAN;
-END_TYPE;
-
-TYPE IfcAbsorbedDoseMeasure = REAL;
-END_TYPE;
-
-TYPE IfcAccelerationMeasure = REAL;
-END_TYPE;
-
-TYPE IfcAmountOfSubstanceMeasure = REAL;
-END_TYPE;
-
-TYPE IfcAngularVelocityMeasure = REAL;
-END_TYPE;
-
-TYPE IfcArcIndex = LIST [3:3] OF IfcPositiveInteger;
-END_TYPE;
-
-TYPE IfcAreaDensityMeasure = REAL;
-END_TYPE;
-
-TYPE IfcAreaMeasure = REAL;
-END_TYPE;
-
-TYPE IfcBinary = BINARY;
-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 IfcCardinalPointReference = INTEGER;
- WHERE
-	GreaterThanZero : SELF > 0;
-END_TYPE;
-
-TYPE IfcComplexNumber = ARRAY [1:2] OF REAL;
-END_TYPE;
-
-TYPE IfcCompoundPlaneAngleMeasure = LIST [3:4] OF INTEGER;
- WHERE
-	MinutesInRange : ABS(SELF[2]) < 60;
-	SecondsInRange : ABS(SELF[3]) < 60;
-	MicrosecondsInRange : (SIZEOF(SELF) = 3) OR (ABS(SELF[4]) < 1000000);
-	ConsistentSign : ((SELF[1] >= 0) AND (SELF[2] >= 0) AND (SELF[3] >= 0) AND ((SIZEOF(SELF) = 3) OR (SELF[4] >= 0)))
-OR
-((SELF[1] <= 0) AND (SELF[2] <= 0) AND (SELF[3] <= 0) AND ((SIZEOF(SELF) = 3) OR (SELF[4] <= 0)));
-END_TYPE;
-
-TYPE IfcContextDependentMeasure = REAL;
-END_TYPE;
-
-TYPE IfcCountMeasure = NUMBER;
-END_TYPE;
-
-TYPE IfcCurvatureMeasure = REAL;
-END_TYPE;
-
-TYPE IfcDate = STRING;
-END_TYPE;
-
-TYPE IfcDateTime = STRING;
-END_TYPE;
-
-TYPE IfcDayInMonthNumber = INTEGER;
- WHERE
-	ValidRange : {1 <= SELF <= 31};
-END_TYPE;
-
-TYPE IfcDayInWeekNumber = INTEGER;
- WHERE
-	ValidRange : {1 <= SELF <= 7};
-END_TYPE;
-
-TYPE IfcDescriptiveMeasure = STRING;
-END_TYPE;
-
-TYPE IfcDimensionCount = INTEGER;
- WHERE
-	WR1 : { 0 < SELF <= 3 };
-END_TYPE;
-
-TYPE IfcDoseEquivalentMeasure = REAL;
-END_TYPE;
-
-TYPE IfcDuration = STRING;
-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 IfcIdentifier = STRING(255);
-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(255);
-END_TYPE;
-
-TYPE IfcLanguageId = IfcIdentifier;
-END_TYPE;
-
-TYPE IfcLengthMeasure = REAL;
-END_TYPE;
-
-TYPE IfcLineIndex = LIST [2:?] OF IfcPositiveInteger;
-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 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
-	ValidRange : {1 <= SELF <= 12};
-END_TYPE;
-
-TYPE IfcNonNegativeLengthMeasure = IfcLengthMeasure;
- WHERE
-	NotNegative : SELF >= 0.;
-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 IfcPositiveInteger = IfcInteger;
- WHERE
-	WR1 : SELF > 0;
-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 IfcPropertySetDefinitionSet = SET [1:?] OF IfcPropertySetDefinition;
-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 IfcSectionModulusMeasure = REAL;
-END_TYPE;
-
-TYPE IfcSectionalAreaIntegralMeasure = REAL;
-END_TYPE;
-
-TYPE IfcShearModulusMeasure = REAL;
-END_TYPE;
-
-TYPE IfcSolidAngleMeasure = REAL;
-END_TYPE;
-
-TYPE IfcSoundPowerLevelMeasure = REAL;
-END_TYPE;
-
-TYPE IfcSoundPowerMeasure = REAL;
-END_TYPE;
-
-TYPE IfcSoundPressureLevelMeasure = 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 IfcTemperatureRateOfChangeMeasure = 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 IfcTime = STRING;
-END_TYPE;
-
-TYPE IfcTimeMeasure = REAL;
-END_TYPE;
-
-TYPE IfcTimeStamp = INTEGER;
-END_TYPE;
-
-TYPE IfcTorqueMeasure = REAL;
-END_TYPE;
-
-TYPE IfcURIReference = STRING;
-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 IfcActionRequestTypeEnum = ENUMERATION OF
-	(EMAIL
-	,FAX
-	,PHONE
-	,POST
-	,VERBAL
-	,USERDEFINED
-	,NOTDEFINED);
-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 IfcAirTerminalBoxTypeEnum = ENUMERATION OF
-	(CONSTANTFLOW
-	,VARIABLEFLOWPRESSUREDEPENDANT
-	,VARIABLEFLOWPRESSUREINDEPENDANT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcAirTerminalTypeEnum = ENUMERATION OF
-	(DIFFUSER
-	,GRILLE
-	,LOUVRE
-	,REGISTER
-	,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 IfcAudioVisualApplianceTypeEnum = ENUMERATION OF
-	(AMPLIFIER
-	,CAMERA
-	,DISPLAY
-	,MICROPHONE
-	,PLAYER
-	,PROJECTOR
-	,RECEIVER
-	,SPEAKER
-	,SWITCHER
-	,TELEPHONE
-	,TUNER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBSplineCurveForm = ENUMERATION OF
-	(POLYLINE_FORM
-	,CIRCULAR_ARC
-	,ELLIPTIC_ARC
-	,PARABOLIC_ARC
-	,HYPERBOLIC_ARC
-	,UNSPECIFIED);
-END_TYPE;
-
-TYPE IfcBSplineSurfaceForm = ENUMERATION OF
-	(PLANE_SURF
-	,CYLINDRICAL_SURF
-	,CONICAL_SURF
-	,SPHERICAL_SURF
-	,TOROIDAL_SURF
-	,SURF_OF_REVOLUTION
-	,RULED_SURF
-	,GENERALISED_CONE
-	,QUADRIC_SURF
-	,SURF_OF_LINEAR_EXTRUSION
-	,UNSPECIFIED);
-END_TYPE;
-
-TYPE IfcBeamTypeEnum = ENUMERATION OF
-	(BEAM
-	,JOIST
-	,HOLLOWCORE
-	,LINTEL
-	,SPANDREL
-	,T_BEAM
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBenchmarkEnum = ENUMERATION OF
-	(GREATERTHAN
-	,GREATERTHANOREQUALTO
-	,LESSTHAN
-	,LESSTHANOREQUALTO
-	,EQUALTO
-	,NOTEQUALTO
-	,INCLUDES
-	,NOTINCLUDES
-	,INCLUDEDIN
-	,NOTINCLUDEDIN);
-END_TYPE;
-
-TYPE IfcBoilerTypeEnum = ENUMERATION OF
-	(WATER
-	,STEAM
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBooleanOperator = ENUMERATION OF
-	(UNION
-	,INTERSECTION
-	,DIFFERENCE);
-END_TYPE;
-
-TYPE IfcBuildingElementPartTypeEnum = ENUMERATION OF
-	(INSULATION
-	,PRECASTPANEL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBuildingElementProxyTypeEnum = ENUMERATION OF
-	(COMPLEX
-	,ELEMENT
-	,PARTIAL
-	,PROVISIONFORVOID
-	,PROVISIONFORSPACE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBuildingSystemTypeEnum = ENUMERATION OF
-	(FENESTRATION
-	,FOUNDATION
-	,LOADBEARING
-	,OUTERSHELL
-	,SHADING
-	,TRANSPORT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcBurnerTypeEnum = 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 IfcCableFittingTypeEnum = ENUMERATION OF
-	(CONNECTOR
-	,ENTRY
-	,EXIT
-	,JUNCTION
-	,TRANSITION
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCableSegmentTypeEnum = ENUMERATION OF
-	(BUSBARSEGMENT
-	,CABLESEGMENT
-	,CONDUCTORSEGMENT
-	,CORESEGMENT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcChangeActionEnum = ENUMERATION OF
-	(NOCHANGE
-	,MODIFIED
-	,ADDED
-	,DELETED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcChillerTypeEnum = ENUMERATION OF
-	(AIRCOOLED
-	,WATERCOOLED
-	,HEATRECOVERY
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcChimneyTypeEnum = ENUMERATION OF
-	(USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCoilTypeEnum = ENUMERATION OF
-	(DXCOOLINGCOIL
-	,ELECTRICHEATINGCOIL
-	,GASHEATINGCOIL
-	,HYDRONICCOIL
-	,STEAMHEATINGCOIL
-	,WATERCOOLINGCOIL
-	,WATERHEATINGCOIL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcColumnTypeEnum = ENUMERATION OF
-	(COLUMN
-	,PILASTER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCommunicationsApplianceTypeEnum = ENUMERATION OF
-	(ANTENNA
-	,COMPUTER
-	,FAX
-	,GATEWAY
-	,MODEM
-	,NETWORKAPPLIANCE
-	,NETWORKBRIDGE
-	,NETWORKHUB
-	,PRINTER
-	,REPEATER
-	,ROUTER
-	,SCANNER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcComplexPropertyTemplateTypeEnum = ENUMERATION OF
-	(P_COMPLEX
-	,Q_COMPLEX);
-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
-	(AIRCOOLED
-	,EVAPORATIVECOOLED
-	,WATERCOOLED
-	,WATERCOOLEDBRAZEDPLATE
-	,WATERCOOLEDSHELLCOIL
-	,WATERCOOLEDSHELLTUBE
-	,WATERCOOLEDTUBEINTUBE
-	,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 IfcConstructionEquipmentResourceTypeEnum = ENUMERATION OF
-	(DEMOLISHING
-	,EARTHMOVING
-	,ERECTING
-	,HEATING
-	,LIGHTING
-	,PAVING
-	,PUMPING
-	,TRANSPORTING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcConstructionMaterialResourceTypeEnum = ENUMERATION OF
-	(AGGREGATES
-	,CONCRETE
-	,DRYWALL
-	,FUEL
-	,GYPSUM
-	,MASONRY
-	,METAL
-	,PLASTIC
-	,WOOD
-	,NOTDEFINED
-	,USERDEFINED);
-END_TYPE;
-
-TYPE IfcConstructionProductResourceTypeEnum = ENUMERATION OF
-	(ASSEMBLY
-	,FORMWORK
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcControllerTypeEnum = ENUMERATION OF
-	(FLOATING
-	,PROGRAMMABLE
-	,PROPORTIONAL
-	,MULTIPOSITION
-	,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 IfcCostItemTypeEnum = ENUMERATION OF
-	(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
-	,MOLDING
-	,SKIRTINGBOARD
-	,INSULATION
-	,MEMBRANE
-	,SLEEVING
-	,WRAPPING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCrewResourceTypeEnum = ENUMERATION OF
-	(OFFICE
-	,SITE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCurtainWallTypeEnum = ENUMERATION OF
-	(USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcCurveInterpolationEnum = ENUMERATION OF
-	(LINEAR
-	,LOG_LINEAR
-	,LOG_LOG
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDamperTypeEnum = ENUMERATION OF
-	(BACKDRAFTDAMPER
-	,BALANCINGDAMPER
-	,BLASTDAMPER
-	,CONTROLDAMPER
-	,FIREDAMPER
-	,FIRESMOKEDAMPER
-	,FUMEHOODEXHAUST
-	,GRAVITYDAMPER
-	,GRAVITYRELIEFDAMPER
-	,RELIEFDAMPER
-	,SMOKEDAMPER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDataOriginEnum = ENUMERATION OF
-	(MEASURED
-	,PREDICTED
-	,SIMULATED
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDerivedUnitEnum = ENUMERATION OF
-	(ANGULARVELOCITYUNIT
-	,AREADENSITYUNIT
-	,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
-	,SOUNDPOWERLEVELUNIT
-	,SOUNDPOWERUNIT
-	,SOUNDPRESSURELEVELUNIT
-	,SOUNDPRESSUREUNIT
-	,TEMPERATUREGRADIENTUNIT
-	,TEMPERATURERATEOFCHANGEUNIT
-	,THERMALEXPANSIONCOEFFICIENTUNIT
-	,WARPINGCONSTANTUNIT
-	,WARPINGMOMENTUNIT
-	,USERDEFINED);
-END_TYPE;
-
-TYPE IfcDirectionSenseEnum = ENUMERATION OF
-	(POSITIVE
-	,NEGATIVE);
-END_TYPE;
-
-TYPE IfcDiscreteAccessoryTypeEnum = ENUMERATION OF
-	(ANCHORPLATE
-	,BRACKET
-	,SHOE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDistributionChamberElementTypeEnum = ENUMERATION OF
-	(FORMEDDUCT
-	,INSPECTIONCHAMBER
-	,INSPECTIONPIT
-	,MANHOLE
-	,METERCHAMBER
-	,SUMP
-	,TRENCH
-	,VALVECHAMBER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDistributionPortTypeEnum = ENUMERATION OF
-	(CABLE
-	,CABLECARRIER
-	,DUCT
-	,PIPE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDistributionSystemEnum = ENUMERATION OF
-	(AIRCONDITIONING
-	,AUDIOVISUAL
-	,CHEMICAL
-	,CHILLEDWATER
-	,COMMUNICATION
-	,COMPRESSEDAIR
-	,CONDENSERWATER
-	,CONTROL
-	,CONVEYING
-	,DATA
-	,DISPOSAL
-	,DOMESTICCOLDWATER
-	,DOMESTICHOTWATER
-	,DRAINAGE
-	,EARTHING
-	,ELECTRICAL
-	,ELECTROACOUSTIC
-	,EXHAUST
-	,FIREPROTECTION
-	,FUEL
-	,GAS
-	,HAZARDOUS
-	,HEATING
-	,LIGHTING
-	,LIGHTNINGPROTECTION
-	,MUNICIPALSOLIDWASTE
-	,OIL
-	,OPERATIONAL
-	,POWERGENERATION
-	,RAINWATER
-	,REFRIGERATION
-	,SECURITY
-	,SEWAGE
-	,SIGNAL
-	,STORMWATER
-	,TELEPHONE
-	,TV
-	,VACUUM
-	,VENT
-	,VENTILATION
-	,WASTEWATER
-	,WATERSUPPLY
-	,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
-	,FIXEDPANEL
-	,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 IfcDoorTypeEnum = ENUMERATION OF
-	(DOOR
-	,GATE
-	,TRAPDOOR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcDoorTypeOperationEnum = 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
-	,SWING_FIXED_LEFT
-	,SWING_FIXED_RIGHT
-	,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
-	(DISHWASHER
-	,ELECTRICCOOKER
-	,FREESTANDINGELECTRICHEATER
-	,FREESTANDINGFAN
-	,FREESTANDINGWATERHEATER
-	,FREESTANDINGWATERCOOLER
-	,FREEZER
-	,FRIDGE_FREEZER
-	,HANDDRYER
-	,KITCHENMACHINE
-	,MICROWAVE
-	,PHOTOCOPIER
-	,REFRIGERATOR
-	,TUMBLEDRYER
-	,VENDINGMACHINE
-	,WASHINGMACHINE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcElectricDistributionBoardTypeEnum = ENUMERATION OF
-	(CONSUMERUNIT
-	,DISTRIBUTIONBOARD
-	,MOTORCONTROLCENTRE
-	,SWITCHBOARD
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcElectricFlowStorageDeviceTypeEnum = ENUMERATION OF
-	(BATTERY
-	,CAPACITORBANK
-	,HARMONICFILTER
-	,INDUCTORBANK
-	,UPS
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcElectricGeneratorTypeEnum = ENUMERATION OF
-	(CHP
-	,ENGINEGENERATOR
-	,STANDALONE
-	,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 IfcEngineTypeEnum = ENUMERATION OF
-	(EXTERNALCOMBUSTION
-	,INTERNALCOMBUSTION
-	,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
-	(DIRECTEXPANSION
-	,DIRECTEXPANSIONSHELLANDTUBE
-	,DIRECTEXPANSIONTUBEINTUBE
-	,DIRECTEXPANSIONBRAZEDPLATE
-	,FLOODEDSHELLANDTUBE
-	,SHELLANDCOIL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcEventTriggerTypeEnum = ENUMERATION OF
-	(EVENTRULE
-	,EVENTMESSAGE
-	,EVENTTIME
-	,EVENTCOMPLEX
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcEventTypeEnum = ENUMERATION OF
-	(STARTEVENT
-	,ENDEVENT
-	,INTERMEDIATEEVENT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcExternalSpatialElementTypeEnum = ENUMERATION OF
-	(EXTERNAL
-	,EXTERNAL_EARTH
-	,EXTERNAL_WATER
-	,EXTERNAL_FIRE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcFanTypeEnum = ENUMERATION OF
-	(CENTRIFUGALFORWARDCURVED
-	,CENTRIFUGALRADIAL
-	,CENTRIFUGALBACKWARDINCLINEDCURVED
-	,CENTRIFUGALAIRFOIL
-	,TUBEAXIAL
-	,VANEAXIAL
-	,PROPELLORAXIAL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcFastenerTypeEnum = ENUMERATION OF
-	(GLUE
-	,MORTAR
-	,WELD
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcFilterTypeEnum = ENUMERATION OF
-	(AIRPARTICLEFILTER
-	,COMPRESSEDAIRFILTER
-	,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
-	(ENERGYMETER
-	,GASMETER
-	,OILMETER
-	,WATERMETER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcFootingTypeEnum = ENUMERATION OF
-	(CAISSON_FOUNDATION
-	,FOOTING_BEAM
-	,PAD_FOOTING
-	,PILE_CAP
-	,STRIP_FOOTING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcFurnitureTypeEnum = ENUMERATION OF
-	(CHAIR
-	,TABLE
-	,DESK
-	,BED
-	,FILECABINET
-	,SHELF
-	,SOFA
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcGeographicElementTypeEnum = ENUMERATION OF
-	(TERRAIN
-	,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 IfcGridTypeEnum = ENUMERATION OF
-	(RECTANGULAR
-	,RADIAL
-	,TRIANGULAR
-	,IRREGULAR
-	,USERDEFINED
-	,NOTDEFINED);
-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 IfcInterceptorTypeEnum = ENUMERATION OF
-	(CYCLONIC
-	,GREASE
-	,OIL
-	,PETROL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcInternalOrExternalEnum = ENUMERATION OF
-	(INTERNAL
-	,EXTERNAL
-	,EXTERNAL_EARTH
-	,EXTERNAL_WATER
-	,EXTERNAL_FIRE
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcInventoryTypeEnum = ENUMERATION OF
-	(ASSETINVENTORY
-	,SPACEINVENTORY
-	,FURNITUREINVENTORY
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcJunctionBoxTypeEnum = ENUMERATION OF
-	(DATA
-	,POWER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcKnotType = ENUMERATION OF
-	(UNIFORM_KNOTS
-	,QUASI_UNIFORM_KNOTS
-	,PIECEWISE_BEZIER_KNOTS
-	,UNSPECIFIED);
-END_TYPE;
-
-TYPE IfcLaborResourceTypeEnum = ENUMERATION OF
-	(ADMINISTRATION
-	,CARPENTRY
-	,CLEANING
-	,CONCRETE
-	,DRYWALL
-	,ELECTRIC
-	,FINISHING
-	,FLOORING
-	,GENERAL
-	,HVAC
-	,LANDSCAPING
-	,MASONRY
-	,PAINTING
-	,PAVING
-	,PLUMBING
-	,ROOFING
-	,SITEGRADING
-	,STEELWORK
-	,SURVEYING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcLampTypeEnum = ENUMERATION OF
-	(COMPACTFLUORESCENT
-	,FLUORESCENT
-	,HALOGEN
-	,HIGHPRESSUREMERCURY
-	,HIGHPRESSURESODIUM
-	,LED
-	,METALHALIDE
-	,OLED
-	,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
-	,SECURITYLIGHTING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcLoadGroupTypeEnum = ENUMERATION OF
-	(LOAD_GROUP
-	,LOAD_CASE
-	,LOAD_COMBINATION
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcLogicalOperatorEnum = ENUMERATION OF
-	(LOGICALAND
-	,LOGICALOR
-	,LOGICALXOR
-	,LOGICALNOTAND
-	,LOGICALNOTOR);
-END_TYPE;
-
-TYPE IfcMechanicalFastenerTypeEnum = ENUMERATION OF
-	(ANCHORBOLT
-	,BOLT
-	,DOWEL
-	,NAIL
-	,NAILPLATE
-	,RIVET
-	,SCREW
-	,SHEARCONNECTOR
-	,STAPLE
-	,STUDSHEARCONNECTOR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcMedicalDeviceTypeEnum = ENUMERATION OF
-	(AIRSTATION
-	,FEEDAIRUNIT
-	,OXYGENGENERATOR
-	,OXYGENPLANT
-	,VACUUMSTATION
-	,USERDEFINED
-	,NOTDEFINED);
-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
-	,CODEWAIVER
-	,DESIGNINTENT
-	,EXTERNAL
-	,HEALTHANDSAFETY
-	,MERGECONFLICT
-	,MODELVIEW
-	,PARAMETER
-	,REQUIREMENT
-	,SPECIFICATION
-	,TRIGGERCONDITION
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcOccupantTypeEnum = ENUMERATION OF
-	(ASSIGNEE
-	,ASSIGNOR
-	,LESSEE
-	,LESSOR
-	,LETTINGAGENT
-	,OWNER
-	,TENANT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcOpeningElementTypeEnum = ENUMERATION OF
-	(OPENING
-	,RECESS
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcOutletTypeEnum = ENUMERATION OF
-	(AUDIOVISUALOUTLET
-	,COMMUNICATIONSOUTLET
-	,POWEROUTLET
-	,DATAOUTLET
-	,TELEPHONEOUTLET
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPerformanceHistoryTypeEnum = ENUMERATION OF
-	(USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPermeableCoveringOperationEnum = ENUMERATION OF
-	(GRILL
-	,LOUVER
-	,SCREEN
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPermitTypeEnum = ENUMERATION OF
-	(ACCESS
-	,BUILDING
-	,WORK
-	,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
-	(BORED
-	,DRIVEN
-	,JETGROUTING
-	,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
-	(CULVERT
-	,FLEXIBLESEGMENT
-	,RIGIDSEGMENT
-	,GUTTER
-	,SPOOL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPlateTypeEnum = ENUMERATION OF
-	(CURTAIN_PANEL
-	,SHEET
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPreferredSurfaceCurveRepresentation = ENUMERATION OF
-	(CURVE3D
-	,PCURVE_S1
-	,PCURVE_S2);
-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 IfcProjectOrderTypeEnum = ENUMERATION OF
-	(CHANGEORDER
-	,MAINTENANCEWORKORDER
-	,MOVEORDER
-	,PURCHASEORDER
-	,WORKORDER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcProjectedOrTrueLengthEnum = ENUMERATION OF
-	(PROJECTED_LENGTH
-	,TRUE_LENGTH);
-END_TYPE;
-
-TYPE IfcProjectionElementTypeEnum = ENUMERATION OF
-	(USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPropertySetTemplateTypeEnum = ENUMERATION OF
-	(PSET_TYPEDRIVENONLY
-	,PSET_TYPEDRIVENOVERRIDE
-	,PSET_OCCURRENCEDRIVEN
-	,PSET_PERFORMANCEDRIVEN
-	,QTO_TYPEDRIVENONLY
-	,QTO_TYPEDRIVENOVERRIDE
-	,QTO_OCCURRENCEDRIVEN
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcProtectiveDeviceTrippingUnitTypeEnum = ENUMERATION OF
-	(ELECTRONIC
-	,ELECTROMAGNETIC
-	,RESIDUALCURRENT
-	,THERMAL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcProtectiveDeviceTypeEnum = ENUMERATION OF
-	(CIRCUITBREAKER
-	,EARTHLEAKAGECIRCUITBREAKER
-	,EARTHINGSWITCH
-	,FUSEDISCONNECTOR
-	,RESIDUALCURRENTCIRCUITBREAKER
-	,RESIDUALCURRENTSWITCH
-	,VARISTOR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcPumpTypeEnum = ENUMERATION OF
-	(CIRCULATOR
-	,ENDSUCTION
-	,SPLITCASE
-	,SUBMERSIBLEPUMP
-	,SUMPPUMP
-	,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 IfcRecurrenceTypeEnum = ENUMERATION OF
-	(DAILY
-	,WEEKLY
-	,MONTHLY_BY_DAY_OF_MONTH
-	,MONTHLY_BY_POSITION
-	,BY_DAY_COUNT
-	,BY_WEEKDAY_COUNT
-	,YEARLY_BY_DAY_OF_MONTH
-	,YEARLY_BY_POSITION);
-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
-	,ANCHORING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcReinforcingBarSurfaceEnum = ENUMERATION OF
-	(PLAIN
-	,TEXTURED);
-END_TYPE;
-
-TYPE IfcReinforcingBarTypeEnum = ENUMERATION OF
-	(ANCHORING
-	,EDGE
-	,LIGATURE
-	,MAIN
-	,PUNCHING
-	,RING
-	,SHEAR
-	,STUD
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcReinforcingMeshTypeEnum = ENUMERATION OF
-	(USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcRoleEnum = ENUMERATION OF
-	(SUPPLIER
-	,MANUFACTURER
-	,CONTRACTOR
-	,SUBCONTRACTOR
-	,ARCHITECT
-	,STRUCTURALENGINEER
-	,COSTENGINEER
-	,CLIENT
-	,BUILDINGOWNER
-	,BUILDINGOPERATOR
-	,MECHANICALENGINEER
-	,ELECTRICALENGINEER
-	,PROJECTMANAGER
-	,FACILITIESMANAGER
-	,CIVILENGINEER
-	,COMMISSIONINGENGINEER
-	,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
-	,USERDEFINED
-	,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
-	(COSENSOR
-	,CO2SENSOR
-	,CONDUCTANCESENSOR
-	,CONTACTSENSOR
-	,FIRESENSOR
-	,FLOWSENSOR
-	,FROSTSENSOR
-	,GASSENSOR
-	,HEATSENSOR
-	,HUMIDITYSENSOR
-	,IDENTIFIERSENSOR
-	,IONCONCENTRATIONSENSOR
-	,LEVELSENSOR
-	,LIGHTSENSOR
-	,MOISTURESENSOR
-	,MOVEMENTSENSOR
-	,PHSENSOR
-	,PRESSURESENSOR
-	,RADIATIONSENSOR
-	,RADIOACTIVITYSENSOR
-	,SMOKESENSOR
-	,SOUNDSENSOR
-	,TEMPERATURESENSOR
-	,WINDSENSOR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSequenceEnum = ENUMERATION OF
-	(START_START
-	,START_FINISH
-	,FINISH_START
-	,FINISH_FINISH
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcShadingDeviceTypeEnum = ENUMERATION OF
-	(JALOUSIE
-	,SHUTTER
-	,AWNING
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSimplePropertyTemplateTypeEnum = ENUMERATION OF
-	(P_SINGLEVALUE
-	,P_ENUMERATEDVALUE
-	,P_BOUNDEDVALUE
-	,P_LISTVALUE
-	,P_TABLEVALUE
-	,P_REFERENCEVALUE
-	,Q_LENGTH
-	,Q_AREA
-	,Q_VOLUME
-	,Q_COUNT
-	,Q_WEIGHT
-	,Q_TIME);
-END_TYPE;
-
-TYPE IfcSlabTypeEnum = ENUMERATION OF
-	(FLOOR
-	,ROOF
-	,LANDING
-	,BASESLAB
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSolarDeviceTypeEnum = ENUMERATION OF
-	(SOLARCOLLECTOR
-	,SOLARPANEL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSpaceHeaterTypeEnum = ENUMERATION OF
-	(CONVECTOR
-	,RADIATOR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSpaceTypeEnum = ENUMERATION OF
-	(SPACE
-	,PARKING
-	,GFA
-	,INTERNAL
-	,EXTERNAL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSpatialZoneTypeEnum = ENUMERATION OF
-	(CONSTRUCTION
-	,FIRESAFETY
-	,LIGHTING
-	,OCCUPANCY
-	,SECURITY
-	,THERMAL
-	,TRANSPORT
-	,VENTILATION
-	,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 IfcStructuralCurveActivityTypeEnum = ENUMERATION OF
-	(CONST
-	,LINEAR
-	,POLYGONAL
-	,EQUIDISTANT
-	,SINUS
-	,PARABOLA
-	,DISCRETE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcStructuralCurveMemberTypeEnum = ENUMERATION OF
-	(RIGID_JOINED_MEMBER
-	,PIN_JOINED_MEMBER
-	,CABLE
-	,TENSION_MEMBER
-	,COMPRESSION_MEMBER
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcStructuralSurfaceActivityTypeEnum = ENUMERATION OF
-	(CONST
-	,BILINEAR
-	,DISCRETE
-	,ISOCONTOUR
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcStructuralSurfaceMemberTypeEnum = ENUMERATION OF
-	(BENDING_ELEMENT
-	,MEMBRANE_ELEMENT
-	,SHELL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSubContractResourceTypeEnum = ENUMERATION OF
-	(PURCHASE
-	,WORK
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSurfaceFeatureTypeEnum = ENUMERATION OF
-	(MARK
-	,TAG
-	,TREATMENT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSurfaceSide = ENUMERATION OF
-	(POSITIVE
-	,NEGATIVE
-	,BOTH);
-END_TYPE;
-
-TYPE IfcSwitchingDeviceTypeEnum = ENUMERATION OF
-	(CONTACTOR
-	,DIMMERSWITCH
-	,EMERGENCYSTOP
-	,KEYPAD
-	,MOMENTARYSWITCH
-	,SELECTORSWITCH
-	,STARTER
-	,SWITCHDISCONNECTOR
-	,TOGGLESWITCH
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcSystemFurnitureElementTypeEnum = ENUMERATION OF
-	(PANEL
-	,WORKSURFACE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTankTypeEnum = ENUMERATION OF
-	(BASIN
-	,BREAKPRESSURE
-	,EXPANSION
-	,FEEDANDEXPANSION
-	,PRESSUREVESSEL
-	,STORAGE
-	,VESSEL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTaskDurationEnum = ENUMERATION OF
-	(ELAPSEDTIME
-	,WORKTIME
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTaskTypeEnum = ENUMERATION OF
-	(ATTENDANCE
-	,CONSTRUCTION
-	,DEMOLITION
-	,DISMANTLE
-	,DISPOSAL
-	,INSTALLATION
-	,LOGISTIC
-	,MAINTENANCE
-	,MOVE
-	,OPERATION
-	,REMOVAL
-	,RENOVATION
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTendonAnchorTypeEnum = ENUMERATION OF
-	(COUPLER
-	,FIXED_END
-	,TENSIONING_END
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTendonTypeEnum = ENUMERATION OF
-	(BAR
-	,COATED
-	,STRAND
-	,WIRE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTextPath = ENUMERATION OF
-	(LEFT
-	,RIGHT
-	,UP
-	,DOWN);
-END_TYPE;
-
-TYPE IfcTimeSeriesDataTypeEnum = ENUMERATION OF
-	(CONTINUOUS
-	,DISCRETE
-	,DISCRETEBINARY
-	,PIECEWISEBINARY
-	,PIECEWISECONSTANT
-	,PIECEWISECONTINUOUS
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTransformerTypeEnum = ENUMERATION OF
-	(CURRENT
-	,FREQUENCY
-	,INVERTER
-	,RECTIFIER
-	,VOLTAGE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcTransitionCode = ENUMERATION OF
-	(DISCONTINUOUS
-	,CONTINUOUS
-	,CONTSAMEGRADIENT
-	,CONTSAMEGRADIENTSAMECURVATURE);
-END_TYPE;
-
-TYPE IfcTransportElementTypeEnum = ENUMERATION OF
-	(ELEVATOR
-	,ESCALATOR
-	,MOVINGWALKWAY
-	,CRANEWAY
-	,LIFTINGGEAR
-	,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 IfcUnitaryControlElementTypeEnum = ENUMERATION OF
-	(ALARMPANEL
-	,CONTROLPANEL
-	,GASDETECTIONPANEL
-	,INDICATORPANEL
-	,MIMICPANEL
-	,HUMIDISTAT
-	,THERMOSTAT
-	,WEATHERSTATION
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcUnitaryEquipmentTypeEnum = ENUMERATION OF
-	(AIRHANDLER
-	,AIRCONDITIONINGUNIT
-	,DEHUMIDIFIER
-	,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 IfcVoidingFeatureTypeEnum = ENUMERATION OF
-	(CUTOUT
-	,NOTCH
-	,HOLE
-	,MITER
-	,CHAMFER
-	,EDGE
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcWallTypeEnum = ENUMERATION OF
-	(MOVABLE
-	,PARAPET
-	,PARTITIONING
-	,PLUMBINGWALL
-	,SHEAR
-	,SOLIDWALL
-	,STANDARD
-	,POLYGONAL
-	,ELEMENTEDWALL
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcWasteTerminalTypeEnum = ENUMERATION OF
-	(FLOORTRAP
-	,FLOORWASTE
-	,GULLYSUMP
-	,GULLYTRAP
-	,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 IfcWindowTypeEnum = ENUMERATION OF
-	(WINDOW
-	,SKYLIGHT
-	,LIGHTDOME
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcWindowTypePartitioningEnum = 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 IfcWorkCalendarTypeEnum = ENUMERATION OF
-	(FIRSTSHIFT
-	,SECONDSHIFT
-	,THIRDSHIFT
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcWorkPlanTypeEnum = ENUMERATION OF
-	(ACTUAL
-	,BASELINE
-	,PLANNED
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcWorkScheduleTypeEnum = ENUMERATION OF
-	(ACTUAL
-	,BASELINE
-	,PLANNED
-	,USERDEFINED
-	,NOTDEFINED);
-END_TYPE;
-
-TYPE IfcActorSelect = SELECT
-	(IfcOrganization
-	,IfcPerson
-	,IfcPersonAndOrganization);
-END_TYPE;
-
-TYPE IfcAppliedValueSelect = SELECT
-	(IfcMeasureWithUnit
-	,IfcReference
-	,IfcValue);
-END_TYPE;
-
-TYPE IfcAxis2Placement = SELECT
-	(IfcAxis2Placement2D
-	,IfcAxis2Placement3D);
-END_TYPE;
-
-TYPE IfcBendingParameterSelect = SELECT
-	(IfcLengthMeasure
-	,IfcPlaneAngleMeasure);
-END_TYPE;
-
-TYPE IfcBooleanOperand = SELECT
-	(IfcBooleanResult
-	,IfcCsgPrimitive3D
-	,IfcHalfSpaceSolid
-	,IfcSolidModel
-	,IfcTessellatedFaceSet);
-END_TYPE;
-
-TYPE IfcClassificationReferenceSelect = SELECT
-	(IfcClassification
-	,IfcClassificationReference);
-END_TYPE;
-
-TYPE IfcClassificationSelect = SELECT
-	(IfcClassification
-	,IfcClassificationReference);
-END_TYPE;
-
-TYPE IfcColour = SELECT
-	(IfcColourSpecification
-	,IfcPreDefinedColour);
-END_TYPE;
-
-TYPE IfcColourOrFactor = SELECT
-	(IfcColourRgb
-	,IfcNormalisedRatioMeasure);
-END_TYPE;
-
-TYPE IfcCoordinateReferenceSystemSelect = SELECT
-	(IfcCoordinateReferenceSystem
-	,IfcGeometricRepresentationContext);
-END_TYPE;
-
-TYPE IfcCsgSelect = SELECT
-	(IfcBooleanResult
-	,IfcCsgPrimitive3D);
-END_TYPE;
-
-TYPE IfcCurveFontOrScaledCurveFontSelect = SELECT
-	(IfcCurveStyleFontAndScaling
-	,IfcCurveStyleFontSelect);
-END_TYPE;
-
-TYPE IfcCurveOnSurface = SELECT
-	(IfcCompositeCurveOnSurface
-	,IfcPcurve
-	,IfcSurfaceCurve);
-END_TYPE;
-
-TYPE IfcCurveOrEdgeCurve = SELECT
-	(IfcBoundedCurve
-	,IfcEdgeCurve);
-END_TYPE;
-
-TYPE IfcCurveStyleFontSelect = SELECT
-	(IfcCurveStyleFont
-	,IfcPreDefinedCurveFont);
-END_TYPE;
-
-TYPE IfcDefinitionSelect = SELECT
-	(IfcObjectDefinition
-	,IfcPropertyDefinition);
-END_TYPE;
-
-TYPE IfcDerivedMeasureValue = SELECT
-	(IfcAbsorbedDoseMeasure
-	,IfcAccelerationMeasure
-	,IfcAngularVelocityMeasure
-	,IfcAreaDensityMeasure
-	,IfcCompoundPlaneAngleMeasure
-	,IfcCurvatureMeasure
-	,IfcDoseEquivalentMeasure
-	,IfcDynamicViscosityMeasure
-	,IfcElectricCapacitanceMeasure
-	,IfcElectricChargeMeasure
-	,IfcElectricConductanceMeasure
-	,IfcElectricResistanceMeasure
-	,IfcElectricVoltageMeasure
-	,IfcEnergyMeasure
-	,IfcForceMeasure
-	,IfcFrequencyMeasure
-	,IfcHeatFluxDensityMeasure
-	,IfcHeatingValueMeasure
-	,IfcIlluminanceMeasure
-	,IfcInductanceMeasure
-	,IfcIntegerCountRateMeasure
-	,IfcIonConcentrationMeasure
-	,IfcIsothermalMoistureCapacityMeasure
-	,IfcKinematicViscosityMeasure
-	,IfcLinearForceMeasure
-	,IfcLinearMomentMeasure
-	,IfcLinearStiffnessMeasure
-	,IfcLinearVelocityMeasure
-	,IfcLuminousFluxMeasure
-	,IfcLuminousIntensityDistributionMeasure
-	,IfcMagneticFluxDensityMeasure
-	,IfcMagneticFluxMeasure
-	,IfcMassDensityMeasure
-	,IfcMassFlowRateMeasure
-	,IfcMassPerLengthMeasure
-	,IfcModulusOfElasticityMeasure
-	,IfcModulusOfLinearSubgradeReactionMeasure
-	,IfcModulusOfRotationalSubgradeReactionMeasure
-	,IfcModulusOfSubgradeReactionMeasure
-	,IfcMoistureDiffusivityMeasure
-	,IfcMolecularWeightMeasure
-	,IfcMomentOfInertiaMeasure
-	,IfcMonetaryMeasure
-	,IfcPHMeasure
-	,IfcPlanarForceMeasure
-	,IfcPowerMeasure
-	,IfcPressureMeasure
-	,IfcRadioActivityMeasure
-	,IfcRotationalFrequencyMeasure
-	,IfcRotationalMassMeasure
-	,IfcRotationalStiffnessMeasure
-	,IfcSectionModulusMeasure
-	,IfcSectionalAreaIntegralMeasure
-	,IfcShearModulusMeasure
-	,IfcSoundPowerLevelMeasure
-	,IfcSoundPowerMeasure
-	,IfcSoundPressureLevelMeasure
-	,IfcSoundPressureMeasure
-	,IfcSpecificHeatCapacityMeasure
-	,IfcTemperatureGradientMeasure
-	,IfcTemperatureRateOfChangeMeasure
-	,IfcThermalAdmittanceMeasure
-	,IfcThermalConductivityMeasure
-	,IfcThermalExpansionCoefficientMeasure
-	,IfcThermalResistanceMeasure
-	,IfcThermalTransmittanceMeasure
-	,IfcTorqueMeasure
-	,IfcVaporPermeabilityMeasure
-	,IfcVolumetricFlowRateMeasure
-	,IfcWarpingConstantMeasure
-	,IfcWarpingMomentMeasure);
-END_TYPE;
-
-TYPE IfcDocumentSelect = SELECT
-	(IfcDocumentInformation
-	,IfcDocumentReference);
-END_TYPE;
-
-TYPE IfcFillStyleSelect = SELECT
-	(IfcColour
-	,IfcExternallyDefinedHatchStyle
-	,IfcFillAreaStyleHatching
-	,IfcFillAreaStyleTiles);
-END_TYPE;
-
-TYPE IfcGeometricSetSelect = SELECT
-	(IfcCurve
-	,IfcPoint
-	,IfcSurface);
-END_TYPE;
-
-TYPE IfcGridPlacementDirectionSelect = SELECT
-	(IfcDirection
-	,IfcVirtualGridIntersection);
-END_TYPE;
-
-TYPE IfcHatchLineDistanceSelect = SELECT
-	(IfcPositiveLengthMeasure
-	,IfcVector);
-END_TYPE;
-
-TYPE IfcLayeredItem = SELECT
-	(IfcRepresentation
-	,IfcRepresentationItem);
-END_TYPE;
-
-TYPE IfcLibrarySelect = SELECT
-	(IfcLibraryInformation
-	,IfcLibraryReference);
-END_TYPE;
-
-TYPE IfcLightDistributionDataSourceSelect = SELECT
-	(IfcExternalReference
-	,IfcLightIntensityDistribution);
-END_TYPE;
-
-TYPE IfcMaterialSelect = SELECT
-	(IfcMaterialDefinition
-	,IfcMaterialList
-	,IfcMaterialUsageDefinition);
-END_TYPE;
-
-TYPE IfcMeasureValue = SELECT
-	(IfcAmountOfSubstanceMeasure
-	,IfcAreaMeasure
-	,IfcComplexNumber
-	,IfcContextDependentMeasure
-	,IfcCountMeasure
-	,IfcDescriptiveMeasure
-	,IfcElectricCurrentMeasure
-	,IfcLengthMeasure
-	,IfcLuminousIntensityMeasure
-	,IfcMassMeasure
-	,IfcNonNegativeLengthMeasure
-	,IfcNormalisedRatioMeasure
-	,IfcNumericMeasure
-	,IfcParameterValue
-	,IfcPlaneAngleMeasure
-	,IfcPositiveLengthMeasure
-	,IfcPositivePlaneAngleMeasure
-	,IfcPositiveRatioMeasure
-	,IfcRatioMeasure
-	,IfcSolidAngleMeasure
-	,IfcThermodynamicTemperatureMeasure
-	,IfcTimeMeasure
-	,IfcVolumeMeasure);
-END_TYPE;
-
-TYPE IfcMetricValueSelect = SELECT
-	(IfcAppliedValue
-	,IfcMeasureWithUnit
-	,IfcReference
-	,IfcTable
-	,IfcTimeSeries
-	,IfcValue);
-END_TYPE;
-
-TYPE IfcModulusOfRotationalSubgradeReactionSelect = SELECT
-	(IfcBoolean
-	,IfcModulusOfRotationalSubgradeReactionMeasure);
-END_TYPE;
-
-TYPE IfcModulusOfSubgradeReactionSelect = SELECT
-	(IfcBoolean
-	,IfcModulusOfSubgradeReactionMeasure);
-END_TYPE;
-
-TYPE IfcModulusOfTranslationalSubgradeReactionSelect = SELECT
-	(IfcBoolean
-	,IfcModulusOfLinearSubgradeReactionMeasure);
-END_TYPE;
-
-TYPE IfcObjectReferenceSelect = SELECT
-	(IfcAddress
-	,IfcAppliedValue
-	,IfcExternalReference
-	,IfcMaterialDefinition
-	,IfcOrganization
-	,IfcPerson
-	,IfcPersonAndOrganization
-	,IfcTable
-	,IfcTimeSeries);
-END_TYPE;
-
-TYPE IfcPointOrVertexPoint = SELECT
-	(IfcPoint
-	,IfcVertexPoint);
-END_TYPE;
-
-TYPE IfcPresentationStyleSelect = SELECT
-	(IfcCurveStyle
-	,IfcFillAreaStyle
-	,IfcNullStyle
-	,IfcSurfaceStyle
-	,IfcTextStyle);
-END_TYPE;
-
-TYPE IfcProcessSelect = SELECT
-	(IfcProcess
-	,IfcTypeProcess);
-END_TYPE;
-
-TYPE IfcProductRepresentationSelect = SELECT
-	(IfcProductDefinitionShape
-	,IfcRepresentationMap);
-END_TYPE;
-
-TYPE IfcProductSelect = SELECT
-	(IfcProduct
-	,IfcTypeProduct);
-END_TYPE;
-
-TYPE IfcPropertySetDefinitionSelect = SELECT
-	(IfcPropertySetDefinition
-	,IfcPropertySetDefinitionSet);
-END_TYPE;
-
-TYPE IfcResourceObjectSelect = SELECT
-	(IfcActorRole
-	,IfcAppliedValue
-	,IfcApproval
-	,IfcConstraint
-	,IfcContextDependentUnit
-	,IfcConversionBasedUnit
-	,IfcExternalInformation
-	,IfcExternalReference
-	,IfcMaterialDefinition
-	,IfcOrganization
-	,IfcPerson
-	,IfcPersonAndOrganization
-	,IfcPhysicalQuantity
-	,IfcProfileDef
-	,IfcPropertyAbstraction
-	,IfcTimeSeries);
-END_TYPE;
-
-TYPE IfcResourceSelect = SELECT
-	(IfcResource
-	,IfcTypeResource);
-END_TYPE;
-
-TYPE IfcRotationalStiffnessSelect = SELECT
-	(IfcBoolean
-	,IfcRotationalStiffnessMeasure);
-END_TYPE;
-
-TYPE IfcSegmentIndexSelect = SELECT
-	(IfcArcIndex
-	,IfcLineIndex);
-END_TYPE;
-
-TYPE IfcShell = SELECT
-	(IfcClosedShell
-	,IfcOpenShell);
-END_TYPE;
-
-TYPE IfcSimpleValue = SELECT
-	(IfcBinary
-	,IfcBoolean
-	,IfcDate
-	,IfcDateTime
-	,IfcDuration
-	,IfcIdentifier
-	,IfcInteger
-	,IfcLabel
-	,IfcLogical
-	,IfcPositiveInteger
-	,IfcReal
-	,IfcText
-	,IfcTime
-	,IfcTimeStamp);
-END_TYPE;
-
-TYPE IfcSizeSelect = SELECT
-	(IfcDescriptiveMeasure
-	,IfcLengthMeasure
-	,IfcNormalisedRatioMeasure
-	,IfcPositiveLengthMeasure
-	,IfcPositiveRatioMeasure
-	,IfcRatioMeasure);
-END_TYPE;
-
-TYPE IfcSolidOrShell = SELECT
-	(IfcClosedShell
-	,IfcSolidModel);
-END_TYPE;
-
-TYPE IfcSpaceBoundarySelect = SELECT
-	(IfcExternalSpatialElement
-	,IfcSpace);
-END_TYPE;
-
-TYPE IfcSpecularHighlightSelect = SELECT
-	(IfcSpecularExponent
-	,IfcSpecularRoughness);
-END_TYPE;
-
-TYPE IfcStructuralActivityAssignmentSelect = SELECT
-	(IfcElement
-	,IfcStructuralItem);
-END_TYPE;
-
-TYPE IfcStyleAssignmentSelect = SELECT
-	(IfcPresentationStyle
-	,IfcPresentationStyleAssignment);
-END_TYPE;
-
-TYPE IfcSurfaceOrFaceSurface = SELECT
-	(IfcFaceBasedSurfaceModel
-	,IfcFaceSurface
-	,IfcSurface);
-END_TYPE;
-
-TYPE IfcSurfaceStyleElementSelect = SELECT
-	(IfcExternallyDefinedSurfaceStyle
-	,IfcSurfaceStyleLighting
-	,IfcSurfaceStyleRefraction
-	,IfcSurfaceStyleShading
-	,IfcSurfaceStyleWithTextures);
-END_TYPE;
-
-TYPE IfcTextFontSelect = SELECT
-	(IfcExternallyDefinedTextFont
-	,IfcPreDefinedTextFont);
-END_TYPE;
-
-TYPE IfcTimeOrRatioSelect = SELECT
-	(IfcDuration
-	,IfcRatioMeasure);
-END_TYPE;
-
-TYPE IfcTranslationalStiffnessSelect = SELECT
-	(IfcBoolean
-	,IfcLinearStiffnessMeasure);
-END_TYPE;
-
-TYPE IfcTrimmingSelect = SELECT
-	(IfcCartesianPoint
-	,IfcParameterValue);
-END_TYPE;
-
-TYPE IfcUnit = SELECT
-	(IfcDerivedUnit
-	,IfcMonetaryUnit
-	,IfcNamedUnit);
-END_TYPE;
-
-TYPE IfcValue = SELECT
-	(IfcDerivedMeasureValue
-	,IfcMeasureValue
-	,IfcSimpleValue);
-END_TYPE;
-
-TYPE IfcVectorOrDirection = SELECT
-	(IfcDirection
-	,IfcVector);
-END_TYPE;
-
-TYPE IfcWarpingStiffnessSelect = SELECT
-	(IfcBoolean
-	,IfcWarpingMomentMeasure);
-END_TYPE;
-
-ENTITY IfcActionRequest
- SUBTYPE OF (IfcControl);
-	PredefinedType : OPTIONAL IfcActionRequestTypeEnum;
-	Status : OPTIONAL IfcLabel;
-	LongDescription : OPTIONAL IfcText;
-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;
- INVERSE
-	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
- WHERE
-	WR1 : (Role <> IfcRoleEnum.USERDEFINED) OR
-((Role = IfcRoleEnum.USERDEFINED) AND
-  EXISTS(SELF.UserDefinedRole));
-END_ENTITY;
-
-ENTITY IfcActuator
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcActuatorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcActuatorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcActuatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCACTUATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcActuatorType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcActuatorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcActuatorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcActuatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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 IfcAdvancedBrep
- SUPERTYPE OF (ONEOF
-    (IfcAdvancedBrepWithVoids))
- SUBTYPE OF (IfcManifoldSolidBrep);
- WHERE
-	HasAdvancedFaces : SIZEOF(QUERY(Afs <* SELF\IfcManifoldSolidBrep.Outer.CfsFaces |
-  (NOT ('IFC4.IFCADVANCEDFACE' IN TYPEOF(Afs)))
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcAdvancedBrepWithVoids
- SUBTYPE OF (IfcAdvancedBrep);
-	Voids : SET [1:?] OF IfcClosedShell;
- WHERE
-	VoidsHaveAdvancedFaces : SIZEOF (QUERY (Vsh <* Voids |
-  SIZEOF (QUERY (Afs <* Vsh.CfsFaces |
-  (NOT ('IFC4.IFCADVANCEDFACE' IN TYPEOF(Afs)))
-  )) = 0
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcAdvancedFace
- SUBTYPE OF (IfcFaceSurface);
- WHERE
-	ApplicableSurface : SIZEOF (
-['IFC4.IFCELEMENTARYSURFACE',
- 'IFC4.IFCSWEPTSURFACE',
- 'IFC4.IFCBSPLINESURFACE'] *
-TYPEOF(SELF\IfcFaceSurface.FaceSurface)) = 1;
-	RequiresEdgeCurve : SIZEOF(QUERY (ElpFbnds <* 
-  QUERY (Bnds <* SELF\IfcFace.Bounds |
-    'IFC4.IFCEDGELOOP' IN TYPEOF(Bnds.Bound)) |
-     NOT (SIZEOF (QUERY (Oe <* ElpFbnds.Bound\IfcEdgeLoop.EdgeList |
-       NOT('IFC4.IFCEDGECURVE' IN 
-       TYPEOF(Oe\IfcOrientedEdge.EdgeElement)
-  ))) = 0
-))) = 0;
-	ApplicableEdgeCurves : SIZEOF(QUERY (ElpFbnds <* 
-  QUERY (Bnds <* SELF\IfcFace.Bounds |
-    'IFC4.IFCEDGELOOP' IN TYPEOF(Bnds.Bound)) |
-     NOT (SIZEOF (QUERY (Oe <* ElpFbnds.Bound\IfcEdgeLoop.EdgeList |
-       NOT (SIZEOF (['IFC4.IFCLINE',
-                     'IFC4.IFCCONIC',
-                     'IFC4.IFCPOLYLINE',
-                     'IFC4.IFCBSPLINECURVE'] *
-         TYPEOF(Oe\IfcOrientedEdge.EdgeElement\IfcEdgeCurve.EdgeGeometry)) = 1 )
-  )) = 0
-))) = 0;
-END_ENTITY;
-
-ENTITY IfcAirTerminal
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcAirTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcAirTerminalTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcAirTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCAIRTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcAirTerminalBox
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcAirTerminalBoxTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcAirTerminalBoxTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcAirTerminalBoxTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCAIRTERMINALBOXTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcAirTerminalBoxType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcAirTerminalBoxTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcAirTerminalBoxTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcAirTerminalBoxTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcAirTerminalType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcAirTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcAirTerminalTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcAirTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcAirToAirHeatRecovery
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcAirToAirHeatRecoveryTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCAIRTOAIRHEATRECOVERYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcAirToAirHeatRecoveryType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcAirToAirHeatRecoveryTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcAlarm
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcAlarmTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcAlarmTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcAlarmTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCALARMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcAlarmType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcAlarmTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcAlarmTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcAlarmTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcAnnotation
- SUBTYPE OF (IfcProduct);
- INVERSE
-	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
-END_ENTITY;
-
-ENTITY IfcAnnotationFillArea
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	OuterBoundary : IfcCurve;
-	InnerBoundaries : OPTIONAL SET [1:?] OF IfcCurve;
-END_ENTITY;
-
-ENTITY IfcApplication;
-	ApplicationDeveloper : IfcOrganization;
-	Version : IfcLabel;
-	ApplicationFullName : IfcLabel;
-	ApplicationIdentifier : IfcIdentifier;
- UNIQUE
-	UR1 : ApplicationIdentifier;
-	UR2 : ApplicationFullName, Version;
-END_ENTITY;
-
-ENTITY IfcAppliedValue
- SUPERTYPE OF (ONEOF
-    (IfcCostValue));
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	AppliedValue : OPTIONAL IfcAppliedValueSelect;
-	UnitBasis : OPTIONAL IfcMeasureWithUnit;
-	ApplicableDate : OPTIONAL IfcDate;
-	FixedUntilDate : OPTIONAL IfcDate;
-	Category : OPTIONAL IfcLabel;
-	Condition : OPTIONAL IfcLabel;
-	ArithmeticOperator : OPTIONAL IfcArithmeticOperatorEnum;
-	Components : OPTIONAL LIST [1:?] OF IfcAppliedValue;
- INVERSE
-	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-END_ENTITY;
-
-ENTITY IfcApproval;
-	Identifier : OPTIONAL IfcIdentifier;
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	TimeOfApproval : OPTIONAL IfcDateTime;
-	Status : OPTIONAL IfcLabel;
-	Level : OPTIONAL IfcLabel;
-	Qualifier : OPTIONAL IfcText;
-	RequestingApproval : OPTIONAL IfcActorSelect;
-	GivingApproval : OPTIONAL IfcActorSelect;
- INVERSE
-	HasExternalReferences : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-	ApprovedObjects : SET [0:?] OF IfcRelAssociatesApproval FOR RelatingApproval;
-	ApprovedResources : SET [0:?] OF IfcResourceApprovalRelationship FOR RelatingApproval;
-	IsRelatedWith : SET [0:?] OF IfcApprovalRelationship FOR RelatedApprovals;
-	Relates : SET [0:?] OF IfcApprovalRelationship FOR RelatingApproval;
- WHERE
-	HasIdentifierOrName : EXISTS (Identifier) OR EXISTS (Name);
-END_ENTITY;
-
-ENTITY IfcApprovalRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingApproval : IfcApproval;
-	RelatedApprovals : SET [1:?] OF IfcApproval;
-END_ENTITY;
-
-ENTITY IfcArbitraryClosedProfileDef
- SUPERTYPE OF (ONEOF
-    (IfcArbitraryProfileDefWithVoids))
- SUBTYPE OF (IfcProfileDef);
-	OuterCurve : IfcCurve;
- WHERE
-	WR1 : OuterCurve.Dim = 2;
-	WR2 : NOT('IFC4.IFCLINE' IN TYPEOF(OuterCurve));
-	WR3 : NOT('IFC4.IFCOFFSETCURVE2D' IN TYPEOF(OuterCurve));
-END_ENTITY;
-
-ENTITY IfcArbitraryOpenProfileDef
- SUPERTYPE OF (ONEOF
-    (IfcCenterLineProfileDef))
- SUBTYPE OF (IfcProfileDef);
-	Curve : IfcBoundedCurve;
- WHERE
-	WR11 : ('IFC4.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 | 'IFC4.IFCLINE' IN TYPEOF(temp))) = 0;
-END_ENTITY;
-
-ENTITY IfcAsset
- SUBTYPE OF (IfcGroup);
-	Identification : OPTIONAL IfcIdentifier;
-	OriginalValue : OPTIONAL IfcCostValue;
-	CurrentValue : OPTIONAL IfcCostValue;
-	TotalReplacementCost : OPTIONAL IfcCostValue;
-	Owner : OPTIONAL IfcActorSelect;
-	User : OPTIONAL IfcActorSelect;
-	ResponsiblePerson : OPTIONAL IfcPerson;
-	IncorporationDate : OPTIONAL IfcDate;
-	DepreciatedValue : OPTIONAL IfcCostValue;
-END_ENTITY;
-
-ENTITY IfcAsymmetricIShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	BottomFlangeWidth : IfcPositiveLengthMeasure;
-	OverallDepth : IfcPositiveLengthMeasure;
-	WebThickness : IfcPositiveLengthMeasure;
-	BottomFlangeThickness : IfcPositiveLengthMeasure;
-	BottomFlangeFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	TopFlangeWidth : IfcPositiveLengthMeasure;
-	TopFlangeThickness : OPTIONAL IfcPositiveLengthMeasure;
-	TopFlangeFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	BottomFlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	BottomFlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
-	TopFlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	TopFlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
- WHERE
-	ValidFlangeThickness : NOT(EXISTS(TopFlangeThickness)) OR ((BottomFlangeThickness + TopFlangeThickness) < OverallDepth);
-	ValidWebThickness : (WebThickness < BottomFlangeWidth) AND (WebThickness < TopFlangeWidth);
-	ValidBottomFilletRadius : (NOT(EXISTS(BottomFlangeFilletRadius))) OR 
-(BottomFlangeFilletRadius <= (BottomFlangeWidth - WebThickness)/2.);
-	ValidTopFilletRadius : (NOT(EXISTS(TopFlangeFilletRadius))) OR 
-(TopFlangeFilletRadius <= (TopFlangeWidth - WebThickness)/2.);
-END_ENTITY;
-
-ENTITY IfcAudioVisualAppliance
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcAudioVisualApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcAudioVisualApplianceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcAudioVisualApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCAUDIOVISUALAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcAudioVisualApplianceType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcAudioVisualApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcAudioVisualApplianceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcAudioVisualApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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
-	AxisIs3D : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
-	LocationIs3D : 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
-	RefDirIs2D : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 2);
-	LocationIs2D : 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
-	LocationIs3D : SELF\IfcPlacement.Location.Dim = 3;
-	AxisIs3D : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
-	RefDirIs3D : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 3);
-	AxisToRefDirPosition : (NOT (EXISTS (Axis))) OR (NOT (EXISTS (RefDirection))) OR (IfcCrossProduct(Axis,RefDirection).Magnitude > 0.0);
-	AxisAndRefDirProvision : NOT ((EXISTS (Axis)) XOR (EXISTS (RefDirection)));
-END_ENTITY;
-
-ENTITY IfcBSplineCurve
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBSplineCurveWithKnots))
- SUBTYPE OF (IfcBoundedCurve);
-	Degree : IfcInteger;
-	ControlPointsList : LIST [2:?] OF IfcCartesianPoint;
-	CurveForm : IfcBSplineCurveForm;
-	ClosedCurve : IfcLogical;
-	SelfIntersect : IfcLogical;
- DERIVE
-	UpperIndexOnControlPoints : IfcInteger := (SIZEOF(ControlPointsList) - 1);
-	ControlPoints : ARRAY [0:UpperIndexOnControlPoints] OF IfcCartesianPoint := IfcListToArray(ControlPointsList,0,UpperIndexOnControlPoints);
- WHERE
-	SameDim : SIZEOF(QUERY(Temp <* ControlPointsList |
-  Temp.Dim <> ControlPointsList[1].Dim))
-= 0;
-END_ENTITY;
-
-ENTITY IfcBSplineCurveWithKnots
- SUPERTYPE OF (ONEOF
-    (IfcRationalBSplineCurveWithKnots))
- SUBTYPE OF (IfcBSplineCurve);
-	KnotMultiplicities : LIST [2:?] OF IfcInteger;
-	Knots : LIST [2:?] OF IfcParameterValue;
-	KnotSpec : IfcKnotType;
- DERIVE
-	UpperIndexOnKnots : IfcInteger := SIZEOF(Knots);
- WHERE
-	ConsistentBSpline : IfcConstraintsParamBSpline(Degree, UpperIndexOnKnots,
-UpperIndexOnControlPoints, KnotMultiplicities, Knots);
-	CorrespondingKnotLists : SIZEOF(KnotMultiplicities) = UpperIndexOnKnots;
-END_ENTITY;
-
-ENTITY IfcBSplineSurface
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBSplineSurfaceWithKnots))
- SUBTYPE OF (IfcBoundedSurface);
-	UDegree : IfcInteger;
-	VDegree : IfcInteger;
-	ControlPointsList : LIST [2:?] OF LIST [2:?] OF IfcCartesianPoint;
-	SurfaceForm : IfcBSplineSurfaceForm;
-	UClosed : IfcLogical;
-	VClosed : IfcLogical;
-	SelfIntersect : IfcLogical;
- DERIVE
-	UUpper : IfcInteger := SIZEOF(ControlPointsList) - 1;
-	VUpper : IfcInteger := SIZEOF(ControlPointsList[1]) - 1;
-	ControlPoints : ARRAY [0:UUpper] OF ARRAY [0:VUpper] OF IfcCartesianPoint := IfcMakeArrayOfArray(ControlPointsList,
-0,UUpper,0,VUpper);
-END_ENTITY;
-
-ENTITY IfcBSplineSurfaceWithKnots
- SUPERTYPE OF (ONEOF
-    (IfcRationalBSplineSurfaceWithKnots))
- SUBTYPE OF (IfcBSplineSurface);
-	UMultiplicities : LIST [2:?] OF IfcInteger;
-	VMultiplicities : LIST [2:?] OF IfcInteger;
-	UKnots : LIST [2:?] OF IfcParameterValue;
-	VKnots : LIST [2:?] OF IfcParameterValue;
-	KnotSpec : IfcKnotType;
- DERIVE
-	KnotVUpper : IfcInteger := SIZEOF(VKnots);
-	KnotUUpper : IfcInteger := SIZEOF(UKnots);
- WHERE
-	UDirectionConstraints : IfcConstraintsParamBSpline (
-  SELF\IfcBSplineSurface.UDegree, KnotUUpper, 
-  SELF\IfcBSplineSurface.UUpper, UMultiplicities, UKnots);
-	VDirectionConstraints : IfcConstraintsParamBSpline (
-  SELF\IfcBSplineSurface.VDegree, KnotVUpper, 
-  SELF\IfcBSplineSurface.VUpper, VMultiplicities, VKnots);
-	CorrespondingULists : SIZEOF(UMultiplicities) = KnotUUpper;
-	CorrespondingVLists : SIZEOF(VMultiplicities) = KnotVUpper;
-END_ENTITY;
-
-ENTITY IfcBeam
- SUPERTYPE OF (ONEOF
-    (IfcBeamStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcBeamTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcBeamTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcBeamTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCBEAMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcBeamStandardCase
- SUBTYPE OF (IfcBeam);
- WHERE
-	HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcBeamType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcBeamTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcBeamTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBeamTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcBlobTexture
- SUBTYPE OF (IfcSurfaceTexture);
-	RasterFormat : IfcIdentifier;
-	RasterCode : IfcBinary;
- WHERE
-	SupportedRasterFormat : SELF.RasterFormat IN ['BMP', 'JPG', 'GIF', 'PNG'];
-	RasterCodeByteStream : BLENGTH(RasterCode) MOD 8 = 0;
-END_ENTITY;
-
-ENTITY IfcBlock
- SUBTYPE OF (IfcCsgPrimitive3D);
-	XLength : IfcPositiveLengthMeasure;
-	YLength : IfcPositiveLengthMeasure;
-	ZLength : IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcBoiler
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcBoilerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcBoilerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcBoilerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCBOILERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcBoilerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcBoilerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcBoilerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBoilerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcBooleanClippingResult
- SUBTYPE OF (IfcBooleanResult);
- WHERE
-	FirstOperandType : ('IFC4.IFCSWEPTAREASOLID' IN TYPEOF(FirstOperand)) OR 
-('IFC4.IFCSWEPTDISCSOLID' IN TYPEOF(FirstOperand)) OR 
-('IFC4.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(FirstOperand));
-	SecondOperandType : ('IFC4.IFCHALFSPACESOLID' IN TYPEOF(SecondOperand));
-	OperatorType : 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
-	SameDim : FirstOperand.Dim = SecondOperand.Dim;
-	FirstOperandClosed : NOT('IFC4.IFCTESSELLATEDFACESET' IN TYPEOF(FirstOperand)) OR (EXISTS(FirstOperand.Closed) AND FirstOperand.Closed);
-	SecondOperandClosed : NOT('IFC4.IFCTESSELLATEDFACESET' IN TYPEOF(SecondOperand)) OR (EXISTS(SecondOperand.Closed) AND SecondOperand.Closed);
-END_ENTITY;
-
-ENTITY IfcBoundaryCondition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBoundaryEdgeCondition
-    ,IfcBoundaryFaceCondition
-    ,IfcBoundaryNodeCondition));
-	Name : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcBoundaryCurve
- SUPERTYPE OF (ONEOF
-    (IfcOuterBoundaryCurve))
- SUBTYPE OF (IfcCompositeCurveOnSurface);
- WHERE
-	IsClosed : SELF\IfcCompositeCurve.ClosedCurve;
-END_ENTITY;
-
-ENTITY IfcBoundaryEdgeCondition
- SUBTYPE OF (IfcBoundaryCondition);
-	TranslationalStiffnessByLengthX : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
-	TranslationalStiffnessByLengthY : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
-	TranslationalStiffnessByLengthZ : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
-	RotationalStiffnessByLengthX : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
-	RotationalStiffnessByLengthY : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
-	RotationalStiffnessByLengthZ : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
-END_ENTITY;
-
-ENTITY IfcBoundaryFaceCondition
- SUBTYPE OF (IfcBoundaryCondition);
-	TranslationalStiffnessByAreaX : OPTIONAL IfcModulusOfSubgradeReactionSelect;
-	TranslationalStiffnessByAreaY : OPTIONAL IfcModulusOfSubgradeReactionSelect;
-	TranslationalStiffnessByAreaZ : OPTIONAL IfcModulusOfSubgradeReactionSelect;
-END_ENTITY;
-
-ENTITY IfcBoundaryNodeCondition
- SUPERTYPE OF (ONEOF
-    (IfcBoundaryNodeConditionWarping))
- SUBTYPE OF (IfcBoundaryCondition);
-	TranslationalStiffnessX : OPTIONAL IfcTranslationalStiffnessSelect;
-	TranslationalStiffnessY : OPTIONAL IfcTranslationalStiffnessSelect;
-	TranslationalStiffnessZ : OPTIONAL IfcTranslationalStiffnessSelect;
-	RotationalStiffnessX : OPTIONAL IfcRotationalStiffnessSelect;
-	RotationalStiffnessY : OPTIONAL IfcRotationalStiffnessSelect;
-	RotationalStiffnessZ : OPTIONAL IfcRotationalStiffnessSelect;
-END_ENTITY;
-
-ENTITY IfcBoundaryNodeConditionWarping
- SUBTYPE OF (IfcBoundaryNodeCondition);
-	WarpingStiffness : OPTIONAL IfcWarpingStiffnessSelect;
-END_ENTITY;
-
-ENTITY IfcBoundedCurve
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBSplineCurve
-    ,IfcCompositeCurve
-    ,IfcIndexedPolyCurve
-    ,IfcPolyline
-    ,IfcTrimmedCurve))
- SUBTYPE OF (IfcCurve);
-END_ENTITY;
-
-ENTITY IfcBoundedSurface
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBSplineSurface
-    ,IfcCurveBoundedPlane
-    ,IfcCurveBoundedSurface
-    ,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
-	UnboundedSurface : NOT ('IFC4.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
-    ,IfcBuildingElementProxy
-    ,IfcChimney
-    ,IfcColumn
-    ,IfcCovering
-    ,IfcCurtainWall
-    ,IfcDoor
-    ,IfcFooting
-    ,IfcMember
-    ,IfcPile
-    ,IfcPlate
-    ,IfcRailing
-    ,IfcRamp
-    ,IfcRampFlight
-    ,IfcRoof
-    ,IfcShadingDevice
-    ,IfcSlab
-    ,IfcStair
-    ,IfcStairFlight
-    ,IfcWall
-    ,IfcWindow))
- SUBTYPE OF (IfcElement);
- WHERE
-	MaxOneMaterialAssociation : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations |
-  'IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)
-  )) <= 1;
-END_ENTITY;
-
-ENTITY IfcBuildingElementPart
- SUBTYPE OF (IfcElementComponent);
-	PredefinedType : OPTIONAL IfcBuildingElementPartTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcBuildingElementPartTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBuildingElementPartTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCBUILDINGELEMENTPARTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcBuildingElementPartType
- SUBTYPE OF (IfcElementComponentType);
-	PredefinedType : IfcBuildingElementPartTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcBuildingElementPartTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBuildingElementPartTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcBuildingElementProxy
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcBuildingElementProxyTypeEnum;
- WHERE
-	HasObjectName : EXISTS(SELF\IfcRoot.Name);
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcBuildingElementProxyTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcBuildingElementProxyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCBUILDINGELEMENTPROXYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcBuildingElementProxyType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcBuildingElementProxyTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcBuildingElementProxyTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBuildingElementProxyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcBuildingElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBeamType
-    ,IfcBuildingElementProxyType
-    ,IfcChimneyType
-    ,IfcColumnType
-    ,IfcCoveringType
-    ,IfcCurtainWallType
-    ,IfcDoorType
-    ,IfcFootingType
-    ,IfcMemberType
-    ,IfcPileType
-    ,IfcPlateType
-    ,IfcRailingType
-    ,IfcRampFlightType
-    ,IfcRampType
-    ,IfcRoofType
-    ,IfcShadingDeviceType
-    ,IfcSlabType
-    ,IfcStairFlightType
-    ,IfcStairType
-    ,IfcWallType
-    ,IfcWindowType))
- SUBTYPE OF (IfcElementType);
-END_ENTITY;
-
-ENTITY IfcBuildingStorey
- SUBTYPE OF (IfcSpatialStructureElement);
-	Elevation : OPTIONAL IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcBuildingSystem
- SUBTYPE OF (IfcSystem);
-	PredefinedType : OPTIONAL IfcBuildingSystemTypeEnum;
-	LongName : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcBurner
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcBurnerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcBurnerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcBurnerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCBURNERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcBurnerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcBurnerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcBurnerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcBurnerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	Depth : IfcPositiveLengthMeasure;
-	Width : IfcPositiveLengthMeasure;
-	WallThickness : IfcPositiveLengthMeasure;
-	Girth : IfcPositiveLengthMeasure;
-	InternalFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
- WHERE
-	ValidGirth : Girth < (Depth / 2.);
-	ValidInternalFilletRadius : NOT(EXISTS(InternalFilletRadius)) OR
-((InternalFilletRadius <= Width/2. - WallThickness) AND (InternalFilletRadius <= Depth/2. - WallThickness));
-	ValidWallThickness : (WallThickness < Width/2.) AND (WallThickness < Depth/2.);
-END_ENTITY;
-
-ENTITY IfcCableCarrierFitting
- SUBTYPE OF (IfcFlowFitting);
-	PredefinedType : OPTIONAL IfcCableCarrierFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCableCarrierFittingTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCableCarrierFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCABLECARRIERFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCableCarrierFittingType
- SUBTYPE OF (IfcFlowFittingType);
-	PredefinedType : IfcCableCarrierFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCableCarrierFittingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCableCarrierFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCableCarrierSegment
- SUBTYPE OF (IfcFlowSegment);
-	PredefinedType : OPTIONAL IfcCableCarrierSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCableCarrierSegmentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCableCarrierSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCABLECARRIERSEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCableCarrierSegmentType
- SUBTYPE OF (IfcFlowSegmentType);
-	PredefinedType : IfcCableCarrierSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCableCarrierSegmentTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCableCarrierSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCableFitting
- SUBTYPE OF (IfcFlowFitting);
-	PredefinedType : OPTIONAL IfcCableFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCableFittingTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCableFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCABLEFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCableFittingType
- SUBTYPE OF (IfcFlowFittingType);
-	PredefinedType : IfcCableFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCableFittingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCableFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCableSegment
- SUBTYPE OF (IfcFlowSegment);
-	PredefinedType : OPTIONAL IfcCableSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCableSegmentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCableSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCABLESEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCableSegmentType
- SUBTYPE OF (IfcFlowSegmentType);
-	PredefinedType : IfcCableSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCableSegmentTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCableSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCartesianPoint
- SUBTYPE OF (IfcPoint);
-	Coordinates : LIST [1:3] OF IfcLengthMeasure;
- DERIVE
-	Dim : IfcDimensionCount := HIINDEX(Coordinates);
- WHERE
-	CP2Dor3D : HIINDEX(Coordinates) >= 2;
-END_ENTITY;
-
-ENTITY IfcCartesianPointList
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCartesianPointList2D
-    ,IfcCartesianPointList3D))
- SUBTYPE OF (IfcGeometricRepresentationItem);
- DERIVE
-	Dim : IfcDimensionCount := IfcPointListDim(SELF);
-END_ENTITY;
-
-ENTITY IfcCartesianPointList2D
- SUBTYPE OF (IfcCartesianPointList);
-	CoordList : LIST [1:?] OF LIST [2:2] OF IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcCartesianPointList3D
- SUBTYPE OF (IfcCartesianPointList);
-	CoordList : LIST [1:?] OF LIST [3:3] OF IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcCartesianTransformationOperator
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCartesianTransformationOperator2D
-    ,IfcCartesianTransformationOperator3D))
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	Axis1 : OPTIONAL IfcDirection;
-	Axis2 : OPTIONAL IfcDirection;
-	LocalOrigin : IfcCartesianPoint;
-	Scale : OPTIONAL IfcReal;
- DERIVE
-	Scl : IfcReal := NVL(Scale, 1.0);
-	Dim : IfcDimensionCount := LocalOrigin.Dim;
- WHERE
-	ScaleGreaterZero : 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
-	DimEqual2 : SELF\IfcCartesianTransformationOperator.Dim = 2;
-	Axis1Is2D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
-(SELF\IfcCartesianTransformationOperator.Axis1.Dim = 2);
-	Axis2Is2D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
-(SELF\IfcCartesianTransformationOperator.Axis2.Dim = 2);
-END_ENTITY;
-
-ENTITY IfcCartesianTransformationOperator2DnonUniform
- SUBTYPE OF (IfcCartesianTransformationOperator2D);
-	Scale2 : OPTIONAL IfcReal;
- DERIVE
-	Scl2 : IfcReal := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
- WHERE
-	Scale2GreaterZero : 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
-	DimIs3D : SELF\IfcCartesianTransformationOperator.Dim = 3;
-	Axis1Is3D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
-(SELF\IfcCartesianTransformationOperator.Axis1.Dim = 3);
-	Axis2Is3D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
-(SELF\IfcCartesianTransformationOperator.Axis2.Dim = 3);
-	Axis3Is3D : NOT(EXISTS(Axis3)) OR (Axis3.Dim = 3);
-END_ENTITY;
-
-ENTITY IfcCartesianTransformationOperator3DnonUniform
- SUBTYPE OF (IfcCartesianTransformationOperator3D);
-	Scale2 : OPTIONAL IfcReal;
-	Scale3 : OPTIONAL IfcReal;
- DERIVE
-	Scl2 : IfcReal := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
-	Scl3 : IfcReal := NVL(Scale3, SELF\IfcCartesianTransformationOperator.Scl);
- WHERE
-	Scale2GreaterZero : Scl2 > 0.0;
-	Scale3GreaterZero : Scl3 > 0.0;
-END_ENTITY;
-
-ENTITY IfcCenterLineProfileDef
- SUBTYPE OF (IfcArbitraryOpenProfileDef);
-	Thickness : IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcChiller
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcChillerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcChillerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcChillerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCHILLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcChillerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcChillerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcChillerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcChillerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcChimney
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcChimneyTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcChimneyTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcChimneyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCCHIMNEYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcChimneyType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcChimneyTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcChimneyTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcChimneyTypeEnum.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 IfcCivilElement
- SUBTYPE OF (IfcElement);
-END_ENTITY;
-
-ENTITY IfcCivilElementType
- SUBTYPE OF (IfcElementType);
-END_ENTITY;
-
-ENTITY IfcClassification
- SUBTYPE OF (IfcExternalInformation);
-	Source : OPTIONAL IfcLabel;
-	Edition : OPTIONAL IfcLabel;
-	EditionDate : OPTIONAL IfcDate;
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	Location : OPTIONAL IfcURIReference;
-	ReferenceTokens : OPTIONAL LIST [1:?] OF IfcIdentifier;
- INVERSE
-	ClassificationForObjects : SET [0:?] OF IfcRelAssociatesClassification FOR RelatingClassification;
-	HasReferences : SET [0:?] OF IfcClassificationReference FOR ReferencedSource;
-END_ENTITY;
-
-ENTITY IfcClassificationReference
- SUBTYPE OF (IfcExternalReference);
-	ReferencedSource : OPTIONAL IfcClassificationReferenceSelect;
-	Description : OPTIONAL IfcText;
-	Sort : OPTIONAL IfcIdentifier;
- INVERSE
-	ClassificationRefForObjects : SET [0:?] OF IfcRelAssociatesClassification FOR RelatingClassification;
-	HasReferences : SET [0:?] OF IfcClassificationReference FOR ReferencedSource;
-END_ENTITY;
-
-ENTITY IfcClosedShell
- SUBTYPE OF (IfcConnectedFaceSet);
-END_ENTITY;
-
-ENTITY IfcCoil
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcCoilTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCoilTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCoilTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCOILTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCoilType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcCoilTypeEnum;
- WHERE
-	CorrectPredefinedType : (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 IfcColourRgbList
- SUBTYPE OF (IfcPresentationItem);
-	ColourList : LIST [1:?] OF LIST [3:3] OF IfcNormalisedRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcColourSpecification
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcColourRgb))
- SUBTYPE OF (IfcPresentationItem);
-	Name : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcColumn
- SUPERTYPE OF (ONEOF
-    (IfcColumnStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcColumnTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcColumnTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcColumnTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCCOLUMNTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcColumnStandardCase
- SUBTYPE OF (IfcColumn);
- WHERE
-	HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcColumnType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcColumnTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcColumnTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcColumnTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCommunicationsAppliance
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcCommunicationsApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCommunicationsApplianceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCommunicationsApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCOMMUNICATIONSAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCommunicationsApplianceType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcCommunicationsApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCommunicationsApplianceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCommunicationsApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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 IfcComplexPropertyTemplate
- SUBTYPE OF (IfcPropertyTemplate);
-	UsageName : OPTIONAL IfcLabel;
-	TemplateType : OPTIONAL IfcComplexPropertyTemplateTypeEnum;
-	HasPropertyTemplates : OPTIONAL SET [1:?] OF IfcPropertyTemplate;
- WHERE
-	UniquePropertyNames : IfcUniquePropertyTemplateNames(HasPropertyTemplates);
-	NoSelfReference : SIZEOF(QUERY(temp <* HasPropertyTemplates | SELF :=: temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcCompositeCurve
- SUPERTYPE OF (ONEOF
-    (IfcCompositeCurveOnSurface))
- SUBTYPE OF (IfcBoundedCurve);
-	Segments : LIST [1:?] OF IfcCompositeCurveSegment;
-	SelfIntersect : IfcLogical;
- DERIVE
-	NSegments : IfcInteger := SIZEOF(Segments);
-	ClosedCurve : IfcLogical := Segments[NSegments].Transition <> Discontinuous;
- WHERE
-	CurveContinuous : ((NOT ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 1)) OR ((ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 0));
-	SameDim : SIZEOF( QUERY( Temp <* Segments | Temp.Dim <> Segments[1].Dim)) = 0;
-END_ENTITY;
-
-ENTITY IfcCompositeCurveOnSurface
- SUPERTYPE OF (ONEOF
-    (IfcBoundaryCurve))
- SUBTYPE OF (IfcCompositeCurve);
- DERIVE
-	BasisSurface : SET [0:1] OF IfcSurface := IfcGetBasisSurface(SELF);
- WHERE
-	SameSurface : SIZEOF(BasisSurface) > 0;
-END_ENTITY;
-
-ENTITY IfcCompositeCurveSegment
- SUPERTYPE OF (ONEOF
-    (IfcReparametrisedCompositeCurveSegment))
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	Transition : IfcTransitionCode;
-	SameSense : IfcBoolean;
-	ParentCurve : IfcCurve;
- DERIVE
-	Dim : IfcDimensionCount := ParentCurve.Dim;
- INVERSE
-	UsingCurves : SET [1:?] OF IfcCompositeCurve FOR Segments;
- WHERE
-	ParentIsBoundedCurve : ('IFC4.IFCBOUNDEDCURVE' IN TYPEOF(ParentCurve));
-END_ENTITY;
-
-ENTITY IfcCompositeProfileDef
- SUBTYPE OF (IfcProfileDef);
-	Profiles : SET [2:?] OF IfcProfileDef;
-	Label : OPTIONAL IfcLabel;
- WHERE
-	InvariantProfileType : SIZEOF(QUERY(temp <* Profiles | temp.ProfileType <> Profiles[1].ProfileType)) = 0;
-	NoRecursion : SIZEOF(QUERY(temp <* Profiles | 'IFC4.IFCCOMPOSITEPROFILEDEF' IN TYPEOF(temp))) = 0;
-END_ENTITY;
-
-ENTITY IfcCompressor
- SUBTYPE OF (IfcFlowMovingDevice);
-	PredefinedType : OPTIONAL IfcCompressorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCompressorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCompressorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCOMPRESSORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCompressorType
- SUBTYPE OF (IfcFlowMovingDeviceType);
-	PredefinedType : IfcCompressorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCompressorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCompressorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCondenser
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcCondenserTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCondenserTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCondenserTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCONDENSERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCondenserType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcCondenserTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCondenserTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCondenserTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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
-    ,IfcConnectionSurfaceGeometry
-    ,IfcConnectionVolumeGeometry));
-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 IfcConnectionSurfaceGeometry
- SUBTYPE OF (IfcConnectionGeometry);
-	SurfaceOnRelatingElement : IfcSurfaceOrFaceSurface;
-	SurfaceOnRelatedElement : OPTIONAL IfcSurfaceOrFaceSurface;
-END_ENTITY;
-
-ENTITY IfcConnectionVolumeGeometry
- SUBTYPE OF (IfcConnectionGeometry);
-	VolumeOnRelatingElement : IfcSolidOrShell;
-	VolumeOnRelatedElement : OPTIONAL IfcSolidOrShell;
-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 IfcDateTime;
-	UserDefinedGrade : OPTIONAL IfcLabel;
- INVERSE
-	HasExternalReferences : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-	PropertiesForConstraint : SET [0:?] OF IfcResourceConstraintRelationship FOR RelatingConstraint;
- WHERE
-	WR11 : (ConstraintGrade <> IfcConstraintEnum.USERDEFINED) OR
-((ConstraintGrade = IfcConstraintEnum.USERDEFINED) AND EXISTS(SELF\IfcConstraint.UserDefinedGrade));
-END_ENTITY;
-
-ENTITY IfcConstructionEquipmentResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcConstructionEquipmentResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcConstructionEquipmentResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcConstructionEquipmentResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-END_ENTITY;
-
-ENTITY IfcConstructionMaterialResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcConstructionMaterialResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcConstructionMaterialResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcConstructionMaterialResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcConstructionMaterialResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcConstructionMaterialResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcConstructionMaterialResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcConstructionMaterialResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-END_ENTITY;
-
-ENTITY IfcConstructionProductResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcConstructionProductResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcConstructionProductResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcConstructionProductResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcConstructionProductResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcConstructionProductResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcConstructionProductResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcConstructionProductResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-END_ENTITY;
-
-ENTITY IfcConstructionResource
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcConstructionEquipmentResource
-    ,IfcConstructionMaterialResource
-    ,IfcConstructionProductResource
-    ,IfcCrewResource
-    ,IfcLaborResource
-    ,IfcSubContractResource))
- SUBTYPE OF (IfcResource);
-	Usage : OPTIONAL IfcResourceTime;
-	BaseCosts : OPTIONAL LIST [1:?] OF IfcAppliedValue;
-	BaseQuantity : OPTIONAL IfcPhysicalQuantity;
-END_ENTITY;
-
-ENTITY IfcConstructionResourceType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcConstructionEquipmentResourceType
-    ,IfcConstructionMaterialResourceType
-    ,IfcConstructionProductResourceType
-    ,IfcCrewResourceType
-    ,IfcLaborResourceType
-    ,IfcSubContractResourceType))
- SUBTYPE OF (IfcTypeResource);
-	BaseCosts : OPTIONAL LIST [1:?] OF IfcAppliedValue;
-	BaseQuantity : OPTIONAL IfcPhysicalQuantity;
-END_ENTITY;
-
-ENTITY IfcContext
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcProject
-    ,IfcProjectLibrary))
- SUBTYPE OF (IfcObjectDefinition);
-	ObjectType : OPTIONAL IfcLabel;
-	LongName : OPTIONAL IfcLabel;
-	Phase : OPTIONAL IfcLabel;
-	RepresentationContexts : OPTIONAL SET [1:?] OF IfcRepresentationContext;
-	UnitsInContext : OPTIONAL IfcUnitAssignment;
- INVERSE
-	IsDefinedBy : SET [0:?] OF IfcRelDefinesByProperties FOR RelatedObjects;
-	Declares : SET [0:?] OF IfcRelDeclares FOR RelatingContext;
-END_ENTITY;
-
-ENTITY IfcContextDependentUnit
- SUBTYPE OF (IfcNamedUnit);
-	Name : IfcLabel;
- INVERSE
-	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-END_ENTITY;
-
-ENTITY IfcControl
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcActionRequest
-    ,IfcCostItem
-    ,IfcCostSchedule
-    ,IfcPerformanceHistory
-    ,IfcPermit
-    ,IfcProjectOrder
-    ,IfcWorkCalendar
-    ,IfcWorkControl))
- SUBTYPE OF (IfcObject);
-	Identification : OPTIONAL IfcIdentifier;
- INVERSE
-	Controls : SET [0:?] OF IfcRelAssignsToControl FOR RelatingControl;
-END_ENTITY;
-
-ENTITY IfcController
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcControllerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcControllerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcControllerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCCONTROLLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcControllerType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcControllerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcControllerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcControllerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcConversionBasedUnit
- SUPERTYPE OF (ONEOF
-    (IfcConversionBasedUnitWithOffset))
- SUBTYPE OF (IfcNamedUnit);
-	Name : IfcLabel;
-	ConversionFactor : IfcMeasureWithUnit;
- INVERSE
-	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-END_ENTITY;
-
-ENTITY IfcConversionBasedUnitWithOffset
- SUBTYPE OF (IfcConversionBasedUnit);
-	ConversionOffset : IfcReal;
-END_ENTITY;
-
-ENTITY IfcCooledBeam
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcCooledBeamTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCooledBeamTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCooledBeamTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCOOLEDBEAMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCooledBeamType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcCooledBeamTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCooledBeamTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCooledBeamTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCoolingTower
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcCoolingTowerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCoolingTowerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCoolingTowerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCCOOLINGTOWERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCoolingTowerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcCoolingTowerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCoolingTowerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCoolingTowerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCoordinateOperation
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcMapConversion));
-	SourceCRS : IfcCoordinateReferenceSystemSelect;
-	TargetCRS : IfcCoordinateReferenceSystem;
-END_ENTITY;
-
-ENTITY IfcCoordinateReferenceSystem
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcProjectedCRS));
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	GeodeticDatum : OPTIONAL IfcIdentifier;
-	VerticalDatum : OPTIONAL IfcIdentifier;
- INVERSE
-	HasCoordinateOperation : SET [0:1] OF IfcCoordinateOperation FOR SourceCRS;
-END_ENTITY;
-
-ENTITY IfcCostItem
- SUBTYPE OF (IfcControl);
-	PredefinedType : OPTIONAL IfcCostItemTypeEnum;
-	CostValues : OPTIONAL LIST [1:?] OF IfcCostValue;
-	CostQuantities : OPTIONAL LIST [1:?] OF IfcPhysicalQuantity;
-END_ENTITY;
-
-ENTITY IfcCostSchedule
- SUBTYPE OF (IfcControl);
-	PredefinedType : OPTIONAL IfcCostScheduleTypeEnum;
-	Status : OPTIONAL IfcLabel;
-	SubmittedOn : OPTIONAL IfcDateTime;
-	UpdateDate : OPTIONAL IfcDateTime;
-END_ENTITY;
-
-ENTITY IfcCostValue
- SUBTYPE OF (IfcAppliedValue);
-END_ENTITY;
-
-ENTITY IfcCovering
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcCoveringTypeEnum;
- INVERSE
-	CoversSpaces : SET [0:1] OF IfcRelCoversSpaces FOR RelatedCoverings;
-	CoversElements : SET [0:1] OF IfcRelCoversBldgElements FOR RelatedCoverings;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCoveringTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCoveringTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCCOVERINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCoveringType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcCoveringTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCoveringTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCoveringTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCrewResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcCrewResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcCrewResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcCrewResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcCrewResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcCrewResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCrewResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCrewResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-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
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingMonetaryUnit : IfcMonetaryUnit;
-	RelatedMonetaryUnit : IfcMonetaryUnit;
-	ExchangeRate : IfcPositiveRatioMeasure;
-	RateDateTime : OPTIONAL IfcDateTime;
-	RateSource : OPTIONAL IfcLibraryInformation;
-END_ENTITY;
-
-ENTITY IfcCurtainWall
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcCurtainWallTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcCurtainWallTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcCurtainWallTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCCURTAINWALLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcCurtainWallType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcCurtainWallTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcCurtainWallTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcCurtainWallTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcCurve
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBoundedCurve
-    ,IfcConic
-    ,IfcLine
-    ,IfcOffsetCurve2D
-    ,IfcOffsetCurve3D
-    ,IfcPcurve
-    ,IfcSurfaceCurve))
- SUBTYPE OF (IfcGeometricRepresentationItem);
- DERIVE
-	Dim : IfcDimensionCount := IfcCurveDim(SELF);
-END_ENTITY;
-
-ENTITY IfcCurveBoundedPlane
- SUBTYPE OF (IfcBoundedSurface);
-	BasisSurface : IfcPlane;
-	OuterBoundary : IfcCurve;
-	InnerBoundaries : SET [0:?] OF IfcCurve;
-END_ENTITY;
-
-ENTITY IfcCurveBoundedSurface
- SUBTYPE OF (IfcBoundedSurface);
-	BasisSurface : IfcSurface;
-	Boundaries : SET [1:?] OF IfcBoundaryCurve;
-	ImplicitOuter : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcCurveStyle
- SUBTYPE OF (IfcPresentationStyle);
-	CurveFont : OPTIONAL IfcCurveFontOrScaledCurveFontSelect;
-	CurveWidth : OPTIONAL IfcSizeSelect;
-	CurveColour : OPTIONAL IfcColour;
-	ModelOrDraughting : OPTIONAL IfcBoolean;
- WHERE
-	MeasureOfWidth : (NOT(EXISTS(CurveWidth))) OR
-('IFC4.IFCPOSITIVELENGTHMEASURE' IN TYPEOF(CurveWidth)) OR 
- (('IFC4.IFCDESCRIPTIVEMEASURE' IN TYPEOF(CurveWidth)) AND
- (CurveWidth = 'by layer'));
-	IdentifiableCurveStyle : EXISTS(CurveFont) OR EXISTS(CurveWidth) OR EXISTS(CurveColour);
-END_ENTITY;
-
-ENTITY IfcCurveStyleFont
- SUBTYPE OF (IfcPresentationItem);
-	Name : OPTIONAL IfcLabel;
-	PatternList : LIST [1:?] OF IfcCurveStyleFontPattern;
-END_ENTITY;
-
-ENTITY IfcCurveStyleFontAndScaling
- SUBTYPE OF (IfcPresentationItem);
-	Name : OPTIONAL IfcLabel;
-	CurveFont : IfcCurveStyleFontSelect;
-	CurveFontScaling : IfcPositiveRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcCurveStyleFontPattern
- SUBTYPE OF (IfcPresentationItem);
-	VisibleSegmentLength : IfcLengthMeasure;
-	InvisibleSegmentLength : IfcPositiveLengthMeasure;
- WHERE
-	VisibleLengthGreaterEqualZero : VisibleSegmentLength >= 0.;
-END_ENTITY;
-
-ENTITY IfcCylindricalSurface
- SUBTYPE OF (IfcElementarySurface);
-	Radius : IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcDamper
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcDamperTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcDamperTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcDamperTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCDAMPERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDamperType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcDamperTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDamperTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDamperTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDerivedProfileDef
- SUPERTYPE OF (ONEOF
-    (IfcMirroredProfileDef))
- SUBTYPE OF (IfcProfileDef);
-	ParentProfile : IfcProfileDef;
-	Operator : IfcCartesianTransformationOperator2D;
-	Label : OPTIONAL IfcLabel;
- WHERE
-	InvariantProfileType : SELF\IfcProfileDef.ProfileType = ParentProfile.ProfileType;
-END_ENTITY;
-
-ENTITY IfcDerivedUnit;
-	Elements : SET [1:?] OF IfcDerivedUnitElement;
-	UnitType : IfcDerivedUnitEnum;
-	UserDefinedType : OPTIONAL IfcLabel;
- DERIVE
-	Dimensions : IfcDimensionalExponents := IfcDeriveDimensionalExponents(Elements);
- 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 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 IfcReal;
- DERIVE
-	Dim : IfcDimensionCount := HIINDEX(DirectionRatios);
- WHERE
-	MagnitudeGreaterZero : SIZEOF(QUERY(Tmp <* DirectionRatios | Tmp <> 0.0)) > 0;
-END_ENTITY;
-
-ENTITY IfcDiscreteAccessory
- SUBTYPE OF (IfcElementComponent);
-	PredefinedType : OPTIONAL IfcDiscreteAccessoryTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcDiscreteAccessoryTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDiscreteAccessoryTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCDISCRETEACCESSORYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDiscreteAccessoryType
- SUBTYPE OF (IfcElementComponentType);
-	PredefinedType : IfcDiscreteAccessoryTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDiscreteAccessoryTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDiscreteAccessoryTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDistributionChamberElement
- SUBTYPE OF (IfcDistributionFlowElement);
-	PredefinedType : OPTIONAL IfcDistributionChamberElementTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcDistributionChamberElementTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcDistributionChamberElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCDISTRIBUTIONCHAMBERELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDistributionChamberElementType
- SUBTYPE OF (IfcDistributionFlowElementType);
-	PredefinedType : IfcDistributionChamberElementTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDistributionChamberElementTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDistributionChamberElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDistributionCircuit
- SUBTYPE OF (IfcDistributionSystem);
-END_ENTITY;
-
-ENTITY IfcDistributionControlElement
- SUPERTYPE OF (ONEOF
-    (IfcActuator
-    ,IfcAlarm
-    ,IfcController
-    ,IfcFlowInstrument
-    ,IfcProtectiveDeviceTrippingUnit
-    ,IfcSensor
-    ,IfcUnitaryControlElement))
- SUBTYPE OF (IfcDistributionElement);
- INVERSE
-	AssignedToFlowElement : SET [0:1] OF IfcRelFlowControlElements FOR RelatedControlElements;
-END_ENTITY;
-
-ENTITY IfcDistributionControlElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcActuatorType
-    ,IfcAlarmType
-    ,IfcControllerType
-    ,IfcFlowInstrumentType
-    ,IfcProtectiveDeviceTrippingUnitType
-    ,IfcSensorType
-    ,IfcUnitaryControlElementType))
- SUBTYPE OF (IfcDistributionElementType);
-END_ENTITY;
-
-ENTITY IfcDistributionElement
- SUPERTYPE OF (ONEOF
-    (IfcDistributionControlElement
-    ,IfcDistributionFlowElement))
- SUBTYPE OF (IfcElement);
- INVERSE
-	HasPorts : SET [0:?] OF IfcRelConnectsPortToElement FOR RelatedElement;
-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;
-	PredefinedType : OPTIONAL IfcDistributionPortTypeEnum;
-	SystemType : OPTIONAL IfcDistributionSystemEnum;
-END_ENTITY;
-
-ENTITY IfcDistributionSystem
- SUPERTYPE OF (ONEOF
-    (IfcDistributionCircuit))
- SUBTYPE OF (IfcSystem);
-	LongName : OPTIONAL IfcLabel;
-	PredefinedType : OPTIONAL IfcDistributionSystemEnum;
-END_ENTITY;
-
-ENTITY IfcDocumentInformation
- SUBTYPE OF (IfcExternalInformation);
-	Identification : IfcIdentifier;
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	Location : OPTIONAL IfcURIReference;
-	Purpose : OPTIONAL IfcText;
-	IntendedUse : OPTIONAL IfcText;
-	Scope : OPTIONAL IfcText;
-	Revision : OPTIONAL IfcLabel;
-	DocumentOwner : OPTIONAL IfcActorSelect;
-	Editors : OPTIONAL SET [1:?] OF IfcActorSelect;
-	CreationTime : OPTIONAL IfcDateTime;
-	LastRevisionTime : OPTIONAL IfcDateTime;
-	ElectronicFormat : OPTIONAL IfcIdentifier;
-	ValidFrom : OPTIONAL IfcDate;
-	ValidUntil : OPTIONAL IfcDate;
-	Confidentiality : OPTIONAL IfcDocumentConfidentialityEnum;
-	Status : OPTIONAL IfcDocumentStatusEnum;
- INVERSE
-	DocumentInfoForObjects : SET [0:?] OF IfcRelAssociatesDocument FOR RelatingDocument;
-	HasDocumentReferences : SET [0:?] OF IfcDocumentReference FOR ReferencedDocument;
-	IsPointedTo : SET [0:?] OF IfcDocumentInformationRelationship FOR RelatedDocuments;
-	IsPointer : SET [0:1] OF IfcDocumentInformationRelationship FOR RelatingDocument;
-END_ENTITY;
-
-ENTITY IfcDocumentInformationRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingDocument : IfcDocumentInformation;
-	RelatedDocuments : SET [1:?] OF IfcDocumentInformation;
-	RelationshipType : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcDocumentReference
- SUBTYPE OF (IfcExternalReference);
-	Description : OPTIONAL IfcText;
-	ReferencedDocument : OPTIONAL IfcDocumentInformation;
- INVERSE
-	DocumentRefForObjects : SET [0:?] OF IfcRelAssociatesDocument FOR RelatingDocument;
- WHERE
-	WR1 : EXISTS(Name) XOR EXISTS(ReferencedDocument);
-END_ENTITY;
-
-ENTITY IfcDoor
- SUPERTYPE OF (ONEOF
-    (IfcDoorStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
-	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcDoorTypeEnum;
-	OperationType : OPTIONAL IfcDoorTypeOperationEnum;
-	UserDefinedOperationType : OPTIONAL IfcLabel;
- WHERE
-	CorrectStyleAssigned : (SIZEOF(IsTypedBy) = 0) 
-OR ('IFC4.IFCDOORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDoorLiningProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
-	LiningThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	ThresholdDepth : OPTIONAL IfcPositiveLengthMeasure;
-	ThresholdThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	TransomThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	TransomOffset : OPTIONAL IfcLengthMeasure;
-	LiningOffset : OPTIONAL IfcLengthMeasure;
-	ThresholdOffset : OPTIONAL IfcLengthMeasure;
-	CasingThickness : OPTIONAL IfcPositiveLengthMeasure;
-	CasingDepth : OPTIONAL IfcPositiveLengthMeasure;
-	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
-	LiningToPanelOffsetX : OPTIONAL IfcLengthMeasure;
-	LiningToPanelOffsetY : OPTIONAL IfcLengthMeasure;
- WHERE
-	WR31 : NOT(EXISTS(LiningDepth) AND NOT(EXISTS(LiningThickness)));
-	WR32 : NOT(EXISTS(ThresholdDepth) AND NOT(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 
-(
- ('IFC4.IFCDOORTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-  OR
- ('IFC4.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-);
-END_ENTITY;
-
-ENTITY IfcDoorPanelProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	PanelDepth : OPTIONAL IfcPositiveLengthMeasure;
-	PanelOperation : IfcDoorPanelOperationEnum;
-	PanelWidth : OPTIONAL IfcNormalisedRatioMeasure;
-	PanelPosition : IfcDoorPanelPositionEnum;
-	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
- WHERE
-	ApplicableToType : (EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1])) 
-AND 
-(
- ('IFC4.IFCDOORTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-  OR
- ('IFC4.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-);
-END_ENTITY;
-
-ENTITY IfcDoorStandardCase
- SUBTYPE OF (IfcDoor);
-END_ENTITY;
-
-ENTITY IfcDoorStyle
- SUBTYPE OF (IfcTypeProduct);
-	OperationType : IfcDoorStyleOperationEnum;
-	ConstructionType : IfcDoorStyleConstructionEnum;
-	ParameterTakesPrecedence : IfcBoolean;
-	Sizeable : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcDoorType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcDoorTypeEnum;
-	OperationType : IfcDoorTypeOperationEnum;
-	ParameterTakesPrecedence : OPTIONAL IfcBoolean;
-	UserDefinedOperationType : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDoorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDoorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDraughtingPreDefinedColour
- SUBTYPE OF (IfcPreDefinedColour);
- WHERE
-	PreDefinedColourNames : SELF\IfcPreDefinedItem.Name IN ['black','red','green','blue','yellow',
-     'magenta','cyan','white','by layer'];
-END_ENTITY;
-
-ENTITY IfcDraughtingPreDefinedCurveFont
- SUBTYPE OF (IfcPreDefinedCurveFont);
- WHERE
-	PreDefinedCurveFontNames : SELF\IfcPredefinedItem.Name IN
-       ['continuous',
-        'chain',
-        'chain double dash',
-        'dashed',
-        'dotted',
-        'by layer'];
-END_ENTITY;
-
-ENTITY IfcDuctFitting
- SUBTYPE OF (IfcFlowFitting);
-	PredefinedType : OPTIONAL IfcDuctFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcDuctFittingTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcDuctFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCDUCTFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDuctFittingType
- SUBTYPE OF (IfcFlowFittingType);
-	PredefinedType : IfcDuctFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDuctFittingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDuctFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDuctSegment
- SUBTYPE OF (IfcFlowSegment);
-	PredefinedType : OPTIONAL IfcDuctSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcDuctSegmentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcDuctSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCDUCTSEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDuctSegmentType
- SUBTYPE OF (IfcFlowSegmentType);
-	PredefinedType : IfcDuctSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcDuctSegmentTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcDuctSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcDuctSilencer
- SUBTYPE OF (IfcFlowTreatmentDevice);
-	PredefinedType : OPTIONAL IfcDuctSilencerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcDuctSilencerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcDuctSilencerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCDUCTSILENCERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcDuctSilencerType
- SUBTYPE OF (IfcFlowTreatmentDeviceType);
-	PredefinedType : IfcDuctSilencerTypeEnum;
- WHERE
-	CorrectPredefinedType : (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 : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcEdgeLoop
- SUBTYPE OF (IfcLoop);
-	EdgeList : LIST [1:?] OF IfcOrientedEdge;
- DERIVE
-	Ne : IfcInteger := SIZEOF(EdgeList);
- WHERE
-	IsClosed : (EdgeList[1].EdgeStart) :=: (EdgeList[Ne].EdgeEnd);
-	IsContinuous : IfcLoopHeadToTail(SELF);
-END_ENTITY;
-
-ENTITY IfcElectricAppliance
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcElectricApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricApplianceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricApplianceType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcElectricApplianceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricApplianceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElectricDistributionBoard
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcElectricDistributionBoardTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricDistributionBoardTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricDistributionBoardTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICDISTRIBUTIONBOARDTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricDistributionBoardType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcElectricDistributionBoardTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricDistributionBoardTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricDistributionBoardTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElectricFlowStorageDevice
- SUBTYPE OF (IfcFlowStorageDevice);
-	PredefinedType : OPTIONAL IfcElectricFlowStorageDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICFLOWSTORAGEDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricFlowStorageDeviceType
- SUBTYPE OF (IfcFlowStorageDeviceType);
-	PredefinedType : IfcElectricFlowStorageDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElectricGenerator
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcElectricGeneratorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricGeneratorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricGeneratorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICGENERATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricGeneratorType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcElectricGeneratorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricGeneratorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricGeneratorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElectricMotor
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcElectricMotorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricMotorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricMotorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICMOTORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricMotorType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcElectricMotorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricMotorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricMotorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElectricTimeControl
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcElectricTimeControlTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcElectricTimeControlTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcElectricTimeControlTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCELECTRICTIMECONTROLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElectricTimeControlType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcElectricTimeControlTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElectricTimeControlTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcElectricTimeControlTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBuildingElement
-    ,IfcCivilElement
-    ,IfcDistributionElement
-    ,IfcElementAssembly
-    ,IfcElementComponent
-    ,IfcFeatureElement
-    ,IfcFurnishingElement
-    ,IfcGeographicElement
-    ,IfcTransportElement
-    ,IfcVirtualElement))
- SUBTYPE OF (IfcProduct);
-	Tag : OPTIONAL IfcIdentifier;
- INVERSE
-	FillsVoids : SET [0:1] OF IfcRelFillsElement FOR RelatedBuildingElement;
-	ConnectedTo : SET [0:?] OF IfcRelConnectsElements FOR RelatingElement;
-	IsInterferedByElements : SET [0:?] OF IfcRelInterferesElements FOR RelatedElement;
-	InterferesElements : SET [0:?] OF IfcRelInterferesElements FOR RelatingElement;
-	HasProjections : SET [0:?] OF IfcRelProjectsElement FOR RelatingElement;
-	ReferencedInStructures : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatedElements;
-	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;
-	HasCoverings : SET [0:?] OF IfcRelCoversBldgElements FOR RelatingBuildingElement;
-END_ENTITY;
-
-ENTITY IfcElementAssembly
- SUBTYPE OF (IfcElement);
-	AssemblyPlace : OPTIONAL IfcAssemblyPlaceEnum;
-	PredefinedType : OPTIONAL IfcElementAssemblyTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCELEMENTASSEMBLYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcElementAssemblyType
- SUBTYPE OF (IfcElementType);
-	PredefinedType : IfcElementAssemblyTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR 
-((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcElementComponent
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBuildingElementPart
-    ,IfcDiscreteAccessory
-    ,IfcFastener
-    ,IfcMechanicalFastener
-    ,IfcReinforcingElement
-    ,IfcVibrationIsolator))
- SUBTYPE OF (IfcElement);
-END_ENTITY;
-
-ENTITY IfcElementComponentType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBuildingElementPartType
-    ,IfcDiscreteAccessoryType
-    ,IfcFastenerType
-    ,IfcMechanicalFastenerType
-    ,IfcReinforcingElementType
-    ,IfcVibrationIsolatorType))
- SUBTYPE OF (IfcElementType);
-END_ENTITY;
-
-ENTITY IfcElementQuantity
- SUBTYPE OF (IfcQuantitySet);
-	MethodOfMeasurement : OPTIONAL IfcLabel;
-	Quantities : SET [1:?] OF IfcPhysicalQuantity;
- WHERE
-	UniqueQuantityNames : IfcUniqueQuantityNames(Quantities);
-END_ENTITY;
-
-ENTITY IfcElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBuildingElementType
-    ,IfcCivilElementType
-    ,IfcDistributionElementType
-    ,IfcElementAssemblyType
-    ,IfcElementComponentType
-    ,IfcFurnishingElementType
-    ,IfcGeographicElementType
-    ,IfcTransportElementType))
- SUBTYPE OF (IfcTypeProduct);
-	ElementType : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcElementarySurface
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCylindricalSurface
-    ,IfcPlane
-    ,IfcSphericalSurface
-    ,IfcToroidalSurface))
- SUBTYPE OF (IfcSurface);
-	Position : IfcAxis2Placement3D;
-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
- SUPERTYPE OF (ONEOF
-    (IfcAirToAirHeatRecovery
-    ,IfcBoiler
-    ,IfcBurner
-    ,IfcChiller
-    ,IfcCoil
-    ,IfcCondenser
-    ,IfcCooledBeam
-    ,IfcCoolingTower
-    ,IfcElectricGenerator
-    ,IfcElectricMotor
-    ,IfcEngine
-    ,IfcEvaporativeCooler
-    ,IfcEvaporator
-    ,IfcHeatExchanger
-    ,IfcHumidifier
-    ,IfcMotorConnection
-    ,IfcSolarDevice
-    ,IfcTransformer
-    ,IfcTubeBundle
-    ,IfcUnitaryEquipment))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcEnergyConversionDeviceType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAirToAirHeatRecoveryType
-    ,IfcBoilerType
-    ,IfcBurnerType
-    ,IfcChillerType
-    ,IfcCoilType
-    ,IfcCondenserType
-    ,IfcCooledBeamType
-    ,IfcCoolingTowerType
-    ,IfcElectricGeneratorType
-    ,IfcElectricMotorType
-    ,IfcEngineType
-    ,IfcEvaporativeCoolerType
-    ,IfcEvaporatorType
-    ,IfcHeatExchangerType
-    ,IfcHumidifierType
-    ,IfcMotorConnectionType
-    ,IfcSolarDeviceType
-    ,IfcTransformerType
-    ,IfcTubeBundleType
-    ,IfcUnitaryEquipmentType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcEngine
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcEngineTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcEngineTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcEngineTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCENGINETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcEngineType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcEngineTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcEngineTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcEngineTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcEvaporativeCooler
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcEvaporativeCoolerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcEvaporativeCoolerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcEvaporativeCoolerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCEVAPORATIVECOOLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcEvaporativeCoolerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcEvaporativeCoolerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcEvaporativeCoolerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcEvaporativeCoolerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcEvaporator
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcEvaporatorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcEvaporatorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcEvaporatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCEVAPORATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcEvaporatorType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcEvaporatorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcEvaporatorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcEvaporatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcEvent
- SUBTYPE OF (IfcProcess);
-	PredefinedType : OPTIONAL IfcEventTypeEnum;
-	EventTriggerType : OPTIONAL IfcEventTriggerTypeEnum;
-	UserDefinedEventTriggerType : OPTIONAL IfcLabel;
-	EventOccurenceTime : OPTIONAL IfcEventTime;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcEventTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEventTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : NOT(EXISTS(EventTriggerType)) OR (EventTriggerType <> IfcEventTriggerTypeEnum.USERDEFINED) OR ((EventTriggerType = IfcEventTriggerTypeEnum.USERDEFINED) AND EXISTS(UserDefinedEventTriggerType));
-END_ENTITY;
-
-ENTITY IfcEventTime
- SUBTYPE OF (IfcSchedulingTime);
-	ActualDate : OPTIONAL IfcDateTime;
-	EarlyDate : OPTIONAL IfcDateTime;
-	LateDate : OPTIONAL IfcDateTime;
-	ScheduleDate : OPTIONAL IfcDateTime;
-END_ENTITY;
-
-ENTITY IfcEventType
- SUBTYPE OF (IfcTypeProcess);
-	PredefinedType : IfcEventTypeEnum;
-	EventTriggerType : IfcEventTriggerTypeEnum;
-	UserDefinedEventTriggerType : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcEventTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEventTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType));
-	CorrectEventTriggerType : (EventTriggerType <> IfcEventTriggerTypeEnum.USERDEFINED) OR ((EventTriggerType = IfcEventTriggerTypeEnum.USERDEFINED) AND EXISTS(UserDefinedEventTriggerType));
-END_ENTITY;
-
-ENTITY IfcExtendedProperties
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcMaterialProperties
-    ,IfcProfileProperties))
- SUBTYPE OF (IfcPropertyAbstraction);
-	Name : OPTIONAL IfcIdentifier;
-	Description : OPTIONAL IfcText;
-	Properties : SET [1:?] OF IfcProperty;
-END_ENTITY;
-
-ENTITY IfcExternalInformation
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcClassification
-    ,IfcDocumentInformation
-    ,IfcLibraryInformation));
-END_ENTITY;
-
-ENTITY IfcExternalReference
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcClassificationReference
-    ,IfcDocumentReference
-    ,IfcExternallyDefinedHatchStyle
-    ,IfcExternallyDefinedSurfaceStyle
-    ,IfcExternallyDefinedTextFont
-    ,IfcLibraryReference));
-	Location : OPTIONAL IfcURIReference;
-	Identification : OPTIONAL IfcIdentifier;
-	Name : OPTIONAL IfcLabel;
- INVERSE
-	ExternalReferenceForResources : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatingReference;
- WHERE
-	WR1 : EXISTS(Identification) OR EXISTS(Location) OR EXISTS(Name);
-END_ENTITY;
-
-ENTITY IfcExternalReferenceRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingReference : IfcExternalReference;
-	RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
-END_ENTITY;
-
-ENTITY IfcExternalSpatialElement
- SUBTYPE OF (IfcExternalSpatialStructureElement);
-	PredefinedType : OPTIONAL IfcExternalSpatialElementTypeEnum;
- INVERSE
-	BoundedBy : SET [0:?] OF IfcRelSpaceBoundary FOR RelatingSpace;
-END_ENTITY;
-
-ENTITY IfcExternalSpatialStructureElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcExternalSpatialElement))
- SUBTYPE OF (IfcSpatialElement);
-END_ENTITY;
-
-ENTITY IfcExternallyDefinedHatchStyle
- SUBTYPE OF (IfcExternalReference);
-END_ENTITY;
-
-ENTITY IfcExternallyDefinedSurfaceStyle
- SUBTYPE OF (IfcExternalReference);
-END_ENTITY;
-
-ENTITY IfcExternallyDefinedTextFont
- SUBTYPE OF (IfcExternalReference);
-END_ENTITY;
-
-ENTITY IfcExtrudedAreaSolid
- SUPERTYPE OF (ONEOF
-    (IfcExtrudedAreaSolidTapered))
- SUBTYPE OF (IfcSweptAreaSolid);
-	ExtrudedDirection : IfcDirection;
-	Depth : IfcPositiveLengthMeasure;
- WHERE
-	ValidExtrusionDirection : IfcDotProduct(IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcDirection([0.0,0.0,1.0]), SELF.ExtrudedDirection) <> 0.0;
-END_ENTITY;
-
-ENTITY IfcExtrudedAreaSolidTapered
- SUBTYPE OF (IfcExtrudedAreaSolid);
-	EndSweptArea : IfcProfileDef;
- WHERE
-	CorrectProfileAssignment : IfcTaperedSweptAreaProfiles(SELF\IfcSweptAreaSolid.SweptArea, SELF.EndSweptArea);
-END_ENTITY;
-
-ENTITY IfcFace
- SUPERTYPE OF (ONEOF
-    (IfcFaceSurface))
- SUBTYPE OF (IfcTopologicalRepresentationItem);
-	Bounds : SET [1:?] OF IfcFaceBound;
- INVERSE
-	HasTextureMaps : SET [0:?] OF IfcTextureMap FOR MappedTo;
- WHERE
-	HasOuterBound : SIZEOF(QUERY(temp <* Bounds | 'IFC4.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 : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcFaceOuterBound
- SUBTYPE OF (IfcFaceBound);
-END_ENTITY;
-
-ENTITY IfcFaceSurface
- SUPERTYPE OF (ONEOF
-    (IfcAdvancedFace))
- SUBTYPE OF (IfcFace);
-	FaceSurface : IfcSurface;
-	SameSense : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcFacetedBrep
- SUPERTYPE OF (ONEOF
-    (IfcFacetedBrepWithVoids))
- SUBTYPE OF (IfcManifoldSolidBrep);
-END_ENTITY;
-
-ENTITY IfcFacetedBrepWithVoids
- SUBTYPE OF (IfcFacetedBrep);
-	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 IfcFan
- SUBTYPE OF (IfcFlowMovingDevice);
-	PredefinedType : OPTIONAL IfcFanTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFanTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFanTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCFANTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFanType
- SUBTYPE OF (IfcFlowMovingDeviceType);
-	PredefinedType : IfcFanTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFanTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFanTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFastener
- SUBTYPE OF (IfcElementComponent);
-	PredefinedType : OPTIONAL IfcFastenerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcFastenerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFastenerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCFASTENERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFastenerType
- SUBTYPE OF (IfcElementComponentType);
-	PredefinedType : IfcFastenerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFastenerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFastenerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFeatureElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcFeatureElementAddition
-    ,IfcFeatureElementSubtraction
-    ,IfcSurfaceFeature))
- 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
-    (IfcOpeningElement
-    ,IfcVoidingFeature))
- SUBTYPE OF (IfcFeatureElement);
- INVERSE
-	VoidsElements : IfcRelVoidsElement FOR RelatedOpeningElement;
- WHERE
-	HasNoSubtraction : SIZEOF(SELF\IfcElement.HasOpenings) = 0;
-	IsNotFilling : SIZEOF(SELF\IfcElement.FillsVoids) = 0;
-END_ENTITY;
-
-ENTITY IfcFillAreaStyle
- SUBTYPE OF (IfcPresentationStyle);
-	FillStyles : SET [1:?] OF IfcFillStyleSelect;
-	ModelorDraughting : OPTIONAL IfcBoolean;
- WHERE
-	MaxOneColour : SIZEOF(QUERY(Style <* SELF.FillStyles |
-  'IFC4.IFCCOLOUR' IN
-   TYPEOF(Style)
-  )) <= 1;
-	MaxOneExtHatchStyle : SIZEOF(QUERY(Style <* SELF.FillStyles |
-  'IFC4.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
-   TYPEOF(Style)
-  )) <= 1;
-	ConsistentHatchStyleDef : IfcCorrectFillAreaStyle(SELF.FillStyles);
-END_ENTITY;
-
-ENTITY IfcFillAreaStyleHatching
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	HatchLineAppearance : IfcCurveStyle;
-	StartOfNextHatchLine : IfcHatchLineDistanceSelect;
-	PointOfReferenceHatchLine : OPTIONAL IfcCartesianPoint;
-	PatternStart : OPTIONAL IfcCartesianPoint;
-	HatchLineAngle : IfcPlaneAngleMeasure;
- WHERE
-	PatternStart2D : NOT(EXISTS(PatternStart)) OR (PatternStart.Dim = 2);
-	RefHatchLine2D : NOT(EXISTS(PointOfReferenceHatchLine)) OR (PointOfReferenceHatchLine.Dim = 2);
-END_ENTITY;
-
-ENTITY IfcFillAreaStyleTiles
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	TilingPattern : LIST [2:2] OF IfcVector;
-	Tiles : SET [1:?] OF IfcStyledItem;
-	TilingScale : IfcPositiveRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcFilter
- SUBTYPE OF (IfcFlowTreatmentDevice);
-	PredefinedType : OPTIONAL IfcFilterTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFilterTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFilterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCFILTERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFilterType
- SUBTYPE OF (IfcFlowTreatmentDeviceType);
-	PredefinedType : IfcFilterTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFilterTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFilterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFireSuppressionTerminal
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcFireSuppressionTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFireSuppressionTerminalTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFireSuppressionTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCFIRESUPPRESSIONTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFireSuppressionTerminalType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcFireSuppressionTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFireSuppressionTerminalTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFireSuppressionTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFixedReferenceSweptAreaSolid
- SUBTYPE OF (IfcSweptAreaSolid);
-	Directrix : IfcCurve;
-	StartParam : OPTIONAL IfcParameterValue;
-	EndParam : OPTIONAL IfcParameterValue;
-	FixedReference : IfcDirection;
- WHERE
-	DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR 
-(SIZEOF(['IFC4.IFCCONIC', 'IFC4.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
-END_ENTITY;
-
-ENTITY IfcFlowController
- SUPERTYPE OF (ONEOF
-    (IfcAirTerminalBox
-    ,IfcDamper
-    ,IfcElectricDistributionBoard
-    ,IfcElectricTimeControl
-    ,IfcFlowMeter
-    ,IfcProtectiveDevice
-    ,IfcSwitchingDevice
-    ,IfcValve))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowControllerType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAirTerminalBoxType
-    ,IfcDamperType
-    ,IfcElectricDistributionBoardType
-    ,IfcElectricTimeControlType
-    ,IfcFlowMeterType
-    ,IfcProtectiveDeviceType
-    ,IfcSwitchingDeviceType
-    ,IfcValveType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowFitting
- SUPERTYPE OF (ONEOF
-    (IfcCableCarrierFitting
-    ,IfcCableFitting
-    ,IfcDuctFitting
-    ,IfcJunctionBox
-    ,IfcPipeFitting))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowFittingType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCableCarrierFittingType
-    ,IfcCableFittingType
-    ,IfcDuctFittingType
-    ,IfcJunctionBoxType
-    ,IfcPipeFittingType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowInstrument
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcFlowInstrumentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFlowInstrumentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFlowInstrumentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCFLOWINSTRUMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFlowInstrumentType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcFlowInstrumentTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFlowInstrumentTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFlowInstrumentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFlowMeter
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcFlowMeterTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFlowMeterTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFlowMeterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCFLOWMETERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFlowMeterType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcFlowMeterTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFlowMeterTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFlowMeterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFlowMovingDevice
- SUPERTYPE OF (ONEOF
-    (IfcCompressor
-    ,IfcFan
-    ,IfcPump))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowMovingDeviceType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCompressorType
-    ,IfcFanType
-    ,IfcPumpType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowSegment
- SUPERTYPE OF (ONEOF
-    (IfcCableCarrierSegment
-    ,IfcCableSegment
-    ,IfcDuctSegment
-    ,IfcPipeSegment))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowSegmentType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCableCarrierSegmentType
-    ,IfcCableSegmentType
-    ,IfcDuctSegmentType
-    ,IfcPipeSegmentType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowStorageDevice
- SUPERTYPE OF (ONEOF
-    (IfcElectricFlowStorageDevice
-    ,IfcTank))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowStorageDeviceType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcElectricFlowStorageDeviceType
-    ,IfcTankType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowTerminal
- SUPERTYPE OF (ONEOF
-    (IfcAirTerminal
-    ,IfcAudioVisualAppliance
-    ,IfcCommunicationsAppliance
-    ,IfcElectricAppliance
-    ,IfcFireSuppressionTerminal
-    ,IfcLamp
-    ,IfcLightFixture
-    ,IfcMedicalDevice
-    ,IfcOutlet
-    ,IfcSanitaryTerminal
-    ,IfcSpaceHeater
-    ,IfcStackTerminal
-    ,IfcWasteTerminal))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowTerminalType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAirTerminalType
-    ,IfcAudioVisualApplianceType
-    ,IfcCommunicationsApplianceType
-    ,IfcElectricApplianceType
-    ,IfcFireSuppressionTerminalType
-    ,IfcLampType
-    ,IfcLightFixtureType
-    ,IfcMedicalDeviceType
-    ,IfcOutletType
-    ,IfcSanitaryTerminalType
-    ,IfcSpaceHeaterType
-    ,IfcStackTerminalType
-    ,IfcWasteTerminalType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFlowTreatmentDevice
- SUPERTYPE OF (ONEOF
-    (IfcDuctSilencer
-    ,IfcFilter
-    ,IfcInterceptor))
- SUBTYPE OF (IfcDistributionFlowElement);
-END_ENTITY;
-
-ENTITY IfcFlowTreatmentDeviceType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcDuctSilencerType
-    ,IfcFilterType
-    ,IfcInterceptorType))
- SUBTYPE OF (IfcDistributionFlowElementType);
-END_ENTITY;
-
-ENTITY IfcFooting
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcFootingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT EXISTS(PredefinedType) OR
-(PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCFOOTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFootingType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcFootingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcFurnishingElement
- SUPERTYPE OF (ONEOF
-    (IfcFurniture
-    ,IfcSystemFurnitureElement))
- SUBTYPE OF (IfcElement);
-END_ENTITY;
-
-ENTITY IfcFurnishingElementType
- SUPERTYPE OF (ONEOF
-    (IfcFurnitureType
-    ,IfcSystemFurnitureElementType))
- SUBTYPE OF (IfcElementType);
-END_ENTITY;
-
-ENTITY IfcFurniture
- SUBTYPE OF (IfcFurnishingElement);
-	PredefinedType : OPTIONAL IfcFurnitureTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcFurnitureTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcFurnitureTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-   ('IFC4.IFCFURNITURETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcFurnitureType
- SUBTYPE OF (IfcFurnishingElementType);
-	AssemblyPlace : IfcAssemblyPlaceEnum;
-	PredefinedType : OPTIONAL IfcFurnitureTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcFurnitureTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcFurnitureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcGeographicElement
- SUBTYPE OF (IfcElement);
-	PredefinedType : OPTIONAL IfcGeographicElementTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcGeographicElementTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcGeographicElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCGEOGRAPHICELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcGeographicElementType
- SUBTYPE OF (IfcElementType);
-	PredefinedType : IfcGeographicElementTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcGeographicElementTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcGeographicElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcGeometricCurveSet
- SUBTYPE OF (IfcGeometricSet);
- WHERE
-	NoSurfaces : SIZEOF(QUERY(Temp <* SELF\IfcGeometricSet.Elements |
-'IFC4.IFCSURFACE' IN TYPEOF(Temp))) = 0;
-END_ENTITY;
-
-ENTITY IfcGeometricRepresentationContext
- SUPERTYPE OF (ONEOF
-    (IfcGeometricRepresentationSubContext))
- SUBTYPE OF (IfcRepresentationContext);
-	CoordinateSpaceDimension : IfcDimensionCount;
-	Precision : OPTIONAL IfcReal;
-	WorldCoordinateSystem : IfcAxis2Placement;
-	TrueNorth : OPTIONAL IfcDirection;
- INVERSE
-	HasSubContexts : SET [0:?] OF IfcGeometricRepresentationSubContext FOR ParentContext;
-	HasCoordinateOperation : SET [0:1] OF IfcCoordinateOperation FOR SourceCRS;
- WHERE
-	North2D : NOT(EXISTS(TrueNorth)) OR (HIINDEX(TrueNorth.DirectionRatios) = 2);
-END_ENTITY;
-
-ENTITY IfcGeometricRepresentationItem
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAnnotationFillArea
-    ,IfcBooleanResult
-    ,IfcBoundingBox
-    ,IfcCartesianPointList
-    ,IfcCartesianTransformationOperator
-    ,IfcCompositeCurveSegment
-    ,IfcCsgPrimitive3D
-    ,IfcCurve
-    ,IfcDirection
-    ,IfcFaceBasedSurfaceModel
-    ,IfcFillAreaStyleHatching
-    ,IfcFillAreaStyleTiles
-    ,IfcGeometricSet
-    ,IfcHalfSpaceSolid
-    ,IfcLightSource
-    ,IfcPlacement
-    ,IfcPlanarExtent
-    ,IfcPoint
-    ,IfcSectionedSpine
-    ,IfcShellBasedSurfaceModel
-    ,IfcSolidModel
-    ,IfcSurface
-    ,IfcTessellatedItem
-    ,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, IfcConvertDirectionInto2D(SELF\IfcGeometricRepresentationContext.WorldCoordinateSystem.P[2]));
-	SELF\IfcGeometricRepresentationContext.Precision : IfcReal := NVL(ParentContext.Precision,1.E-5);
- WHERE
-	ParentNoSub : NOT('IFC4.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(ParentContext));
-	UserTargetProvided : (TargetView <> IfcGeometricProjectionEnum.USERDEFINED) OR 
-((TargetView =  IfcGeometricProjectionEnum.USERDEFINED) AND EXISTS(UserDefinedTargetView));
-	NoCoordOperation : SIZEOF(SELF\IfcGeometricRepresentationContext.HasCoordinateOperation) = 0;
-END_ENTITY;
-
-ENTITY IfcGeometricSet
- SUPERTYPE OF (ONEOF
-    (IfcGeometricCurveSet))
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	Elements : SET [1:?] OF IfcGeometricSetSelect;
- DERIVE
-	Dim : IfcDimensionCount := Elements[1].Dim;
- WHERE
-	ConsistentDim : 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;
-	PredefinedType : OPTIONAL IfcGridTypeEnum;
- INVERSE
-	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
- WHERE
-	HasPlacement : 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 IfcGridPlacementDirectionSelect;
-END_ENTITY;
-
-ENTITY IfcGroup
- SUPERTYPE OF (ONEOF
-    (IfcAsset
-    ,IfcInventory
-    ,IfcStructuralLoadGroup
-    ,IfcStructuralResultGroup
-    ,IfcSystem))
- SUBTYPE OF (IfcObject);
- INVERSE
-	IsGroupedBy : SET [0:?] OF IfcRelAssignsToGroup FOR RelatingGroup;
-END_ENTITY;
-
-ENTITY IfcHalfSpaceSolid
- SUPERTYPE OF (ONEOF
-    (IfcBoxedHalfSpace
-    ,IfcPolygonalBoundedHalfSpace))
- SUBTYPE OF (IfcGeometricRepresentationItem);
-	BaseSurface : IfcSurface;
-	AgreementFlag : IfcBoolean;
- DERIVE
-	Dim : IfcDimensionCount := 3;
-END_ENTITY;
-
-ENTITY IfcHeatExchanger
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcHeatExchangerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcHeatExchangerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcHeatExchangerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCHEATEXCHANGERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcHeatExchangerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcHeatExchangerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcHeatExchangerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcHeatExchangerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcHumidifier
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcHumidifierTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcHumidifierTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcHumidifierTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCHUMIDIFIERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcHumidifierType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcHumidifierTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcHumidifierTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcHumidifierTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcIShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	OverallWidth : IfcPositiveLengthMeasure;
-	OverallDepth : IfcPositiveLengthMeasure;
-	WebThickness : IfcPositiveLengthMeasure;
-	FlangeThickness : IfcPositiveLengthMeasure;
-	FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	FlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
- WHERE
-	ValidFlangeThickness : (2. * FlangeThickness) < OverallDepth;
-	ValidWebThickness : WebThickness < OverallWidth;
-	ValidFilletRadius : NOT(EXISTS(FilletRadius)) OR
-((FilletRadius <= (OverallWidth - WebThickness)/2.) AND 
- (FilletRadius <= (OverallDepth - (2. * FlangeThickness))/2.));
-END_ENTITY;
-
-ENTITY IfcImageTexture
- SUBTYPE OF (IfcSurfaceTexture);
-	URLReference : IfcURIReference;
-END_ENTITY;
-
-ENTITY IfcIndexedColourMap
- SUBTYPE OF (IfcPresentationItem);
-	MappedTo : IfcTessellatedFaceSet;
-	Opacity : OPTIONAL IfcNormalisedRatioMeasure;
-	Colours : IfcColourRgbList;
-	ColourIndex : LIST [1:?] OF IfcPositiveInteger;
-END_ENTITY;
-
-ENTITY IfcIndexedPolyCurve
- SUBTYPE OF (IfcBoundedCurve);
-	Points : IfcCartesianPointList;
-	Segments : OPTIONAL LIST [1:?] OF IfcSegmentIndexSelect;
-	SelfIntersect : OPTIONAL IfcBoolean;
- WHERE
-	Consecutive : (SIZEOF(Segments) = 0) OR IfcConsecutiveSegments(Segments);
-END_ENTITY;
-
-ENTITY IfcIndexedPolygonalFace
- SUPERTYPE OF (ONEOF
-    (IfcIndexedPolygonalFaceWithVoids))
- SUBTYPE OF (IfcTessellatedItem);
-	CoordIndex : LIST [3:?] OF IfcPositiveInteger;
- INVERSE
-	ToFaceSet : SET [1:?] OF IfcPolygonalFaceSet FOR Faces;
-END_ENTITY;
-
-ENTITY IfcIndexedPolygonalFaceWithVoids
- SUBTYPE OF (IfcIndexedPolygonalFace);
-	InnerCoordIndices : LIST [1:?] OF LIST [3:?] OF UNIQUE IfcPositiveInteger;
-END_ENTITY;
-
-ENTITY IfcIndexedTextureMap
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcIndexedTriangleTextureMap))
- SUBTYPE OF (IfcTextureCoordinate);
-	MappedTo : IfcTessellatedFaceSet;
-	TexCoords : IfcTextureVertexList;
-END_ENTITY;
-
-ENTITY IfcIndexedTriangleTextureMap
- SUBTYPE OF (IfcIndexedTextureMap);
-	TexCoordIndex : OPTIONAL LIST [1:?] OF LIST [3:3] OF IfcPositiveInteger;
-END_ENTITY;
-
-ENTITY IfcInterceptor
- SUBTYPE OF (IfcFlowTreatmentDevice);
-	PredefinedType : OPTIONAL IfcInterceptorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcInterceptorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcInterceptorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCINTERCEPTORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcInterceptorType
- SUBTYPE OF (IfcFlowTreatmentDeviceType);
-	PredefinedType : IfcInterceptorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcInterceptorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcInterceptorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcIntersectionCurve
- SUBTYPE OF (IfcSurfaceCurve);
- WHERE
-	TwoPCurves : SIZEOF(SELF\IfcSurfaceCurve.AssociatedGeometry) = 2;
-	DistinctSurfaces : IfcAssociatedSurface(SELF\IfcSurfaceCurve.AssociatedGeometry[1]) <> IfcAssociatedSurface(SELF\IfcSurfaceCurve.AssociatedGeometry[2]);
-END_ENTITY;
-
-ENTITY IfcInventory
- SUBTYPE OF (IfcGroup);
-	PredefinedType : OPTIONAL IfcInventoryTypeEnum;
-	Jurisdiction : OPTIONAL IfcActorSelect;
-	ResponsiblePersons : OPTIONAL SET [1:?] OF IfcPerson;
-	LastUpdateDate : OPTIONAL IfcDate;
-	CurrentValue : OPTIONAL IfcCostValue;
-	OriginalValue : OPTIONAL IfcCostValue;
-END_ENTITY;
-
-ENTITY IfcIrregularTimeSeries
- SUBTYPE OF (IfcTimeSeries);
-	Values : LIST [1:?] OF IfcIrregularTimeSeriesValue;
-END_ENTITY;
-
-ENTITY IfcIrregularTimeSeriesValue;
-	TimeStamp : IfcDateTime;
-	ListValues : LIST [1:?] OF IfcValue;
-END_ENTITY;
-
-ENTITY IfcJunctionBox
- SUBTYPE OF (IfcFlowFitting);
-	PredefinedType : OPTIONAL IfcJunctionBoxTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcJunctionBoxTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcJunctionBoxTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCJUNCTIONBOXTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcJunctionBoxType
- SUBTYPE OF (IfcFlowFittingType);
-	PredefinedType : IfcJunctionBoxTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcJunctionBoxTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcJunctionBoxTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcLShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	Depth : IfcPositiveLengthMeasure;
-	Width : OPTIONAL IfcPositiveLengthMeasure;
-	Thickness : IfcPositiveLengthMeasure;
-	FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	LegSlope : OPTIONAL IfcPlaneAngleMeasure;
- WHERE
-	ValidThickness : (Thickness < Depth) AND (NOT(EXISTS(Width)) OR (Thickness < Width));
-END_ENTITY;
-
-ENTITY IfcLaborResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcLaborResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcLaborResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcLaborResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcLaborResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcLaborResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcLaborResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcLaborResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-END_ENTITY;
-
-ENTITY IfcLagTime
- SUBTYPE OF (IfcSchedulingTime);
-	LagValue : IfcTimeOrRatioSelect;
-	DurationType : IfcTaskDurationEnum;
-END_ENTITY;
-
-ENTITY IfcLamp
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcLampTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcLampTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcLampTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCLAMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcLampType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcLampTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcLampTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcLampTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcLibraryInformation
- SUBTYPE OF (IfcExternalInformation);
-	Name : IfcLabel;
-	Version : OPTIONAL IfcLabel;
-	Publisher : OPTIONAL IfcActorSelect;
-	VersionDate : OPTIONAL IfcDateTime;
-	Location : OPTIONAL IfcURIReference;
-	Description : OPTIONAL IfcText;
- INVERSE
-	LibraryInfoForObjects : SET [0:?] OF IfcRelAssociatesLibrary FOR RelatingLibrary;
-	HasLibraryReferences : SET [0:?] OF IfcLibraryReference FOR ReferencedLibrary;
-END_ENTITY;
-
-ENTITY IfcLibraryReference
- SUBTYPE OF (IfcExternalReference);
-	Description : OPTIONAL IfcText;
-	Language : OPTIONAL IfcLanguageId;
-	ReferencedLibrary : OPTIONAL IfcLibraryInformation;
- INVERSE
-	LibraryRefForObjects : SET [0:?] OF IfcRelAssociatesLibrary FOR RelatingLibrary;
-END_ENTITY;
-
-ENTITY IfcLightDistributionData;
-	MainPlaneAngle : IfcPlaneAngleMeasure;
-	SecondaryPlaneAngle : LIST [1:?] OF IfcPlaneAngleMeasure;
-	LuminousIntensity : LIST [1:?] OF IfcLuminousIntensityDistributionMeasure;
-END_ENTITY;
-
-ENTITY IfcLightFixture
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcLightFixtureTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcLightFixtureTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcLightFixtureTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCLIGHTFIXTURETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcLightFixtureType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcLightFixtureTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcLightFixtureTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcLightFixtureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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
-	SameDim : Dir.Dim = Pnt.Dim;
-END_ENTITY;
-
-ENTITY IfcLocalPlacement
- SUBTYPE OF (IfcObjectPlacement);
-	PlacementRelTo : OPTIONAL IfcObjectPlacement;
-	RelativePlacement : IfcAxis2Placement;
- WHERE
-	WR21 : IfcCorrectLocalPlacement(RelativePlacement, PlacementRelTo);
-END_ENTITY;
-
-ENTITY IfcLoop
- SUPERTYPE OF (ONEOF
-    (IfcEdgeLoop
-    ,IfcPolyLoop
-    ,IfcVertexLoop))
- SUBTYPE OF (IfcTopologicalRepresentationItem);
-END_ENTITY;
-
-ENTITY IfcManifoldSolidBrep
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAdvancedBrep
-    ,IfcFacetedBrep))
- SUBTYPE OF (IfcSolidModel);
-	Outer : IfcClosedShell;
-END_ENTITY;
-
-ENTITY IfcMapConversion
- SUBTYPE OF (IfcCoordinateOperation);
-	Eastings : IfcLengthMeasure;
-	Northings : IfcLengthMeasure;
-	OrthogonalHeight : IfcLengthMeasure;
-	XAxisAbscissa : OPTIONAL IfcReal;
-	XAxisOrdinate : OPTIONAL IfcReal;
-	Scale : OPTIONAL IfcReal;
-END_ENTITY;
-
-ENTITY IfcMappedItem
- SUBTYPE OF (IfcRepresentationItem);
-	MappingSource : IfcRepresentationMap;
-	MappingTarget : IfcCartesianTransformationOperator;
-END_ENTITY;
-
-ENTITY IfcMaterial
- SUBTYPE OF (IfcMaterialDefinition);
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	Category : OPTIONAL IfcLabel;
- INVERSE
-	HasRepresentation : SET [0:1] OF IfcMaterialDefinitionRepresentation FOR RepresentedMaterial;
-	IsRelatedWith : SET [0:?] OF IfcMaterialRelationship FOR RelatedMaterials;
-	RelatesTo : SET [0:1] OF IfcMaterialRelationship FOR RelatingMaterial;
-END_ENTITY;
-
-ENTITY IfcMaterialClassificationRelationship;
-	MaterialClassifications : SET [1:?] OF IfcClassificationSelect;
-	ClassifiedMaterial : IfcMaterial;
-END_ENTITY;
-
-ENTITY IfcMaterialConstituent
- SUBTYPE OF (IfcMaterialDefinition);
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	Material : IfcMaterial;
-	Fraction : OPTIONAL IfcNormalisedRatioMeasure;
-	Category : OPTIONAL IfcLabel;
- INVERSE
-	ToMaterialConstituentSet : IfcMaterialConstituentSet FOR MaterialConstituents;
-END_ENTITY;
-
-ENTITY IfcMaterialConstituentSet
- SUBTYPE OF (IfcMaterialDefinition);
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	MaterialConstituents : OPTIONAL SET [1:?] OF IfcMaterialConstituent;
-END_ENTITY;
-
-ENTITY IfcMaterialDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcMaterial
-    ,IfcMaterialConstituent
-    ,IfcMaterialConstituentSet
-    ,IfcMaterialLayer
-    ,IfcMaterialLayerSet
-    ,IfcMaterialProfile
-    ,IfcMaterialProfileSet));
- INVERSE
-	AssociatedTo : SET [0:?] OF IfcRelAssociatesMaterial FOR RelatingMaterial;
-	HasExternalReferences : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-	HasProperties : SET [0:?] OF IfcMaterialProperties FOR Material;
-END_ENTITY;
-
-ENTITY IfcMaterialDefinitionRepresentation
- SUBTYPE OF (IfcProductRepresentation);
-	RepresentedMaterial : IfcMaterial;
- WHERE
-	OnlyStyledRepresentations : SIZEOF(QUERY(temp <* Representations | 
-  (NOT('IFC4.IFCSTYLEDREPRESENTATION' IN TYPEOF(temp)))
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcMaterialLayer
- SUPERTYPE OF (ONEOF
-    (IfcMaterialLayerWithOffsets))
- SUBTYPE OF (IfcMaterialDefinition);
-	Material : OPTIONAL IfcMaterial;
-	LayerThickness : IfcNonNegativeLengthMeasure;
-	IsVentilated : OPTIONAL IfcLogical;
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	Category : OPTIONAL IfcLabel;
-	Priority : OPTIONAL IfcInteger;
- INVERSE
-	ToMaterialLayerSet : IfcMaterialLayerSet FOR MaterialLayers;
- WHERE
-	NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
-END_ENTITY;
-
-ENTITY IfcMaterialLayerSet
- SUBTYPE OF (IfcMaterialDefinition);
-	MaterialLayers : LIST [1:?] OF IfcMaterialLayer;
-	LayerSetName : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
- DERIVE
-	TotalThickness : IfcLengthMeasure := IfcMlsTotalThickness(SELF);
-END_ENTITY;
-
-ENTITY IfcMaterialLayerSetUsage
- SUBTYPE OF (IfcMaterialUsageDefinition);
-	ForLayerSet : IfcMaterialLayerSet;
-	LayerSetDirection : IfcLayerSetDirectionEnum;
-	DirectionSense : IfcDirectionSenseEnum;
-	OffsetFromReferenceLine : IfcLengthMeasure;
-	ReferenceExtent : OPTIONAL IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcMaterialLayerWithOffsets
- SUBTYPE OF (IfcMaterialLayer);
-	OffsetDirection : IfcLayerSetDirectionEnum;
-	OffsetValues : ARRAY [1:2] OF IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcMaterialList;
-	Materials : LIST [1:?] OF IfcMaterial;
-END_ENTITY;
-
-ENTITY IfcMaterialProfile
- SUPERTYPE OF (ONEOF
-    (IfcMaterialProfileWithOffsets))
- SUBTYPE OF (IfcMaterialDefinition);
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	Material : OPTIONAL IfcMaterial;
-	Profile : IfcProfileDef;
-	Priority : OPTIONAL IfcInteger;
-	Category : OPTIONAL IfcLabel;
- INVERSE
-	ToMaterialProfileSet : IfcMaterialProfileSet FOR MaterialProfiles;
- WHERE
-	NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
-END_ENTITY;
-
-ENTITY IfcMaterialProfileSet
- SUBTYPE OF (IfcMaterialDefinition);
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	MaterialProfiles : LIST [1:?] OF IfcMaterialProfile;
-	CompositeProfile : OPTIONAL IfcCompositeProfileDef;
-END_ENTITY;
-
-ENTITY IfcMaterialProfileSetUsage
- SUPERTYPE OF (ONEOF
-    (IfcMaterialProfileSetUsageTapering))
- SUBTYPE OF (IfcMaterialUsageDefinition);
-	ForProfileSet : IfcMaterialProfileSet;
-	CardinalPoint : OPTIONAL IfcCardinalPointReference;
-	ReferenceExtent : OPTIONAL IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcMaterialProfileSetUsageTapering
- SUBTYPE OF (IfcMaterialProfileSetUsage);
-	ForProfileEndSet : IfcMaterialProfileSet;
-	CardinalEndPoint : OPTIONAL IfcCardinalPointReference;
-END_ENTITY;
-
-ENTITY IfcMaterialProfileWithOffsets
- SUBTYPE OF (IfcMaterialProfile);
-	OffsetValues : ARRAY [1:2] OF IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcMaterialProperties
- SUBTYPE OF (IfcExtendedProperties);
-	Material : IfcMaterialDefinition;
-END_ENTITY;
-
-ENTITY IfcMaterialRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingMaterial : IfcMaterial;
-	RelatedMaterials : SET [1:?] OF IfcMaterial;
-	Expression : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcMaterialUsageDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcMaterialLayerSetUsage
-    ,IfcMaterialProfileSetUsage));
- INVERSE
-	AssociatedTo : SET [1:?] OF IfcRelAssociatesMaterial FOR RelatingMaterial;
-END_ENTITY;
-
-ENTITY IfcMeasureWithUnit;
-	ValueComponent : IfcValue;
-	UnitComponent : IfcUnit;
-END_ENTITY;
-
-ENTITY IfcMechanicalFastener
- SUBTYPE OF (IfcElementComponent);
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	NominalLength : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcMechanicalFastenerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcMechanicalFastenerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcMechanicalFastenerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCMECHANICALFASTENERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcMechanicalFastenerType
- SUBTYPE OF (IfcElementComponentType);
-	PredefinedType : IfcMechanicalFastenerTypeEnum;
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	NominalLength : OPTIONAL IfcPositiveLengthMeasure;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcMechanicalFastenerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcMechanicalFastenerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcMedicalDevice
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcMedicalDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcMedicalDeviceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcMedicalDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCMEDICALDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcMedicalDeviceType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcMedicalDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcMedicalDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcMedicalDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcMember
- SUPERTYPE OF (ONEOF
-    (IfcMemberStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcMemberTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcMemberTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcMemberTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCMEMBERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcMemberStandardCase
- SUBTYPE OF (IfcMember);
- WHERE
-	HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcMemberType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcMemberTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcMemberTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcMemberTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcMetric
- SUBTYPE OF (IfcConstraint);
-	Benchmark : IfcBenchmarkEnum;
-	ValueSource : OPTIONAL IfcLabel;
-	DataValue : OPTIONAL IfcMetricValueSelect;
-	ReferencePath : OPTIONAL IfcReference;
-END_ENTITY;
-
-ENTITY IfcMirroredProfileDef
- SUBTYPE OF (IfcDerivedProfileDef);
- DERIVE
-	SELF\IfcDerivedProfileDef.Operator : IfcCartesianTransformationOperator2D := 
-IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
-IfcCartesianTransformationOperator(
-    -- Axis1
-    IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
-    IfcDirection([-1., 0.]),
-    -- Axis2
-    IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
-    IfcDirection([ 0., 1.]),
-    -- LocalOrigin
-    IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
-    IfcPoint() || IfcCartesianPoint([0., 0.]),
-    -- Scale
-    1.) ||
-IfcCartesianTransformationOperator2D();
-END_ENTITY;
-
-ENTITY IfcMonetaryUnit;
-	Currency : IfcLabel;
-END_ENTITY;
-
-ENTITY IfcMotorConnection
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcMotorConnectionTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcMotorConnectionTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcMotorConnectionTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCMOTORCONNECTIONTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcMotorConnectionType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcMotorConnectionTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcMotorConnectionTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcMotorConnectionTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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
-    ,IfcResource))
- SUBTYPE OF (IfcObjectDefinition);
-	ObjectType : OPTIONAL IfcLabel;
- INVERSE
-	IsDeclaredBy : SET [0:1] OF IfcRelDefinesByObject FOR RelatedObjects;
-	Declares : SET [0:?] OF IfcRelDefinesByObject FOR RelatingObject;
-	IsTypedBy : SET [0:1] OF IfcRelDefinesByType FOR RelatedObjects;
-	IsDefinedBy : SET [0:?] OF IfcRelDefinesByProperties FOR RelatedObjects;
- WHERE
-	UniquePropertySetNames : ((SIZEOF(IsDefinedBy) = 0) OR IfcUniqueDefinitionNames(IsDefinedBy));
-END_ENTITY;
-
-ENTITY IfcObjectDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcContext
-    ,IfcObject
-    ,IfcTypeObject))
- SUBTYPE OF (IfcRoot);
- INVERSE
-	HasAssignments : SET [0:?] OF IfcRelAssigns FOR RelatedObjects;
-	Nests : SET [0:1] OF IfcRelNests FOR RelatedObjects;
-	IsNestedBy : SET [0:?] OF IfcRelNests FOR RelatingObject;
-	HasContext : SET [0:1] OF IfcRelDeclares FOR RelatedDefinitions;
-	IsDecomposedBy : SET [0:?] OF IfcRelAggregates FOR RelatingObject;
-	Decomposes : SET [0:1] OF IfcRelAggregates FOR RelatedObjects;
-	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
-END_ENTITY;
-
-ENTITY IfcObjectPlacement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcGridPlacement
-    ,IfcLocalPlacement));
- INVERSE
-	PlacesObject : SET [0:?] OF IfcProduct FOR ObjectPlacement;
-	ReferencedByPlacements : SET [0:?] OF IfcLocalPlacement FOR PlacementRelTo;
-END_ENTITY;
-
-ENTITY IfcObjective
- SUBTYPE OF (IfcConstraint);
-	BenchmarkValues : OPTIONAL LIST [1:?] OF IfcConstraint;
-	LogicalAggregator : OPTIONAL IfcLogicalOperatorEnum;
-	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 : OPTIONAL IfcOccupantTypeEnum;
- WHERE
-	WR31 : NOT(PredefinedType = IfcOccupantTypeEnum.USERDEFINED) 
-OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcOffsetCurve2D
- SUBTYPE OF (IfcCurve);
-	BasisCurve : IfcCurve;
-	Distance : IfcLengthMeasure;
-	SelfIntersect : IfcLogical;
- WHERE
-	DimIs2D : BasisCurve.Dim = 2;
-END_ENTITY;
-
-ENTITY IfcOffsetCurve3D
- SUBTYPE OF (IfcCurve);
-	BasisCurve : IfcCurve;
-	Distance : IfcLengthMeasure;
-	SelfIntersect : IfcLogical;
-	RefDirection : IfcDirection;
- WHERE
-	DimIs2D : BasisCurve.Dim = 3;
-END_ENTITY;
-
-ENTITY IfcOpenShell
- SUBTYPE OF (IfcConnectedFaceSet);
-END_ENTITY;
-
-ENTITY IfcOpeningElement
- SUPERTYPE OF (ONEOF
-    (IfcOpeningStandardCase))
- SUBTYPE OF (IfcFeatureElementSubtraction);
-	PredefinedType : OPTIONAL IfcOpeningElementTypeEnum;
- INVERSE
-	HasFillings : SET [0:?] OF IfcRelFillsElement FOR RelatingOpeningElement;
-END_ENTITY;
-
-ENTITY IfcOpeningStandardCase
- SUBTYPE OF (IfcOpeningElement);
-END_ENTITY;
-
-ENTITY IfcOrganization;
-	Identification : 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
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingOrganization : IfcOrganization;
-	RelatedOrganizations : SET [1:?] OF IfcOrganization;
-END_ENTITY;
-
-ENTITY IfcOrientedEdge
- SUBTYPE OF (IfcEdge);
-	EdgeElement : IfcEdge;
-	Orientation : IfcBoolean;
- DERIVE
-	SELF\IfcEdge.EdgeStart : IfcVertex := IfcBooleanChoose 
-(Orientation, EdgeElement.EdgeStart, EdgeElement.EdgeEnd);
-	SELF\IfcEdge.EdgeEnd : IfcVertex := IfcBooleanChoose 
-(Orientation, EdgeElement.EdgeEnd, EdgeElement.EdgeStart);
- WHERE
-	EdgeElementNotOriented : NOT('IFC4.IFCORIENTEDEDGE' IN TYPEOF(EdgeElement));
-END_ENTITY;
-
-ENTITY IfcOuterBoundaryCurve
- SUBTYPE OF (IfcBoundaryCurve);
-END_ENTITY;
-
-ENTITY IfcOutlet
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcOutletTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcOutletTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcOutletTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCOUTLETTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcOutletType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcOutletTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcOutletTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcOutletTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcOwnerHistory;
-	OwningUser : IfcPersonAndOrganization;
-	OwningApplication : IfcApplication;
-	State : OPTIONAL IfcStateEnum;
-	ChangeAction : OPTIONAL IfcChangeActionEnum;
-	LastModifiedDate : OPTIONAL IfcTimeStamp;
-	LastModifyingUser : OPTIONAL IfcPersonAndOrganization;
-	LastModifyingApplication : OPTIONAL IfcApplication;
-	CreationDate : IfcTimeStamp;
- WHERE
-	CorrectChangeAction : (EXISTS(LastModifiedDate)) OR
-(NOT(EXISTS(LastModifiedDate)) AND NOT(EXISTS(ChangeAction))) OR
-(NOT(EXISTS(LastModifiedDate)) AND EXISTS(ChangeAction) AND ((ChangeAction = IfcChangeActionEnum.NOTDEFINED) OR (ChangeAction = IfcChangeActionEnum.NOCHANGE)));
-END_ENTITY;
-
-ENTITY IfcParameterizedProfileDef
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAsymmetricIShapeProfileDef
-    ,IfcCShapeProfileDef
-    ,IfcCircleProfileDef
-    ,IfcEllipseProfileDef
-    ,IfcIShapeProfileDef
-    ,IfcLShapeProfileDef
-    ,IfcRectangleProfileDef
-    ,IfcTShapeProfileDef
-    ,IfcTrapeziumProfileDef
-    ,IfcUShapeProfileDef
-    ,IfcZShapeProfileDef))
- SUBTYPE OF (IfcProfileDef);
-	Position : OPTIONAL IfcAxis2Placement2D;
-END_ENTITY;
-
-ENTITY IfcPath
- SUBTYPE OF (IfcTopologicalRepresentationItem);
-	EdgeList : LIST [1:?] OF UNIQUE IfcOrientedEdge;
- WHERE
-	IsContinuous : IfcPathHeadToTail(SELF);
-END_ENTITY;
-
-ENTITY IfcPcurve
- SUBTYPE OF (IfcCurve);
-	BasisSurface : IfcSurface;
-	ReferenceCurve : IfcCurve;
- WHERE
-	DimIs2D : ReferenceCurve.Dim = 2;
-END_ENTITY;
-
-ENTITY IfcPerformanceHistory
- SUBTYPE OF (IfcControl);
-	LifeCyclePhase : IfcLabel;
-	PredefinedType : OPTIONAL IfcPerformanceHistoryTypeEnum;
-END_ENTITY;
-
-ENTITY IfcPermeableCoveringProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	OperationType : IfcPermeableCoveringOperationEnum;
-	PanelPosition : IfcWindowPanelPositionEnum;
-	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
-	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
-	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
-END_ENTITY;
-
-ENTITY IfcPermit
- SUBTYPE OF (IfcControl);
-	PredefinedType : OPTIONAL IfcPermitTypeEnum;
-	Status : OPTIONAL IfcLabel;
-	LongDescription : OPTIONAL IfcText;
-END_ENTITY;
-
-ENTITY IfcPerson;
-	Identification : 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
-	IdentifiablePerson : EXISTS(Identification) OR EXISTS(FamilyName) OR EXISTS(GivenName);
-	ValidSetOfNames : NOT EXISTS(MiddleNames) OR 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
-	NoSelfReference : SIZEOF(QUERY(temp <* HasQuantities | SELF :=: temp)) = 0;
-	UniqueQuantityNames : IfcUniqueQuantityNames(HasQuantities);
-END_ENTITY;
-
-ENTITY IfcPhysicalQuantity
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPhysicalComplexQuantity
-    ,IfcPhysicalSimpleQuantity));
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
- INVERSE
-	HasExternalReferences : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-	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 : OPTIONAL IfcPileTypeEnum;
-	ConstructionType : OPTIONAL IfcPileConstructionEnum;
- WHERE
-	CorrectPredefinedType : NOT EXISTS(PredefinedType) OR
-(PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCPILETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcPileType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcPileTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcPipeFitting
- SUBTYPE OF (IfcFlowFitting);
-	PredefinedType : OPTIONAL IfcPipeFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcPipeFittingTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcPipeFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCPIPEFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcPipeFittingType
- SUBTYPE OF (IfcFlowFittingType);
-	PredefinedType : IfcPipeFittingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcPipeFittingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcPipeFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcPipeSegment
- SUBTYPE OF (IfcFlowSegment);
-	PredefinedType : OPTIONAL IfcPipeSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcPipeSegmentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcPipeSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCPIPESEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcPipeSegmentType
- SUBTYPE OF (IfcFlowSegmentType);
-	PredefinedType : IfcPipeSegmentTypeEnum;
- WHERE
-	CorrectPredefinedType : (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 IfcBinary;
- WHERE
-	MinPixelInS : Width >= 1;
-	MinPixelInT : Height >= 1;
-	NumberOfColours : {1 <= ColourComponents <= 4};
-	SizeOfPixelList : SIZEOF(Pixel) = (Width * Height);
-	PixelAsByteAndSameLength : SIZEOF(QUERY(temp<* Pixel |
- (BLENGTH(temp) MOD 8 = 0) AND
- (BLENGTH(temp) = BLENGTH(Pixel[1]))
-)) = SIZEOF(Pixel);
-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
- SUPERTYPE OF (ONEOF
-    (IfcPlateStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcPlateTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcPlateTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcPlateTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCPLATETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcPlateStandardCase
- SUBTYPE OF (IfcPlate);
- WHERE
-	HasMaterialLayerSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcPlateType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcPlateTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcPlateTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcPlateTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-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
-	AllPointsSameDim : SIZEOF(QUERY(Temp <* Polygon | Temp.Dim <> Polygon[1].Dim)) = 0;
-END_ENTITY;
-
-ENTITY IfcPolygonalBoundedHalfSpace
- SUBTYPE OF (IfcHalfSpaceSolid);
-	Position : IfcAxis2Placement3D;
-	PolygonalBoundary : IfcBoundedCurve;
- WHERE
-	BoundaryDim : PolygonalBoundary.Dim = 2;
-	BoundaryType : SIZEOF(TYPEOF(PolygonalBoundary) * [
-  'IFC4.IFCPOLYLINE', 
-  'IFC4.IFCCOMPOSITECURVE']
-) = 1;
-END_ENTITY;
-
-ENTITY IfcPolygonalFaceSet
- SUBTYPE OF (IfcTessellatedFaceSet);
-	Closed : OPTIONAL IfcBoolean;
-	Faces : LIST [1:?] OF IfcIndexedPolygonalFace;
-	PnIndex : OPTIONAL LIST [1:?] OF IfcPositiveInteger;
-END_ENTITY;
-
-ENTITY IfcPolyline
- SUBTYPE OF (IfcBoundedCurve);
-	Points : LIST [2:?] OF IfcCartesianPoint;
- WHERE
-	SameDim : SIZEOF(QUERY(Temp <* Points | Temp.Dim <> Points[1].Dim)) = 0;
-END_ENTITY;
-
-ENTITY IfcPort
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcDistributionPort))
- SUBTYPE OF (IfcProduct);
- INVERSE
-	ContainedIn : SET [0:1] OF 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 IfcPreDefinedItem
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPreDefinedColour
-    ,IfcPreDefinedCurveFont
-    ,IfcPreDefinedTextFont))
- SUBTYPE OF (IfcPresentationItem);
-	Name : IfcLabel;
-END_ENTITY;
-
-ENTITY IfcPreDefinedProperties
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcReinforcementBarProperties
-    ,IfcSectionProperties
-    ,IfcSectionReinforcementProperties))
- SUBTYPE OF (IfcPropertyAbstraction);
-END_ENTITY;
-
-ENTITY IfcPreDefinedPropertySet
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcDoorLiningProperties
-    ,IfcDoorPanelProperties
-    ,IfcPermeableCoveringProperties
-    ,IfcReinforcementDefinitionProperties
-    ,IfcWindowLiningProperties
-    ,IfcWindowPanelProperties))
- SUBTYPE OF (IfcPropertySetDefinition);
-END_ENTITY;
-
-ENTITY IfcPreDefinedTextFont
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcTextStyleFontModel))
- SUBTYPE OF (IfcPreDefinedItem);
-END_ENTITY;
-
-ENTITY IfcPresentationItem
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcColourRgbList
-    ,IfcColourSpecification
-    ,IfcCurveStyleFont
-    ,IfcCurveStyleFontAndScaling
-    ,IfcCurveStyleFontPattern
-    ,IfcIndexedColourMap
-    ,IfcPreDefinedItem
-    ,IfcSurfaceStyleLighting
-    ,IfcSurfaceStyleRefraction
-    ,IfcSurfaceStyleShading
-    ,IfcSurfaceStyleWithTextures
-    ,IfcSurfaceTexture
-    ,IfcTextStyleForDefinedFont
-    ,IfcTextStyleTextModel
-    ,IfcTextureCoordinate
-    ,IfcTextureVertex
-    ,IfcTextureVertexList));
-END_ENTITY;
-
-ENTITY IfcPresentationLayerAssignment
- SUPERTYPE OF (ONEOF
-    (IfcPresentationLayerWithStyle));
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	AssignedItems : SET [1:?] OF IfcLayeredItem;
-	Identifier : OPTIONAL IfcIdentifier;
- WHERE
-	ApplicableItems : SIZEOF(QUERY(temp <* AssignedItems | (
-  SIZEOF(TYPEOF(temp) * [
-    'IFC4.IFCSHAPEREPRESENTATION',
-    'IFC4.IFCGEOMETRICREPRESENTATIONITEM',
-    'IFC4.IFCMAPPEDITEM']) = 1)
-)) = SIZEOF(AssignedItems);
-END_ENTITY;
-
-ENTITY IfcPresentationLayerWithStyle
- SUBTYPE OF (IfcPresentationLayerAssignment);
-	LayerOn : IfcLogical;
-	LayerFrozen : IfcLogical;
-	LayerBlocked : IfcLogical;
-	LayerStyles : SET [0:?] OF IfcPresentationStyle;
- WHERE
-	ApplicableOnlyToItems : SIZEOF(QUERY(temp <* AssignedItems | (
-  SIZEOF(TYPEOF(temp) * [
-    'IFC4.IFCGEOMETRICREPRESENTATIONITEM',
-    'IFC4.IFCMAPPEDITEM']) = 1)
-)) = SIZEOF(AssignedItems);
-END_ENTITY;
-
-ENTITY IfcPresentationStyle
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCurveStyle
-    ,IfcFillAreaStyle
-    ,IfcSurfaceStyle
-    ,IfcTextStyle));
-	Name : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcPresentationStyleAssignment;
-	Styles : SET [1:?] OF IfcPresentationStyleSelect;
-END_ENTITY;
-
-ENTITY IfcProcedure
- SUBTYPE OF (IfcProcess);
-	PredefinedType : OPTIONAL IfcProcedureTypeEnum;
- WHERE
-	HasName : EXISTS(SELF\IfcRoot.Name);
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcProcedureTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcProcedureType
- SUBTYPE OF (IfcTypeProcess);
-	PredefinedType : IfcProcedureTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcProcedureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType));
-END_ENTITY;
-
-ENTITY IfcProcess
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcEvent
-    ,IfcProcedure
-    ,IfcTask))
- SUBTYPE OF (IfcObject);
-	Identification : OPTIONAL IfcIdentifier;
-	LongDescription : OPTIONAL IfcText;
- INVERSE
-	IsPredecessorTo : SET [0:?] OF IfcRelSequence FOR RelatingProcess;
-	IsSuccessorFrom : SET [0:?] OF IfcRelSequence FOR RelatedProcess;
-	OperatesOn : SET [0:?] OF IfcRelAssignsToProcess FOR RelatingProcess;
-END_ENTITY;
-
-ENTITY IfcProduct
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcAnnotation
-    ,IfcElement
-    ,IfcGrid
-    ,IfcPort
-    ,IfcProxy
-    ,IfcSpatialElement
-    ,IfcStructuralActivity
-    ,IfcStructuralItem))
- SUBTYPE OF (IfcObject);
-	ObjectPlacement : OPTIONAL IfcObjectPlacement;
-	Representation : OPTIONAL IfcProductRepresentation;
- INVERSE
-	ReferencedBy : SET [0:?] OF IfcRelAssignsToProduct FOR RelatingProduct;
- WHERE
-	PlacementForShapeRepresentation : (EXISTS(Representation) AND EXISTS(ObjectPlacement))
-            OR (EXISTS(Representation) AND 
-			   (SIZEOF(QUERY(temp <* Representation.Representations | 'IFC4.IFCSHAPEREPRESENTATION' IN TYPEOF(temp))) = 0))
-            OR (NOT(EXISTS(Representation)));
-END_ENTITY;
-
-ENTITY IfcProductDefinitionShape
- SUBTYPE OF (IfcProductRepresentation);
- INVERSE
-	ShapeOfProduct : SET [1:?] OF IfcProduct FOR Representation;
-	HasShapeAspects : SET [0:?] OF IfcShapeAspect FOR PartOfProductDefinitionShape;
- WHERE
-	OnlyShapeModel : SIZEOF(QUERY(temp <* Representations | 
-  (NOT('IFC4.IFCSHAPEMODEL' IN TYPEOF(temp)))
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcProductRepresentation
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcMaterialDefinitionRepresentation
-    ,IfcProductDefinitionShape));
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	Representations : LIST [1:?] OF IfcRepresentation;
-END_ENTITY;
-
-ENTITY IfcProfileDef
- SUPERTYPE OF (ONEOF
-    (IfcArbitraryClosedProfileDef
-    ,IfcArbitraryOpenProfileDef
-    ,IfcCompositeProfileDef
-    ,IfcDerivedProfileDef
-    ,IfcParameterizedProfileDef));
-	ProfileType : IfcProfileTypeEnum;
-	ProfileName : OPTIONAL IfcLabel;
- INVERSE
-	HasExternalReference : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-	HasProperties : SET [0:?] OF IfcProfileProperties FOR ProfileDefinition;
-END_ENTITY;
-
-ENTITY IfcProfileProperties
- SUBTYPE OF (IfcExtendedProperties);
-	ProfileDefinition : IfcProfileDef;
-END_ENTITY;
-
-ENTITY IfcProject
- SUBTYPE OF (IfcContext);
- WHERE
-	HasName : EXISTS(SELF\IfcRoot.Name);
-	CorrectContext : NOT(EXISTS(SELF\IfcContext.RepresentationContexts)) OR
-(SIZEOF(QUERY(Temp <* SELF\IfcContext.RepresentationContexts |
- 'IFC4.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(Temp)
-  )) = 0);
-	NoDecomposition : SIZEOF(SELF\IfcObjectDefinition.Decomposes) = 0;
-END_ENTITY;
-
-ENTITY IfcProjectLibrary
- SUBTYPE OF (IfcContext);
-END_ENTITY;
-
-ENTITY IfcProjectOrder
- SUBTYPE OF (IfcControl);
-	PredefinedType : OPTIONAL IfcProjectOrderTypeEnum;
-	Status : OPTIONAL IfcLabel;
-	LongDescription : OPTIONAL IfcText;
-END_ENTITY;
-
-ENTITY IfcProjectedCRS
- SUBTYPE OF (IfcCoordinateReferenceSystem);
-	MapProjection : OPTIONAL IfcIdentifier;
-	MapZone : OPTIONAL IfcIdentifier;
-	MapUnit : OPTIONAL IfcNamedUnit;
- WHERE
-	IsLengthUnit : NOT(EXISTS(MapUnit)) OR (MapUnit.UnitType = IfcUnitEnum.LENGTHUNIT);
-END_ENTITY;
-
-ENTITY IfcProjectionElement
- SUBTYPE OF (IfcFeatureElementAddition);
-	PredefinedType : OPTIONAL IfcProjectionElementTypeEnum;
-END_ENTITY;
-
-ENTITY IfcProperty
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcComplexProperty
-    ,IfcSimpleProperty))
- SUBTYPE OF (IfcPropertyAbstraction);
-	Name : IfcIdentifier;
-	Description : OPTIONAL IfcText;
- INVERSE
-	PartOfPset : SET [0:?] OF IfcPropertySet FOR HasProperties;
-	PropertyForDependance : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependingProperty;
-	PropertyDependsOn : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependantProperty;
-	PartOfComplex : SET [0:?] OF IfcComplexProperty FOR HasProperties;
-	HasConstraints : SET [0:?] OF IfcResourceConstraintRelationship FOR RelatedResourceObjects;
-	HasApprovals : SET [0:?] OF IfcResourceApprovalRelationship FOR RelatedResourceObjects;
-END_ENTITY;
-
-ENTITY IfcPropertyAbstraction
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcExtendedProperties
-    ,IfcPreDefinedProperties
-    ,IfcProperty
-    ,IfcPropertyEnumeration));
- INVERSE
-	HasExternalReferences : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-END_ENTITY;
-
-ENTITY IfcPropertyBoundedValue
- SUBTYPE OF (IfcSimpleProperty);
-	UpperBoundValue : OPTIONAL IfcValue;
-	LowerBoundValue : OPTIONAL IfcValue;
-	Unit : OPTIONAL IfcUnit;
-	SetPointValue : OPTIONAL IfcValue;
- WHERE
-	SameUnitUpperLower : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(LowerBoundValue)) OR
-(TYPEOF(UpperBoundValue) = TYPEOF(LowerBoundValue));
-	SameUnitUpperSet : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(SetPointValue)) OR
-(TYPEOF(UpperBoundValue) = TYPEOF(SetPointValue));
-	SameUnitLowerSet : NOT(EXISTS(LowerBoundValue)) OR NOT(EXISTS(SetPointValue)) OR
-(TYPEOF(LowerBoundValue) = TYPEOF(SetPointValue));
-END_ENTITY;
-
-ENTITY IfcPropertyDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPropertySetDefinition
-    ,IfcPropertyTemplateDefinition))
- SUBTYPE OF (IfcRoot);
- INVERSE
-	HasContext : SET [0:1] OF IfcRelDeclares FOR RelatedDefinitions;
-	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
-END_ENTITY;
-
-ENTITY IfcPropertyDependencyRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	DependingProperty : IfcProperty;
-	DependantProperty : IfcProperty;
-	Expression : OPTIONAL IfcText;
- WHERE
-	NoSelfReference : DependingProperty :<>: DependantProperty;
-END_ENTITY;
-
-ENTITY IfcPropertyEnumeratedValue
- SUBTYPE OF (IfcSimpleProperty);
-	EnumerationValues : OPTIONAL LIST [1:?] OF IfcValue;
-	EnumerationReference : OPTIONAL IfcPropertyEnumeration;
- WHERE
-	WR21 : NOT(EXISTS(EnumerationReference)) 
-OR  NOT(EXISTS(EnumerationValues)) 
-OR  (SIZEOF(QUERY(temp <* EnumerationValues |
-    temp IN EnumerationReference.EnumerationValues))
-    = SIZEOF(EnumerationValues));
-END_ENTITY;
-
-ENTITY IfcPropertyEnumeration
- SUBTYPE OF (IfcPropertyAbstraction);
-	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 : OPTIONAL 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 IfcText;
-	PropertyReference : OPTIONAL IfcObjectReferenceSelect;
-END_ENTITY;
-
-ENTITY IfcPropertySet
- SUBTYPE OF (IfcPropertySetDefinition);
-	HasProperties : SET [1:?] OF IfcProperty;
- WHERE
-	ExistsName : EXISTS(SELF\IfcRoot.Name);
-	UniquePropertyNames : IfcUniquePropertyName(HasProperties);
-END_ENTITY;
-
-ENTITY IfcPropertySetDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPreDefinedPropertySet
-    ,IfcPropertySet
-    ,IfcQuantitySet))
- SUBTYPE OF (IfcPropertyDefinition);
- INVERSE
-	DefinesType : SET [0:?] OF IfcTypeObject FOR HasPropertySets;
-	IsDefinedBy : SET [0:?] OF IfcRelDefinesByTemplate FOR RelatedPropertySets;
-	DefinesOccurrence : SET [0:?] OF IfcRelDefinesByProperties FOR RelatingPropertyDefinition;
-END_ENTITY;
-
-ENTITY IfcPropertySetTemplate
- SUBTYPE OF (IfcPropertyTemplateDefinition);
-	TemplateType : OPTIONAL IfcPropertySetTemplateTypeEnum;
-	ApplicableEntity : OPTIONAL IfcIdentifier;
-	HasPropertyTemplates : SET [1:?] OF IfcPropertyTemplate;
- INVERSE
-	Defines : SET [0:?] OF IfcRelDefinesByTemplate FOR RelatingTemplate;
- WHERE
-	ExistsName : EXISTS(SELF\IfcRoot.Name);
-	UniquePropertyNames : IfcUniquePropertyTemplateNames(HasPropertyTemplates);
-END_ENTITY;
-
-ENTITY IfcPropertySingleValue
- SUBTYPE OF (IfcSimpleProperty);
-	NominalValue : OPTIONAL IfcValue;
-	Unit : OPTIONAL IfcUnit;
-END_ENTITY;
-
-ENTITY IfcPropertyTableValue
- SUBTYPE OF (IfcSimpleProperty);
-	DefiningValues : OPTIONAL LIST [1:?] OF UNIQUE IfcValue;
-	DefinedValues : OPTIONAL LIST [1:?] OF IfcValue;
-	Expression : OPTIONAL IfcText;
-	DefiningUnit : OPTIONAL IfcUnit;
-	DefinedUnit : OPTIONAL IfcUnit;
-	CurveInterpolation : OPTIONAL IfcCurveInterpolationEnum;
- WHERE
-	WR21 : (NOT(EXISTS(DefiningValues)) AND NOT(EXISTS(DefinedValues)))
-OR (SIZEOF(DefiningValues) = SIZEOF(DefinedValues));
-	WR22 : NOT(EXISTS(DefiningValues)) OR 
-(SIZEOF(QUERY(temp <* SELF.DefiningValues | TYPEOF(temp) <> TYPEOF(SELF.DefiningValues[1])
-)) = 0);
-	WR23 : NOT(EXISTS(DefinedValues)) OR 
-(SIZEOF(QUERY(temp <* SELF.DefinedValues | TYPEOF(temp) <> TYPEOF(SELF.DefinedValues[1])
-)) = 0);
-END_ENTITY;
-
-ENTITY IfcPropertyTemplate
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcComplexPropertyTemplate
-    ,IfcSimplePropertyTemplate))
- SUBTYPE OF (IfcPropertyTemplateDefinition);
- INVERSE
-	PartOfComplexTemplate : SET [0:?] OF IfcComplexPropertyTemplate FOR HasPropertyTemplates;
-	PartOfPsetTemplate : SET [0:?] OF IfcPropertySetTemplate FOR HasPropertyTemplates;
-END_ENTITY;
-
-ENTITY IfcPropertyTemplateDefinition
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPropertySetTemplate
-    ,IfcPropertyTemplate))
- SUBTYPE OF (IfcPropertyDefinition);
-END_ENTITY;
-
-ENTITY IfcProtectiveDevice
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcProtectiveDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcProtectiveDeviceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcProtectiveDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCPROTECTIVEDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcProtectiveDeviceTrippingUnit
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcProtectiveDeviceTrippingUnitTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCPROTECTIVEDEVICETRIPPINGUNITTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcProtectiveDeviceTrippingUnitType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcProtectiveDeviceTrippingUnitTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcProtectiveDeviceType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcProtectiveDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcProtectiveDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcProtectiveDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcProxy
- SUBTYPE OF (IfcProduct);
-	ProxyType : IfcObjectTypeEnum;
-	Tag : OPTIONAL IfcLabel;
- WHERE
-	WR1 : EXISTS(SELF\IfcRoot.Name);
-END_ENTITY;
-
-ENTITY IfcPump
- SUBTYPE OF (IfcFlowMovingDevice);
-	PredefinedType : OPTIONAL IfcPumpTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcPumpTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcPumpTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCPUMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcPumpType
- SUBTYPE OF (IfcFlowMovingDeviceType);
-	PredefinedType : IfcPumpTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcPumpTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcPumpTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcQuantityArea
- SUBTYPE OF (IfcPhysicalSimpleQuantity);
-	AreaValue : IfcAreaMeasure;
-	Formula : OPTIONAL IfcLabel;
- 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;
-	Formula : OPTIONAL IfcLabel;
- WHERE
-	WR21 : CountValue >= 0.;
-END_ENTITY;
-
-ENTITY IfcQuantityLength
- SUBTYPE OF (IfcPhysicalSimpleQuantity);
-	LengthValue : IfcLengthMeasure;
-	Formula : OPTIONAL IfcLabel;
- WHERE
-	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
-   (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.LENGTHUNIT);
-	WR22 : LengthValue >= 0.;
-END_ENTITY;
-
-ENTITY IfcQuantitySet
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcElementQuantity))
- SUBTYPE OF (IfcPropertySetDefinition);
-END_ENTITY;
-
-ENTITY IfcQuantityTime
- SUBTYPE OF (IfcPhysicalSimpleQuantity);
-	TimeValue : IfcTimeMeasure;
-	Formula : OPTIONAL IfcLabel;
- 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;
-	Formula : OPTIONAL IfcLabel;
- 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;
-	Formula : OPTIONAL IfcLabel;
- WHERE
-	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
-   (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.MASSUNIT);
-	WR22 : WeightValue >= 0.;
-END_ENTITY;
-
-ENTITY IfcRailing
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcRailingTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcRailingTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcRailingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCRAILINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcRailingType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcRailingTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcRailingTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcRailingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcRamp
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcRampTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcRampTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcRampTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCRAMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcRampFlight
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcRampFlightTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcRampFlightTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcRampFlightTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCRAMPFLIGHTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcRampFlightType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcRampFlightTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcRampFlightTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcRampFlightTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcRampType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcRampTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcRampTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcRampTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcRationalBSplineCurveWithKnots
- SUBTYPE OF (IfcBSplineCurveWithKnots);
-	WeightsData : LIST [2:?] OF IfcReal;
- DERIVE
-	Weights : ARRAY [0:UpperIndexOnControlPoints] OF IfcReal := IfcListToArray(WeightsData,0,SELF\IfcBSplineCurve.UpperIndexOnControlPoints);
- WHERE
-	SameNumOfWeightsAndPoints : SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineCurve.ControlPointsList);
-	WeightsGreaterZero : IfcCurveWeightsPositive(SELF);
-END_ENTITY;
-
-ENTITY IfcRationalBSplineSurfaceWithKnots
- SUBTYPE OF (IfcBSplineSurfaceWithKnots);
-	WeightsData : LIST [2:?] OF LIST [2:?] OF IfcReal;
- DERIVE
-	Weights : ARRAY [0:UUpper] OF ARRAY [0:VUpper] OF IfcReal := IfcMakeArrayOfArray(WeightsData,0,UUpper,0,VUpper);
- WHERE
-	CorrespondingWeightsDataLists : (SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineSurface.ControlPointsList))
-AND 
-(SIZEOF(WeightsData[1]) = SIZEOF(SELF\IfcBSplineSurface.ControlPointsList[1]));
-	WeightValuesGreaterZero : IfcSurfaceWeightsPositive(SELF);
-END_ENTITY;
-
-ENTITY IfcRectangleHollowProfileDef
- SUBTYPE OF (IfcRectangleProfileDef);
-	WallThickness : IfcPositiveLengthMeasure;
-	InnerFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	OuterFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
- WHERE
-	ValidWallThickness : (WallThickness < (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
-(WallThickness < (SELF\IfcRectangleProfileDef.YDim/2.));
-	ValidInnerRadius : NOT(EXISTS(InnerFilletRadius)) OR 
-((InnerFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2. - WallThickness)) AND 
- (InnerFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2. - WallThickness)));
-	ValidOuterRadius : NOT(EXISTS(OuterFilletRadius)) OR 
-((OuterFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
- (OuterFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2.)));
-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 : IfcBoolean;
-	Vsense : IfcBoolean;
- WHERE
-	U1AndU2Different : U1 <> U2;
-	V1AndV2Different : V1 <> V2;
-	UsenseCompatible : (('IFC4.IFCELEMENTARYSURFACE' IN TYPEOF(BasisSurface)) AND
-         (NOT ('IFC4.IFCPLANE' IN TYPEOF(BasisSurface)))) OR
-         ('IFC4.IFCSURFACEOFREVOLUTION' IN TYPEOF(BasisSurface)) OR
-         (Usense = (U2 > U1));
-	VsenseCompatible : Vsense = (V2 > V1);
-END_ENTITY;
-
-ENTITY IfcRecurrencePattern;
-	RecurrenceType : IfcRecurrenceTypeEnum;
-	DayComponent : OPTIONAL SET [1:?] OF IfcDayInMonthNumber;
-	WeekdayComponent : OPTIONAL SET [1:?] OF IfcDayInWeekNumber;
-	MonthComponent : OPTIONAL SET [1:?] OF IfcMonthInYearNumber;
-	Position : OPTIONAL IfcInteger;
-	Interval : OPTIONAL IfcInteger;
-	Occurrences : OPTIONAL IfcInteger;
-	TimePeriods : OPTIONAL LIST [1:?] OF IfcTimePeriod;
-END_ENTITY;
-
-ENTITY IfcReference;
-	TypeIdentifier : OPTIONAL IfcIdentifier;
-	AttributeIdentifier : OPTIONAL IfcIdentifier;
-	InstanceName : OPTIONAL IfcLabel;
-	ListPositions : OPTIONAL LIST [1:?] OF IfcInteger;
-	InnerReference : OPTIONAL IfcReference;
-END_ENTITY;
-
-ENTITY IfcRegularTimeSeries
- SUBTYPE OF (IfcTimeSeries);
-	TimeStep : IfcTimeMeasure;
-	Values : LIST [1:?] OF IfcTimeSeriesValue;
-END_ENTITY;
-
-ENTITY IfcReinforcementBarProperties
- SUBTYPE OF (IfcPreDefinedProperties);
-	TotalCrossSectionArea : IfcAreaMeasure;
-	SteelGrade : IfcLabel;
-	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
-	EffectiveDepth : OPTIONAL IfcLengthMeasure;
-	NominalBarDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	BarCount : OPTIONAL IfcCountMeasure;
-END_ENTITY;
-
-ENTITY IfcReinforcementDefinitionProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	DefinitionType : OPTIONAL IfcLabel;
-	ReinforcementSectionDefinitions : LIST [1:?] OF IfcSectionReinforcementProperties;
-END_ENTITY;
-
-ENTITY IfcReinforcingBar
- SUBTYPE OF (IfcReinforcingElement);
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	CrossSectionArea : OPTIONAL IfcAreaMeasure;
-	BarLength : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcReinforcingBarTypeEnum;
-	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
- WHERE
-	CorrectPredefinedType : NOT EXISTS(PredefinedType) OR
-(PredefinedType <> IfcReinforcingBarTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcReinforcingBarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCREINFORCINGBARTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcReinforcingBarType
- SUBTYPE OF (IfcReinforcingElementType);
-	PredefinedType : IfcReinforcingBarTypeEnum;
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	CrossSectionArea : OPTIONAL IfcAreaMeasure;
-	BarLength : OPTIONAL IfcPositiveLengthMeasure;
-	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
-	BendingShapeCode : OPTIONAL IfcLabel;
-	BendingParameters : OPTIONAL LIST [1:?] OF IfcBendingParameterSelect;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcReinforcingBarTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcReinforcingBarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-	BendingShapeCodeProvided : NOT EXISTS(BendingParameters) OR EXISTS(BendingShapeCode);
-END_ENTITY;
-
-ENTITY IfcReinforcingElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcReinforcingBar
-    ,IfcReinforcingMesh
-    ,IfcTendon
-    ,IfcTendonAnchor))
- SUBTYPE OF (IfcElementComponent);
-	SteelGrade : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcReinforcingElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcReinforcingBarType
-    ,IfcReinforcingMeshType
-    ,IfcTendonAnchorType
-    ,IfcTendonType))
- SUBTYPE OF (IfcElementComponentType);
-END_ENTITY;
-
-ENTITY IfcReinforcingMesh
- SUBTYPE OF (IfcReinforcingElement);
-	MeshLength : OPTIONAL IfcPositiveLengthMeasure;
-	MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
-	LongitudinalBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	TransverseBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	LongitudinalBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
-	TransverseBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
-	LongitudinalBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
-	TransverseBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcReinforcingMeshTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT EXISTS(PredefinedType) OR
-(PredefinedType <> IfcReinforcingMeshTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcReinforcingMeshTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCREINFORCINGMESHTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcReinforcingMeshType
- SUBTYPE OF (IfcReinforcingElementType);
-	PredefinedType : IfcReinforcingMeshTypeEnum;
-	MeshLength : OPTIONAL IfcPositiveLengthMeasure;
-	MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
-	LongitudinalBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	TransverseBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	LongitudinalBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
-	TransverseBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
-	LongitudinalBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
-	TransverseBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
-	BendingShapeCode : OPTIONAL IfcLabel;
-	BendingParameters : OPTIONAL LIST [1:?] OF IfcBendingParameterSelect;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcReinforcingMeshTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcReinforcingMeshTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-	BendingShapeCodeProvided : NOT EXISTS(BendingParameters) OR EXISTS(BendingShapeCode);
-END_ENTITY;
-
-ENTITY IfcRelAggregates
- SUBTYPE OF (IfcRelDecomposes);
-	RelatingObject : IfcObjectDefinition;
-	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
-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 IfcRelAssignsToActor
- SUBTYPE OF (IfcRelAssigns);
-	RelatingActor : IfcActor;
-	ActingRole : OPTIONAL IfcActorRole;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingActor :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToControl
- SUBTYPE OF (IfcRelAssigns);
-	RelatingControl : IfcControl;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingControl :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToGroup
- SUPERTYPE OF (ONEOF
-    (IfcRelAssignsToGroupByFactor))
- SUBTYPE OF (IfcRelAssigns);
-	RelatingGroup : IfcGroup;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingGroup :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToGroupByFactor
- SUBTYPE OF (IfcRelAssignsToGroup);
-	Factor : IfcRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToProcess
- SUBTYPE OF (IfcRelAssigns);
-	RelatingProcess : IfcProcessSelect;
-	QuantityInProcess : OPTIONAL IfcMeasureWithUnit;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProcess :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToProduct
- SUBTYPE OF (IfcRelAssigns);
-	RelatingProduct : IfcProductSelect;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProduct :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssignsToResource
- SUBTYPE OF (IfcRelAssigns);
-	RelatingResource : IfcResourceSelect;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingResource :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelAssociates
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcRelAssociatesApproval
-    ,IfcRelAssociatesClassification
-    ,IfcRelAssociatesConstraint
-    ,IfcRelAssociatesDocument
-    ,IfcRelAssociatesLibrary
-    ,IfcRelAssociatesMaterial))
- SUBTYPE OF (IfcRelationship);
-	RelatedObjects : SET [1:?] OF IfcDefinitionSelect;
-END_ENTITY;
-
-ENTITY IfcRelAssociatesApproval
- SUBTYPE OF (IfcRelAssociates);
-	RelatingApproval : IfcApproval;
-END_ENTITY;
-
-ENTITY IfcRelAssociatesClassification
- SUBTYPE OF (IfcRelAssociates);
-	RelatingClassification : IfcClassificationSelect;
-END_ENTITY;
-
-ENTITY IfcRelAssociatesConstraint
- SUBTYPE OF (IfcRelAssociates);
-	Intent : OPTIONAL 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
-	NoVoidElement : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | 
-  ('IFC4.IFCFEATUREELEMENTSUBTRACTION' IN TYPEOF(temp)) OR 
-  ('IFC4.IFCVIRTUALELEMENT' IN TYPEOF(temp)) 
-)) = 0;
-	AllowedElements : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | (
-  SIZEOF(TYPEOF(temp) * [   
-    'IFC4.IFCELEMENT', 
-    'IFC4.IFCELEMENTTYPE',
-    'IFC4.IFCWINDOWSTYLE',
-    'IFC4.IFCDOORSTYLE',
-    'IFC4.IFCSTRUCTURALMEMBER',
-    'IFC4.IFCPORT']) = 0) 
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelConnects
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcRelConnectsElements
-    ,IfcRelConnectsPortToElement
-    ,IfcRelConnectsPorts
-    ,IfcRelConnectsStructuralActivity
-    ,IfcRelConnectsStructuralMember
-    ,IfcRelContainedInSpatialStructure
-    ,IfcRelCoversBldgElements
-    ,IfcRelCoversSpaces
-    ,IfcRelFillsElement
-    ,IfcRelFlowControlElements
-    ,IfcRelInterferesElements
-    ,IfcRelReferencedInSpatialStructure
-    ,IfcRelSequence
-    ,IfcRelServicesBuildings
-    ,IfcRelSpaceBoundary))
- SUBTYPE OF (IfcRelationship);
-END_ENTITY;
-
-ENTITY IfcRelConnectsElements
- SUPERTYPE OF (ONEOF
-    (IfcRelConnectsPathElements
-    ,IfcRelConnectsWithRealizingElements))
- SUBTYPE OF (IfcRelConnects);
-	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
-	RelatingElement : IfcElement;
-	RelatedElement : IfcElement;
- WHERE
-	NoSelfReference : RelatingElement :<>: RelatedElement;
-END_ENTITY;
-
-ENTITY IfcRelConnectsPathElements
- SUBTYPE OF (IfcRelConnectsElements);
-	RelatingPriorities : LIST [0:?] OF IfcInteger;
-	RelatedPriorities : LIST [0:?] OF IfcInteger;
-	RelatedConnectionType : IfcConnectionTypeEnum;
-	RelatingConnectionType : IfcConnectionTypeEnum;
- WHERE
-	NormalizedRelatingPriorities : (SIZEOF(RelatingPriorities) = 0)
-OR
-(SIZEOF (QUERY (temp <* RelatingPriorities
-  | {0 <= temp <= 100}
-  )) = SIZEOF(RelatingPriorities));
-	NormalizedRelatedPriorities : (SIZEOF(RelatedPriorities) = 0)
-OR
-(SIZEOF (QUERY (temp <* RelatedPriorities
-  | {0 <= temp <= 100}
-  )) = SIZEOF(RelatedPriorities));
-END_ENTITY;
-
-ENTITY IfcRelConnectsPortToElement
- SUBTYPE OF (IfcRelConnects);
-	RelatingPort : IfcPort;
-	RelatedElement : IfcDistributionElement;
-END_ENTITY;
-
-ENTITY IfcRelConnectsPorts
- SUBTYPE OF (IfcRelConnects);
-	RelatingPort : IfcPort;
-	RelatedPort : IfcPort;
-	RealizingElement : OPTIONAL IfcElement;
- WHERE
-	NoSelfReference : RelatingPort :<>: RelatedPort;
-END_ENTITY;
-
-ENTITY IfcRelConnectsStructuralActivity
- SUBTYPE OF (IfcRelConnects);
-	RelatingElement : IfcStructuralActivityAssignmentSelect;
-	RelatedStructuralActivity : IfcStructuralActivity;
-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 : IfcSpatialElement;
- WHERE
-	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC4.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);
-	RelatingSpace : IfcSpace;
-	RelatedCoverings : SET [1:?] OF IfcCovering;
-END_ENTITY;
-
-ENTITY IfcRelDeclares
- SUBTYPE OF (IfcRelationship);
-	RelatingContext : IfcContext;
-	RelatedDefinitions : SET [1:?] OF IfcDefinitionSelect;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* RelatedDefinitions | RelatingContext :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelDecomposes
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcRelAggregates
-    ,IfcRelNests
-    ,IfcRelProjectsElement
-    ,IfcRelVoidsElement))
- SUBTYPE OF (IfcRelationship);
-END_ENTITY;
-
-ENTITY IfcRelDefines
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcRelDefinesByObject
-    ,IfcRelDefinesByProperties
-    ,IfcRelDefinesByTemplate
-    ,IfcRelDefinesByType))
- SUBTYPE OF (IfcRelationship);
-END_ENTITY;
-
-ENTITY IfcRelDefinesByObject
- SUBTYPE OF (IfcRelDefines);
-	RelatedObjects : SET [1:?] OF IfcObject;
-	RelatingObject : IfcObject;
-END_ENTITY;
-
-ENTITY IfcRelDefinesByProperties
- SUBTYPE OF (IfcRelDefines);
-	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
-	RelatingPropertyDefinition : IfcPropertySetDefinitionSelect;
- WHERE
-	NoRelatedTypeObject : SIZEOF(QUERY(Types <* SELF\IfcRelDefinesByProperties.RelatedObjects |  'IFC4.IFCTYPEOBJECT' IN TYPEOF(Types))) = 0;
-END_ENTITY;
-
-ENTITY IfcRelDefinesByTemplate
- SUBTYPE OF (IfcRelDefines);
-	RelatedPropertySets : SET [1:?] OF IfcPropertySetDefinition;
-	RelatingTemplate : IfcPropertySetTemplate;
-END_ENTITY;
-
-ENTITY IfcRelDefinesByType
- SUBTYPE OF (IfcRelDefines);
-	RelatedObjects : SET [1:?] OF IfcObject;
-	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 IfcRelInterferesElements
- SUBTYPE OF (IfcRelConnects);
-	RelatingElement : IfcElement;
-	RelatedElement : IfcElement;
-	InterferenceGeometry : OPTIONAL IfcConnectionGeometry;
-	InterferenceType : OPTIONAL IfcIdentifier;
-	ImpliedOrder : LOGICAL;
- WHERE
-	NotSelfReference : RelatingElement :<>: RelatedElement;
-END_ENTITY;
-
-ENTITY IfcRelNests
- SUBTYPE OF (IfcRelDecomposes);
-	RelatingObject : IfcObjectDefinition;
-	RelatedObjects : LIST [1:?] OF IfcObjectDefinition;
- WHERE
-	NoSelfReference : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelProjectsElement
- SUBTYPE OF (IfcRelDecomposes);
-	RelatingElement : IfcElement;
-	RelatedFeatureElement : IfcFeatureElementAddition;
-END_ENTITY;
-
-ENTITY IfcRelReferencedInSpatialStructure
- SUBTYPE OF (IfcRelConnects);
-	RelatedElements : SET [1:?] OF IfcProduct;
-	RelatingStructure : IfcSpatialElement;
- WHERE
-	AllowedRelatedElements : SIZEOF(QUERY(temp <* RelatedElements | ('IFC4.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF(temp)) AND (NOT ('IFC4.IFCSPACE' IN TYPEOF(temp)))
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcRelSequence
- SUBTYPE OF (IfcRelConnects);
-	RelatingProcess : IfcProcess;
-	RelatedProcess : IfcProcess;
-	TimeLag : OPTIONAL IfcLagTime;
-	SequenceType : OPTIONAL IfcSequenceEnum;
-	UserDefinedSequenceType : OPTIONAL IfcLabel;
- WHERE
-	AvoidInconsistentSequence : RelatingProcess :<>: RelatedProcess;
-	CorrectSequenceType : (SequenceType <> IfcSequenceEnum.USERDEFINED) OR ((SequenceType = IfcSequenceEnum.USERDEFINED) AND EXISTS(UserDefinedSequenceType));
-END_ENTITY;
-
-ENTITY IfcRelServicesBuildings
- SUBTYPE OF (IfcRelConnects);
-	RelatingSystem : IfcSystem;
-	RelatedBuildings : SET [1:?] OF IfcSpatialElement;
-END_ENTITY;
-
-ENTITY IfcRelSpaceBoundary
- SUPERTYPE OF (ONEOF
-    (IfcRelSpaceBoundary1stLevel))
- SUBTYPE OF (IfcRelConnects);
-	RelatingSpace : IfcSpaceBoundarySelect;
-	RelatedBuildingElement : IfcElement;
-	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
-	PhysicalOrVirtualBoundary : IfcPhysicalOrVirtualEnum;
-	InternalOrExternalBoundary : IfcInternalOrExternalEnum;
- WHERE
-	CorrectPhysOrVirt : ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Physical) 
-  AND (NOT('IFC4.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
-OR 
-((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Virtual) 
-  AND (('IFC4.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)) 
-  OR   ('IFC4.IFCOPENINGELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
-OR 
-(PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.NotDefined);
-END_ENTITY;
-
-ENTITY IfcRelSpaceBoundary1stLevel
- SUPERTYPE OF (ONEOF
-    (IfcRelSpaceBoundary2ndLevel))
- SUBTYPE OF (IfcRelSpaceBoundary);
-	ParentBoundary : OPTIONAL IfcRelSpaceBoundary1stLevel;
- INVERSE
-	InnerBoundaries : SET [0:?] OF IfcRelSpaceBoundary1stLevel FOR ParentBoundary;
-END_ENTITY;
-
-ENTITY IfcRelSpaceBoundary2ndLevel
- SUBTYPE OF (IfcRelSpaceBoundary1stLevel);
-	CorrespondingBoundary : OPTIONAL IfcRelSpaceBoundary2ndLevel;
- INVERSE
-	Corresponds : SET [0:1] OF IfcRelSpaceBoundary2ndLevel FOR CorrespondingBoundary;
-END_ENTITY;
-
-ENTITY IfcRelVoidsElement
- SUBTYPE OF (IfcRelDecomposes);
-	RelatingBuildingElement : IfcElement;
-	RelatedOpeningElement : IfcFeatureElementSubtraction;
-END_ENTITY;
-
-ENTITY IfcRelationship
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcRelAssigns
-    ,IfcRelAssociates
-    ,IfcRelConnects
-    ,IfcRelDeclares
-    ,IfcRelDecomposes
-    ,IfcRelDefines))
- SUBTYPE OF (IfcRoot);
-END_ENTITY;
-
-ENTITY IfcReparametrisedCompositeCurveSegment
- SUBTYPE OF (IfcCompositeCurveSegment);
-	ParamLength : IfcParameterValue;
- WHERE
-	PositiveLengthParameter : ParamLength > 0.0;
-END_ENTITY;
-
-ENTITY IfcRepresentation
- ABSTRACT 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:?] OF IfcProductRepresentation FOR Representations;
-END_ENTITY;
-
-ENTITY IfcRepresentationContext
- ABSTRACT 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
-	LayerAssignment : SET [0:1] OF IfcPresentationLayerAssignment FOR AssignedItems;
-	StyledByItem : SET [0:1] OF IfcStyledItem FOR Item;
-END_ENTITY;
-
-ENTITY IfcRepresentationMap;
-	MappingOrigin : IfcAxis2Placement;
-	MappedRepresentation : IfcRepresentation;
- INVERSE
-	HasShapeAspects : SET [0:?] OF IfcShapeAspect FOR PartOfProductDefinitionShape;
-	MapUsage : SET [0:?] OF IfcMappedItem FOR MappingSource;
- WHERE
-	ApplicableMappedRepr : 'IFC4.IFCSHAPEMODEL' IN TYPEOF(MappedRepresentation);
-END_ENTITY;
-
-ENTITY IfcResource
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcConstructionResource))
- SUBTYPE OF (IfcObject);
-	Identification : OPTIONAL IfcIdentifier;
-	LongDescription : OPTIONAL IfcText;
- INVERSE
-	ResourceOf : SET [0:?] OF IfcRelAssignsToResource FOR RelatingResource;
-END_ENTITY;
-
-ENTITY IfcResourceApprovalRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
-	RelatingApproval : IfcApproval;
-END_ENTITY;
-
-ENTITY IfcResourceConstraintRelationship
- SUBTYPE OF (IfcResourceLevelRelationship);
-	RelatingConstraint : IfcConstraint;
-	RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
-END_ENTITY;
-
-ENTITY IfcResourceLevelRelationship
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcApprovalRelationship
-    ,IfcCurrencyRelationship
-    ,IfcDocumentInformationRelationship
-    ,IfcExternalReferenceRelationship
-    ,IfcMaterialRelationship
-    ,IfcOrganizationRelationship
-    ,IfcPropertyDependencyRelationship
-    ,IfcResourceApprovalRelationship
-    ,IfcResourceConstraintRelationship));
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-END_ENTITY;
-
-ENTITY IfcResourceTime
- SUBTYPE OF (IfcSchedulingTime);
-	ScheduleWork : OPTIONAL IfcDuration;
-	ScheduleUsage : OPTIONAL IfcPositiveRatioMeasure;
-	ScheduleStart : OPTIONAL IfcDateTime;
-	ScheduleFinish : OPTIONAL IfcDateTime;
-	ScheduleContour : OPTIONAL IfcLabel;
-	LevelingDelay : OPTIONAL IfcDuration;
-	IsOverAllocated : OPTIONAL IfcBoolean;
-	StatusTime : OPTIONAL IfcDateTime;
-	ActualWork : OPTIONAL IfcDuration;
-	ActualUsage : OPTIONAL IfcPositiveRatioMeasure;
-	ActualStart : OPTIONAL IfcDateTime;
-	ActualFinish : OPTIONAL IfcDateTime;
-	RemainingWork : OPTIONAL IfcDuration;
-	RemainingUsage : OPTIONAL IfcPositiveRatioMeasure;
-	Completion : OPTIONAL IfcPositiveRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcRevolvedAreaSolid
- SUPERTYPE OF (ONEOF
-    (IfcRevolvedAreaSolidTapered))
- SUBTYPE OF (IfcSweptAreaSolid);
-	Axis : IfcAxis1Placement;
-	Angle : IfcPlaneAngleMeasure;
- DERIVE
-	AxisLine : IfcLine := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcCurve() || IfcLine(Axis.Location, 
-  IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Axis.Z,1.0));
- WHERE
-	AxisStartInXY : Axis.Location.Coordinates[3] = 0.0;
-	AxisDirectionInXY : Axis.Z.DirectionRatios[3] = 0.0;
-END_ENTITY;
-
-ENTITY IfcRevolvedAreaSolidTapered
- SUBTYPE OF (IfcRevolvedAreaSolid);
-	EndSweptArea : IfcProfileDef;
- WHERE
-	CorrectProfileAssignment : IfcTaperedSweptAreaProfiles(SELF\IfcSweptAreaSolid.SweptArea, SELF.EndSweptArea);
-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);
-	PredefinedType : OPTIONAL IfcRoofTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcRoofTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcRoofTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCROOFTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcRoofType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcRoofTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcRoofTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcRoofTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcRoot
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcObjectDefinition
-    ,IfcPropertyDefinition
-    ,IfcRelationship));
-	GlobalId : IfcGloballyUniqueId;
-	OwnerHistory : OPTIONAL IfcOwnerHistory;
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
- UNIQUE
-	UR1 : GlobalId;
-END_ENTITY;
-
-ENTITY IfcRoundedRectangleProfileDef
- SUBTYPE OF (IfcRectangleProfileDef);
-	RoundingRadius : IfcPositiveLengthMeasure;
- WHERE
-	ValidRadius : ((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 IfcSanitaryTerminal
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcSanitaryTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSanitaryTerminalTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSanitaryTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCSANITARYTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSanitaryTerminalType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcSanitaryTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSanitaryTerminalTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSanitaryTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSchedulingTime
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcEventTime
-    ,IfcLagTime
-    ,IfcResourceTime
-    ,IfcTaskTime
-    ,IfcWorkTime));
-	Name : OPTIONAL IfcLabel;
-	DataOrigin : OPTIONAL IfcDataOriginEnum;
-	UserDefinedDataOrigin : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcSeamCurve
- SUBTYPE OF (IfcSurfaceCurve);
- WHERE
-	TwoPCurves : SIZEOF(SELF\IfcSurfaceCurve.AssociatedGeometry) = 2;
-	SameSurface : IfcAssociatedSurface(SELF\IfcSurfaceCurve.AssociatedGeometry[1]) = IfcAssociatedSurface(SELF\IfcSurfaceCurve.AssociatedGeometry[2]);
-END_ENTITY;
-
-ENTITY IfcSectionProperties
- SUBTYPE OF (IfcPreDefinedProperties);
-	SectionType : IfcSectionTypeEnum;
-	StartProfile : IfcProfileDef;
-	EndProfile : OPTIONAL IfcProfileDef;
-END_ENTITY;
-
-ENTITY IfcSectionReinforcementProperties
- SUBTYPE OF (IfcPreDefinedProperties);
-	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
-	CorrespondingSectionPositions : SIZEOF(CrossSections) = SIZEOF(CrossSectionPositions);
-	ConsistentProfileTypes : SIZEOF(QUERY(temp <* CrossSections | CrossSections[1].ProfileType <> temp.ProfileType)) = 0;
-	SpineCurveDim : SpineCurve.Dim = 3;
-END_ENTITY;
-
-ENTITY IfcSensor
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcSensorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSensorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSensorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCSENSORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSensorType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcSensorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSensorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSensorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcShadingDevice
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcShadingDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcShadingDeviceTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcShadingDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSHADINGDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcShadingDeviceType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcShadingDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcShadingDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcShadingDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcShapeAspect;
-	ShapeRepresentations : LIST [1:?] OF IfcShapeModel;
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	ProductDefinitional : IfcLogical;
-	PartOfProductDefinitionShape : OPTIONAL IfcProductRepresentationSelect;
-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
-	CorrectContext : 'IFC4.IFCGEOMETRICREPRESENTATIONCONTEXT' 
-IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
-	NoTopologicalItem : SIZEOF(QUERY(temp <* Items | 
-  ('IFC4.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
-    AND (NOT(SIZEOF(
-      ['IFC4.IFCVERTEXPOINT',
-       'IFC4.IFCEDGECURVE',
-       'IFC4.IFCFACESURFACE'] * TYPEOF(temp)) = 1))
-)) = 0;
-	HasRepresentationType : EXISTS(SELF\IfcRepresentation.RepresentationType);
-	HasRepresentationIdentifier : EXISTS(SELF\IfcRepresentation.RepresentationIdentifier);
-	CorrectItemsForType : 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 IfcSimplePropertyTemplate
- SUBTYPE OF (IfcPropertyTemplate);
-	TemplateType : OPTIONAL IfcSimplePropertyTemplateTypeEnum;
-	PrimaryMeasureType : OPTIONAL IfcLabel;
-	SecondaryMeasureType : OPTIONAL IfcLabel;
-	Enumerators : OPTIONAL IfcPropertyEnumeration;
-	PrimaryUnit : OPTIONAL IfcUnit;
-	SecondaryUnit : OPTIONAL IfcUnit;
-	Expression : OPTIONAL IfcLabel;
-	AccessState : OPTIONAL IfcStateEnum;
-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
- SUPERTYPE OF (ONEOF
-    (IfcSlabElementedCase
-    ,IfcSlabStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcSlabTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSLABTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSlabElementedCase
- SUBTYPE OF (IfcSlab);
- WHERE
-	HasDecomposition : HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) > 0;
-END_ENTITY;
-
-ENTITY IfcSlabStandardCase
- SUBTYPE OF (IfcSlab);
- WHERE
-	HasMaterialLayerSetusage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcSlabType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcSlabTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSlippageConnectionCondition
- SUBTYPE OF (IfcStructuralConnectionCondition);
-	SlippageX : OPTIONAL IfcLengthMeasure;
-	SlippageY : OPTIONAL IfcLengthMeasure;
-	SlippageZ : OPTIONAL IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcSolarDevice
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcSolarDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSolarDeviceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSolarDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCSOLARDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSolarDeviceType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcSolarDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSolarDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSolarDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSolidModel
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcCsgSolid
-    ,IfcManifoldSolidBrep
-    ,IfcSweptAreaSolid
-    ,IfcSweptDiskSolid))
- SUBTYPE OF (IfcGeometricRepresentationItem);
- DERIVE
-	Dim : IfcDimensionCount := 3;
-END_ENTITY;
-
-ENTITY IfcSpace
- SUBTYPE OF (IfcSpatialStructureElement);
-	PredefinedType : OPTIONAL IfcSpaceTypeEnum;
-	ElevationWithFlooring : OPTIONAL IfcLengthMeasure;
- INVERSE
-	HasCoverings : SET [0:?] OF IfcRelCoversSpaces FOR RelatingSpace;
-	BoundedBy : SET [0:?] OF IfcRelSpaceBoundary FOR RelatingSpace;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcSpaceTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcSpaceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSPACETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSpaceHeater
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcSpaceHeaterTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSpaceHeaterTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSpaceHeaterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCSPACEHEATERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSpaceHeaterType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcSpaceHeaterTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSpaceHeaterTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSpaceHeaterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSpaceType
- SUBTYPE OF (IfcSpatialStructureElementType);
-	PredefinedType : IfcSpaceTypeEnum;
-	LongName : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSpaceTypeEnum.USERDEFINED) OR 
-((PredefinedType = IfcSpaceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcSpatialElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSpatialElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcExternalSpatialStructureElement
-    ,IfcSpatialStructureElement
-    ,IfcSpatialZone))
- SUBTYPE OF (IfcProduct);
-	LongName : OPTIONAL IfcLabel;
- INVERSE
-	ContainsElements : SET [0:?] OF IfcRelContainedInSpatialStructure FOR RelatingStructure;
-	ServicedBySystems : SET [0:?] OF IfcRelServicesBuildings FOR RelatedBuildings;
-	ReferencesElements : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatingStructure;
-END_ENTITY;
-
-ENTITY IfcSpatialElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcSpatialStructureElementType
-    ,IfcSpatialZoneType))
- SUBTYPE OF (IfcTypeProduct);
-	ElementType : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcSpatialStructureElement
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBuilding
-    ,IfcBuildingStorey
-    ,IfcSite
-    ,IfcSpace))
- SUBTYPE OF (IfcSpatialElement);
-	CompositionType : OPTIONAL IfcElementCompositionEnum;
- WHERE
-	WR41 : (HIINDEX(SELF\IfcObjectDefinition.Decomposes) = 1) 
-AND
-('IFC4.IFCRELAGGREGATES' IN TYPEOF(SELF\IfcObjectDefinition.Decomposes[1])) 
-AND
-(('IFC4.IFCPROJECT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject)) OR
- ('IFC4.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject))
-);
-END_ENTITY;
-
-ENTITY IfcSpatialStructureElementType
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcSpaceType))
- SUBTYPE OF (IfcSpatialElementType);
-END_ENTITY;
-
-ENTITY IfcSpatialZone
- SUBTYPE OF (IfcSpatialElement);
-	PredefinedType : OPTIONAL IfcSpatialZoneTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcSpatialZoneTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcSpatialZoneTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSPATIALZONETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSpatialZoneType
- SUBTYPE OF (IfcSpatialElementType);
-	PredefinedType : IfcSpatialZoneTypeEnum;
-	LongName : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSpatialZoneTypeEnum.USERDEFINED) OR 
-((PredefinedType = IfcSpatialZoneTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcSpatialElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSphere
- SUBTYPE OF (IfcCsgPrimitive3D);
-	Radius : IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcSphericalSurface
- SUBTYPE OF (IfcElementarySurface);
-	Radius : IfcPositiveLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcStackTerminal
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcStackTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcStackTerminalTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcStackTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCSTACKTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcStackTerminalType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcStackTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcStackTerminalTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcStackTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcStair
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcStairTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcStairTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcStairTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSTAIRTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcStairFlight
- SUBTYPE OF (IfcBuildingElement);
-	NumberOfRisers : OPTIONAL IfcInteger;
-	NumberOfTreads : OPTIONAL IfcInteger;
-	RiserHeight : OPTIONAL IfcPositiveLengthMeasure;
-	TreadLength : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcStairFlightTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcStairFlightTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcStairFlightTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCSTAIRFLIGHTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcStairFlightType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcStairFlightTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcStairFlightTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcStairFlightTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcStairType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcStairTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcStairTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcStairTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcStructuralAction
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralCurveAction
-    ,IfcStructuralPointAction
-    ,IfcStructuralSurfaceAction))
- SUBTYPE OF (IfcStructuralActivity);
-	DestabilizingLoad : OPTIONAL IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcStructuralActivity
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralAction
-    ,IfcStructuralReaction))
- SUBTYPE OF (IfcProduct);
-	AppliedLoad : IfcStructuralLoad;
-	GlobalOrLocal : IfcGlobalOrLocalEnum;
- INVERSE
-	AssignedToStructuralItem : SET [0:1] OF 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;
-	SharedPlacement : OPTIONAL IfcObjectPlacement;
- WHERE
-	HasObjectType : (PredefinedType <> IfcAnalysisModelTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-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 IfcStructuralCurveAction
- SUPERTYPE OF (ONEOF
-    (IfcStructuralLinearAction))
- SUBTYPE OF (IfcStructuralAction);
-	ProjectedOrTrue : OPTIONAL IfcProjectedOrTrueLengthEnum;
-	PredefinedType : IfcStructuralCurveActivityTypeEnum;
- WHERE
-	ProjectedIsGlobal : (NOT EXISTS(ProjectedOrTrue)) OR
-((ProjectedOrTrue <> PROJECTED_LENGTH) OR
- (SELF\IfcStructuralActivity.GlobalOrLocal = GLOBAL_COORDS));
-	HasObjectType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-	SuitablePredefinedType : PredefinedType <> IfcStructuralCurveActivityTypeEnum.EQUIDISTANT;
-END_ENTITY;
-
-ENTITY IfcStructuralCurveConnection
- SUBTYPE OF (IfcStructuralConnection);
-	Axis : IfcDirection;
-END_ENTITY;
-
-ENTITY IfcStructuralCurveMember
- SUPERTYPE OF (ONEOF
-    (IfcStructuralCurveMemberVarying))
- SUBTYPE OF (IfcStructuralMember);
-	PredefinedType : IfcStructuralCurveMemberTypeEnum;
-	Axis : IfcDirection;
- WHERE
-	HasObjectType : (PredefinedType <> IfcStructuralCurveMemberTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcStructuralCurveMemberVarying
- SUBTYPE OF (IfcStructuralCurveMember);
-END_ENTITY;
-
-ENTITY IfcStructuralCurveReaction
- SUBTYPE OF (IfcStructuralReaction);
-	PredefinedType : IfcStructuralCurveActivityTypeEnum;
- WHERE
-	HasObjectType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-	SuitablePredefinedType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.SINUS) AND (PredefinedType <> IfcStructuralCurveActivityTypeEnum.PARABOLA);
-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
- SUBTYPE OF (IfcStructuralCurveAction);
- WHERE
-	SuitableLoadType : SIZEOF(['IFC4.IFCSTRUCTURALLOADLINEARFORCE', 'IFC4.IFCSTRUCTURALLOADTEMPERATURE'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
-	ConstPredefinedType : SELF\IfcStructuralCurveAction.PredefinedType = IfcStructuralCurveActivityTypeEnum.CONST;
-END_ENTITY;
-
-ENTITY IfcStructuralLoad
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralLoadConfiguration
-    ,IfcStructuralLoadOrResult));
-	Name : OPTIONAL IfcLabel;
-END_ENTITY;
-
-ENTITY IfcStructuralLoadCase
- SUBTYPE OF (IfcStructuralLoadGroup);
-	SelfWeightCoefficients : OPTIONAL LIST [3:3] OF IfcRatioMeasure;
- WHERE
-	IsLoadCasePredefinedType : SELF\IfcStructuralLoadGroup.PredefinedType = IfcLoadGroupTypeEnum.LOAD_CASE;
-END_ENTITY;
-
-ENTITY IfcStructuralLoadConfiguration
- SUBTYPE OF (IfcStructuralLoad);
-	Values : LIST [1:?] OF IfcStructuralLoadOrResult;
-	Locations : OPTIONAL LIST [1:?] OF UNIQUE LIST [1:2] OF IfcLengthMeasure;
- WHERE
-	ValidListSize : NOT EXISTS(Locations) OR (SIZEOF(Locations) = SIZEOF(Values));
-END_ENTITY;
-
-ENTITY IfcStructuralLoadGroup
- SUPERTYPE OF (ONEOF
-    (IfcStructuralLoadCase))
- SUBTYPE OF (IfcGroup);
-	PredefinedType : IfcLoadGroupTypeEnum;
-	ActionType : IfcActionTypeEnum;
-	ActionSource : IfcActionSourceTypeEnum;
-	Coefficient : OPTIONAL IfcRatioMeasure;
-	Purpose : OPTIONAL IfcLabel;
- INVERSE
-	SourceOfResultGroup : SET [0:1] OF IfcStructuralResultGroup FOR ResultForLoadGroup;
-	LoadGroupFor : SET [0:?] OF IfcStructuralAnalysisModel FOR LoadedBy;
- WHERE
-	HasObjectType : (
-  (PredefinedType <> IfcLoadGroupTypeEnum.USERDEFINED) AND
-  (ActionType <> IfcActionTypeEnum.USERDEFINED) AND
-  (ActionSource <> IfcActionSourceTypeEnum.USERDEFINED)
-) OR EXISTS(SELF\IfcObject.ObjectType);
-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 IfcStructuralLoadOrResult
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralLoadStatic
-    ,IfcSurfaceReinforcementArea))
- SUBTYPE OF (IfcStructuralLoad);
-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 (IfcStructuralLoadOrResult);
-END_ENTITY;
-
-ENTITY IfcStructuralLoadTemperature
- SUBTYPE OF (IfcStructuralLoadStatic);
-	DeltaTConstant : OPTIONAL IfcThermodynamicTemperatureMeasure;
-	DeltaTY : OPTIONAL IfcThermodynamicTemperatureMeasure;
-	DeltaTZ : OPTIONAL IfcThermodynamicTemperatureMeasure;
-END_ENTITY;
-
-ENTITY IfcStructuralMember
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralCurveMember
-    ,IfcStructuralSurfaceMember))
- SUBTYPE OF (IfcStructuralItem);
- INVERSE
-	ConnectedBy : SET [0:?] OF IfcRelConnectsStructuralMember FOR RelatingStructuralMember;
-END_ENTITY;
-
-ENTITY IfcStructuralPlanarAction
- SUBTYPE OF (IfcStructuralSurfaceAction);
- WHERE
-	SuitableLoadType : SIZEOF(['IFC4.IFCSTRUCTURALLOADPLANARFORCE', 'IFC4.IFCSTRUCTURALLOADTEMPERATURE'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
-	ConstPredefinedType : SELF\IfcStructuralSurfaceAction.PredefinedType = IfcStructuralSurfaceActivityTypeEnum.CONST;
-END_ENTITY;
-
-ENTITY IfcStructuralPointAction
- SUBTYPE OF (IfcStructuralAction);
- WHERE
-	SuitableLoadType : SIZEOF(['IFC4.IFCSTRUCTURALLOADSINGLEFORCE', 'IFC4.IFCSTRUCTURALLOADSINGLEDISPLACEMENT'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
-END_ENTITY;
-
-ENTITY IfcStructuralPointConnection
- SUBTYPE OF (IfcStructuralConnection);
-	ConditionCoordinateSystem : OPTIONAL IfcAxis2Placement3D;
-END_ENTITY;
-
-ENTITY IfcStructuralPointReaction
- SUBTYPE OF (IfcStructuralReaction);
- WHERE
-	SuitableLoadType : SIZEOF(['IFC4.IFCSTRUCTURALLOADSINGLEFORCE', 'IFC4.IFCSTRUCTURALLOADSINGLEDISPLACEMENT'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
-END_ENTITY;
-
-ENTITY IfcStructuralReaction
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStructuralCurveReaction
-    ,IfcStructuralPointReaction
-    ,IfcStructuralSurfaceReaction))
- SUBTYPE OF (IfcStructuralActivity);
-END_ENTITY;
-
-ENTITY IfcStructuralResultGroup
- SUBTYPE OF (IfcGroup);
-	TheoryType : IfcAnalysisTheoryTypeEnum;
-	ResultForLoadGroup : OPTIONAL IfcStructuralLoadGroup;
-	IsLinear : IfcBoolean;
- INVERSE
-	ResultGroupFor : SET [0:1] OF IfcStructuralAnalysisModel FOR HasResults;
- WHERE
-	HasObjectType : (TheoryType <> IfcAnalysisTheoryTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcStructuralSurfaceAction
- SUPERTYPE OF (ONEOF
-    (IfcStructuralPlanarAction))
- SUBTYPE OF (IfcStructuralAction);
-	ProjectedOrTrue : OPTIONAL IfcProjectedOrTrueLengthEnum;
-	PredefinedType : IfcStructuralSurfaceActivityTypeEnum;
- WHERE
-	ProjectedIsGlobal : (NOT EXISTS(ProjectedOrTrue)) OR
-((ProjectedOrTrue <> PROJECTED_LENGTH) OR
- (SELF\IfcStructuralActivity.GlobalOrLocal = GLOBAL_COORDS));
-	HasObjectType : (PredefinedType <> IfcStructuralSurfaceActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcStructuralSurfaceConnection
- SUBTYPE OF (IfcStructuralConnection);
-END_ENTITY;
-
-ENTITY IfcStructuralSurfaceMember
- SUPERTYPE OF (ONEOF
-    (IfcStructuralSurfaceMemberVarying))
- SUBTYPE OF (IfcStructuralMember);
-	PredefinedType : IfcStructuralSurfaceMemberTypeEnum;
-	Thickness : OPTIONAL IfcPositiveLengthMeasure;
- WHERE
-	HasObjectType : (PredefinedType <> IfcStructuralSurfaceMemberTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcStructuralSurfaceMemberVarying
- SUBTYPE OF (IfcStructuralSurfaceMember);
-END_ENTITY;
-
-ENTITY IfcStructuralSurfaceReaction
- SUBTYPE OF (IfcStructuralReaction);
-	PredefinedType : IfcStructuralSurfaceActivityTypeEnum;
- WHERE
-	HasPredefinedType : (PredefinedType <> IfcStructuralSurfaceActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcStyleModel
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcStyledRepresentation))
- SUBTYPE OF (IfcRepresentation);
-END_ENTITY;
-
-ENTITY IfcStyledItem
- SUBTYPE OF (IfcRepresentationItem);
-	Item : OPTIONAL IfcRepresentationItem;
-	Styles : SET [1:?] OF IfcStyleAssignmentSelect;
-	Name : OPTIONAL IfcLabel;
- WHERE
-	ApplicableItem : NOT('IFC4.IFCSTYLEDITEM' IN TYPEOF(Item));
-END_ENTITY;
-
-ENTITY IfcStyledRepresentation
- SUBTYPE OF (IfcStyleModel);
- WHERE
-	OnlyStyledItems : SIZEOF(QUERY(temp <* SELF\IfcRepresentation.Items | 
-  (NOT('IFC4.IFCSTYLEDITEM' IN TYPEOF(temp)))
-)) = 0;
-END_ENTITY;
-
-ENTITY IfcSubContractResource
- SUBTYPE OF (IfcConstructionResource);
-	PredefinedType : OPTIONAL IfcSubContractResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSubContractResourceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSubContractResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcSubContractResourceType
- SUBTYPE OF (IfcConstructionResourceType);
-	PredefinedType : IfcSubContractResourceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSubContractResourceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSubContractResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
-END_ENTITY;
-
-ENTITY IfcSubedge
- SUBTYPE OF (IfcEdge);
-	ParentEdge : IfcEdge;
-END_ENTITY;
-
-ENTITY IfcSurface
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBoundedSurface
-    ,IfcElementarySurface
-    ,IfcSweptSurface))
- SUBTYPE OF (IfcGeometricRepresentationItem);
- DERIVE
-	Dim : IfcDimensionCount := 3;
-END_ENTITY;
-
-ENTITY IfcSurfaceCurve
- SUPERTYPE OF (ONEOF
-    (IfcIntersectionCurve
-    ,IfcSeamCurve))
- SUBTYPE OF (IfcCurve);
-	Curve3D : IfcCurve;
-	AssociatedGeometry : LIST [1:2] OF IfcPcurve;
-	MasterRepresentation : IfcPreferredSurfaceCurveRepresentation;
- DERIVE
-	BasisSurface : SET [1:2] OF IfcSurface := IfcGetBasisSurface(SELF);
- WHERE
-	CurveIs3D : Curve3D.Dim = 3;
-	CurveIsNotPcurve : NOT ('IFC4.IFCPCURVE' IN TYPEOF(Curve3D));
-END_ENTITY;
-
-ENTITY IfcSurfaceCurveSweptAreaSolid
- SUBTYPE OF (IfcSweptAreaSolid);
-	Directrix : IfcCurve;
-	StartParam : OPTIONAL IfcParameterValue;
-	EndParam : OPTIONAL IfcParameterValue;
-	ReferenceSurface : IfcSurface;
- WHERE
-	DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR 
-(SIZEOF(['IFC4.IFCCONIC', 'IFC4.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
-END_ENTITY;
-
-ENTITY IfcSurfaceFeature
- SUBTYPE OF (IfcFeatureElement);
-	PredefinedType : OPTIONAL IfcSurfaceFeatureTypeEnum;
- WHERE
-	HasObjectType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcSurfaceFeatureTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcSurfaceOfLinearExtrusion
- SUBTYPE OF (IfcSweptSurface);
-	ExtrudedDirection : IfcDirection;
-	Depth : IfcLengthMeasure;
- DERIVE
-	ExtrusionAxis : IfcVector := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (ExtrudedDirection, Depth);
- WHERE
-	DepthGreaterZero : 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 IfcSurfaceReinforcementArea
- SUBTYPE OF (IfcStructuralLoadOrResult);
-	SurfaceReinforcement1 : OPTIONAL LIST [2:3] OF IfcLengthMeasure;
-	SurfaceReinforcement2 : OPTIONAL LIST [2:3] OF IfcLengthMeasure;
-	ShearReinforcement : OPTIONAL IfcRatioMeasure;
- WHERE
-	SurfaceAndOrShearAreaSpecified : EXISTS(SurfaceReinforcement1) OR EXISTS(SurfaceReinforcement2) OR EXISTS(ShearReinforcement);
-	NonnegativeArea1 : (NOT EXISTS(SurfaceReinforcement1)) OR (
-    (SurfaceReinforcement1[1] >= 0.) AND
-    (SurfaceReinforcement1[2] >= 0.) AND
-    ((SIZEOF(SurfaceReinforcement1) = 1) OR (SurfaceReinforcement1[1] >= 0.))
-);
-	NonnegativeArea2 : (NOT EXISTS(SurfaceReinforcement2)) OR (
-    (SurfaceReinforcement2[1] >= 0.) AND
-    (SurfaceReinforcement2[2] >= 0.) AND
-    ((SIZEOF(SurfaceReinforcement2) = 1) OR (SurfaceReinforcement2[1] >= 0.))
-);
-	NonnegativeArea3 : (NOT EXISTS(ShearReinforcement)) OR (ShearReinforcement >= 0.);
-END_ENTITY;
-
-ENTITY IfcSurfaceStyle
- SUBTYPE OF (IfcPresentationStyle);
-	Side : IfcSurfaceSide;
-	Styles : SET [1:5] OF IfcSurfaceStyleElementSelect;
- WHERE
-	MaxOneShading : SIZEOF(QUERY(Style <* SELF.Styles |
-  'IFC4.IFCSURFACESTYLESHADING' IN
-   TYPEOF(Style)
-  )) <= 1;
-	MaxOneLighting : SIZEOF(QUERY(Style <* SELF.Styles |
-  'IFC4.IFCSURFACESTYLELIGHTING' IN
-   TYPEOF(Style)
-  )) <= 1;
-	MaxOneRefraction : SIZEOF(QUERY(Style <* SELF.Styles |
-  'IFC4.IFCSURFACESTYLEREFRACTION' IN
-   TYPEOF(Style)
-  )) <= 1;
-	MaxOneTextures : SIZEOF(QUERY(Style <* SELF.Styles |
-  'IFC4.IFCSURFACESTYLEWITHTEXTURES' IN
-   TYPEOF(Style)
-  )) <= 1;
-	MaxOneExtDefined : SIZEOF(QUERY(Style <* SELF.Styles |
-  'IFC4.IFCEXTERNALLYDEFINEDSURFACESTYLE' IN
-   TYPEOF(Style)
-  )) <= 1;
-END_ENTITY;
-
-ENTITY IfcSurfaceStyleLighting
- SUBTYPE OF (IfcPresentationItem);
-	DiffuseTransmissionColour : IfcColourRgb;
-	DiffuseReflectionColour : IfcColourRgb;
-	TransmissionColour : IfcColourRgb;
-	ReflectanceColour : IfcColourRgb;
-END_ENTITY;
-
-ENTITY IfcSurfaceStyleRefraction
- SUBTYPE OF (IfcPresentationItem);
-	RefractionIndex : OPTIONAL IfcReal;
-	DispersionFactor : OPTIONAL IfcReal;
-END_ENTITY;
-
-ENTITY IfcSurfaceStyleRendering
- SUBTYPE OF (IfcSurfaceStyleShading);
-	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))
- SUBTYPE OF (IfcPresentationItem);
-	SurfaceColour : IfcColourRgb;
-	Transparency : OPTIONAL IfcNormalisedRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcSurfaceStyleWithTextures
- SUBTYPE OF (IfcPresentationItem);
-	Textures : LIST [1:?] OF IfcSurfaceTexture;
-END_ENTITY;
-
-ENTITY IfcSurfaceTexture
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcBlobTexture
-    ,IfcImageTexture
-    ,IfcPixelTexture))
- SUBTYPE OF (IfcPresentationItem);
-	RepeatS : IfcBoolean;
-	RepeatT : IfcBoolean;
-	Mode : OPTIONAL IfcIdentifier;
-	TextureTransform : OPTIONAL IfcCartesianTransformationOperator2D;
-	Parameter : OPTIONAL LIST [1:?] OF IfcIdentifier;
- INVERSE
-	IsMappedBy : SET [0:?] OF IfcTextureCoordinate FOR Maps;
-	UsedInStyles : SET [0:?] OF IfcSurfaceStyleWithTextures FOR Textures;
-END_ENTITY;
-
-ENTITY IfcSweptAreaSolid
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcExtrudedAreaSolid
-    ,IfcFixedReferenceSweptAreaSolid
-    ,IfcRevolvedAreaSolid
-    ,IfcSurfaceCurveSweptAreaSolid))
- SUBTYPE OF (IfcSolidModel);
-	SweptArea : IfcProfileDef;
-	Position : OPTIONAL IfcAxis2Placement3D;
- WHERE
-	SweptAreaType : SweptArea.ProfileType = IfcProfileTypeEnum.Area;
-END_ENTITY;
-
-ENTITY IfcSweptDiskSolid
- SUPERTYPE OF (ONEOF
-    (IfcSweptDiskSolidPolygonal))
- SUBTYPE OF (IfcSolidModel);
-	Directrix : IfcCurve;
-	Radius : IfcPositiveLengthMeasure;
-	InnerRadius : OPTIONAL IfcPositiveLengthMeasure;
-	StartParam : OPTIONAL IfcParameterValue;
-	EndParam : OPTIONAL IfcParameterValue;
- WHERE
-	DirectrixDim : Directrix.Dim = 3;
-	InnerRadiusSize : (NOT EXISTS(InnerRadius)) OR (Radius > InnerRadius);
-	DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR 
-(SIZEOF(['IFC4.IFCCONIC', 'IFC4.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
-END_ENTITY;
-
-ENTITY IfcSweptDiskSolidPolygonal
- SUBTYPE OF (IfcSweptDiskSolid);
-	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
- WHERE
-	CorrectRadii : NOT(EXISTS(FilletRadius)) OR (FilletRadius >= SELF\IfcSweptDiskSolid.Radius);
-	DirectrixIsPolyline : ('IFC4.IFCPOLYLINE' IN TYPEOF(SELF\IfcSweptDiskSolid.Directrix)) OR
-(('IFC4.IFCINDEXEDPOLYCURVE' IN TYPEOF(SELF\IfcSweptDiskSolid.Directrix)) AND NOT(EXISTS(SELF\IfcSweptDiskSolid.Directrix.Segments)));
-END_ENTITY;
-
-ENTITY IfcSweptSurface
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcSurfaceOfLinearExtrusion
-    ,IfcSurfaceOfRevolution))
- SUBTYPE OF (IfcSurface);
-	SweptCurve : IfcProfileDef;
-	Position : OPTIONAL IfcAxis2Placement3D;
- WHERE
-	SweptCurveType : SweptCurve.ProfileType = IfcProfileTypeEnum.Curve;
-END_ENTITY;
-
-ENTITY IfcSwitchingDevice
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcSwitchingDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSwitchingDeviceTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSwitchingDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCSWITCHINGDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSwitchingDeviceType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcSwitchingDeviceTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSwitchingDeviceTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSwitchingDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcSystem
- SUPERTYPE OF (ONEOF
-    (IfcBuildingSystem
-    ,IfcDistributionSystem
-    ,IfcStructuralAnalysisModel
-    ,IfcZone))
- SUBTYPE OF (IfcGroup);
- INVERSE
-	ServicesBuildings : SET [0:1] OF IfcRelServicesBuildings FOR RelatingSystem;
-END_ENTITY;
-
-ENTITY IfcSystemFurnitureElement
- SUBTYPE OF (IfcFurnishingElement);
-	PredefinedType : OPTIONAL IfcSystemFurnitureElementTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcSystemFurnitureElementTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcSystemFurnitureElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-   ('IFC4.IFCSYSTEMFURNITUREELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcSystemFurnitureElementType
- SUBTYPE OF (IfcFurnishingElementType);
-	PredefinedType : OPTIONAL IfcSystemFurnitureElementTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcSystemFurnitureElementTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcSystemFurnitureElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	Depth : IfcPositiveLengthMeasure;
-	FlangeWidth : IfcPositiveLengthMeasure;
-	WebThickness : IfcPositiveLengthMeasure;
-	FlangeThickness : IfcPositiveLengthMeasure;
-	FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	FlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	WebEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	WebSlope : OPTIONAL IfcPlaneAngleMeasure;
-	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
- WHERE
-	ValidFlangeThickness : FlangeThickness < Depth;
-	ValidWebThickness : WebThickness < FlangeWidth;
-END_ENTITY;
-
-ENTITY IfcTable;
-	Name : OPTIONAL IfcLabel;
-	Rows : OPTIONAL LIST [1:?] OF IfcTableRow;
-	Columns : OPTIONAL LIST [1:?] OF IfcTableColumn;
- DERIVE
-	NumberOfCellsInRow : IfcInteger := HIINDEX(Rows[1].RowCells);
-	NumberOfHeadings : IfcInteger := SIZEOF(QUERY( Temp <* Rows | Temp.IsHeading));
-	NumberOfDataRows : IfcInteger := SIZEOF(QUERY( Temp <* Rows | NOT(Temp.IsHeading)));
- WHERE
-	WR1 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
-	WR2 : { 0 <= NumberOfHeadings <= 1 };
-END_ENTITY;
-
-ENTITY IfcTableColumn;
-	Identifier : OPTIONAL IfcIdentifier;
-	Name : OPTIONAL IfcLabel;
-	Description : OPTIONAL IfcText;
-	Unit : OPTIONAL IfcUnit;
-	ReferencePath : OPTIONAL IfcReference;
-END_ENTITY;
-
-ENTITY IfcTableRow;
-	RowCells : OPTIONAL LIST [1:?] OF IfcValue;
-	IsHeading : OPTIONAL IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcTank
- SUBTYPE OF (IfcFlowStorageDevice);
-	PredefinedType : OPTIONAL IfcTankTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcTankTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcTankTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCTANKTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTankType
- SUBTYPE OF (IfcFlowStorageDeviceType);
-	PredefinedType : IfcTankTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTankTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTankTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTask
- SUBTYPE OF (IfcProcess);
-	Status : OPTIONAL IfcLabel;
-	WorkMethod : OPTIONAL IfcLabel;
-	IsMilestone : IfcBoolean;
-	Priority : OPTIONAL IfcInteger;
-	TaskTime : OPTIONAL IfcTaskTime;
-	PredefinedType : OPTIONAL IfcTaskTypeEnum;
- WHERE
-	HasName : EXISTS(SELF\IfcRoot.Name);
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTaskTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTaskTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcTaskTime
- SUPERTYPE OF (ONEOF
-    (IfcTaskTimeRecurring))
- SUBTYPE OF (IfcSchedulingTime);
-	DurationType : OPTIONAL IfcTaskDurationEnum;
-	ScheduleDuration : OPTIONAL IfcDuration;
-	ScheduleStart : OPTIONAL IfcDateTime;
-	ScheduleFinish : OPTIONAL IfcDateTime;
-	EarlyStart : OPTIONAL IfcDateTime;
-	EarlyFinish : OPTIONAL IfcDateTime;
-	LateStart : OPTIONAL IfcDateTime;
-	LateFinish : OPTIONAL IfcDateTime;
-	FreeFloat : OPTIONAL IfcDuration;
-	TotalFloat : OPTIONAL IfcDuration;
-	IsCritical : OPTIONAL IfcBoolean;
-	StatusTime : OPTIONAL IfcDateTime;
-	ActualDuration : OPTIONAL IfcDuration;
-	ActualStart : OPTIONAL IfcDateTime;
-	ActualFinish : OPTIONAL IfcDateTime;
-	RemainingTime : OPTIONAL IfcDuration;
-	Completion : OPTIONAL IfcPositiveRatioMeasure;
-END_ENTITY;
-
-ENTITY IfcTaskTimeRecurring
- SUBTYPE OF (IfcTaskTime);
-	Recurrence : IfcRecurrencePattern;
-END_ENTITY;
-
-ENTITY IfcTaskType
- SUBTYPE OF (IfcTypeProcess);
-	PredefinedType : IfcTaskTypeEnum;
-	WorkMethod : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTaskTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTaskTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType));
-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 IfcURIReference;
-	MessagingIDs : OPTIONAL LIST [1:?] OF IfcURIReference;
- WHERE
-	MinimumDataProvided : EXISTS (TelephoneNumbers) OR
-EXISTS (FacsimileNumbers) OR 
-EXISTS (PagerNumber) OR
-EXISTS (ElectronicMailAddresses) OR 
-EXISTS (WWWHomePageURL) OR
-EXISTS (MessagingIDs);
-END_ENTITY;
-
-ENTITY IfcTendon
- SUBTYPE OF (IfcReinforcingElement);
-	PredefinedType : OPTIONAL IfcTendonTypeEnum;
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	CrossSectionArea : OPTIONAL IfcAreaMeasure;
-	TensionForce : OPTIONAL IfcForceMeasure;
-	PreStress : OPTIONAL IfcPressureMeasure;
-	FrictionCoefficient : OPTIONAL IfcNormalisedRatioMeasure;
-	AnchorageSlip : OPTIONAL IfcPositiveLengthMeasure;
-	MinCurvatureRadius : OPTIONAL IfcPositiveLengthMeasure;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCTENDONTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTendonAnchor
- SUBTYPE OF (IfcReinforcingElement);
-	PredefinedType : OPTIONAL IfcTendonAnchorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
-(PredefinedType <> IfcTendonAnchorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTendonAnchorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-('IFC4.IFCTENDONANCHORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTendonAnchorType
- SUBTYPE OF (IfcReinforcingElementType);
-	PredefinedType : IfcTendonAnchorTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTendonAnchorTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTendonAnchorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTendonType
- SUBTYPE OF (IfcReinforcingElementType);
-	PredefinedType : IfcTendonTypeEnum;
-	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
-	CrossSectionArea : OPTIONAL IfcAreaMeasure;
-	SheathDiameter : OPTIONAL IfcPositiveLengthMeasure;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTessellatedFaceSet
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcPolygonalFaceSet
-    ,IfcTriangulatedFaceSet))
- SUBTYPE OF (IfcTessellatedItem);
-	Coordinates : IfcCartesianPointList3D;
- DERIVE
-	Dim : IfcDimensionCount := 3;
- INVERSE
-	HasColours : SET [0:1] OF IfcIndexedColourMap FOR MappedTo;
-	HasTextures : SET [0:?] OF IfcIndexedTextureMap FOR MappedTo;
-END_ENTITY;
-
-ENTITY IfcTessellatedItem
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcIndexedPolygonalFace
-    ,IfcTessellatedFaceSet))
- SUBTYPE OF (IfcGeometricRepresentationItem);
-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('IFC4.IFCPLANARBOX' IN TYPEOF(Extent));
-END_ENTITY;
-
-ENTITY IfcTextStyle
- SUBTYPE OF (IfcPresentationStyle);
-	TextCharacterAppearance : OPTIONAL IfcTextStyleForDefinedFont;
-	TextStyle : OPTIONAL IfcTextStyleTextModel;
-	TextFontStyle : IfcTextFontSelect;
-	ModelOrDraughting : OPTIONAL IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcTextStyleFontModel
- SUBTYPE OF (IfcPreDefinedTextFont);
-	FontFamily : LIST [1:?] OF IfcTextFontName;
-	FontStyle : OPTIONAL IfcFontStyle;
-	FontVariant : OPTIONAL IfcFontVariant;
-	FontWeight : OPTIONAL IfcFontWeight;
-	FontSize : IfcSizeSelect;
- WHERE
-	MeasureOfFontSize : ('IFC4.IFCLENGTHMEASURE' IN TYPEOF(SELF.FontSize)) AND
-(SELF.FontSize > 0.);
-END_ENTITY;
-
-ENTITY IfcTextStyleForDefinedFont
- SUBTYPE OF (IfcPresentationItem);
-	Colour : IfcColour;
-	BackgroundColour : OPTIONAL IfcColour;
-END_ENTITY;
-
-ENTITY IfcTextStyleTextModel
- SUBTYPE OF (IfcPresentationItem);
-	TextIndent : OPTIONAL IfcSizeSelect;
-	TextAlign : OPTIONAL IfcTextAlignment;
-	TextDecoration : OPTIONAL IfcTextDecoration;
-	LetterSpacing : OPTIONAL IfcSizeSelect;
-	WordSpacing : OPTIONAL IfcSizeSelect;
-	TextTransform : OPTIONAL IfcTextTransformation;
-	LineHeight : OPTIONAL IfcSizeSelect;
-END_ENTITY;
-
-ENTITY IfcTextureCoordinate
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcIndexedTextureMap
-    ,IfcTextureCoordinateGenerator
-    ,IfcTextureMap))
- SUBTYPE OF (IfcPresentationItem);
-	Maps : LIST [1:?] OF IfcSurfaceTexture;
-END_ENTITY;
-
-ENTITY IfcTextureCoordinateGenerator
- SUBTYPE OF (IfcTextureCoordinate);
-	Mode : IfcLabel;
-	Parameter : OPTIONAL LIST [1:?] OF IfcReal;
-END_ENTITY;
-
-ENTITY IfcTextureMap
- SUBTYPE OF (IfcTextureCoordinate);
-	Vertices : LIST [3:?] OF IfcTextureVertex;
-	MappedTo : IfcFace;
-END_ENTITY;
-
-ENTITY IfcTextureVertex
- SUBTYPE OF (IfcPresentationItem);
-	Coordinates : LIST [2:2] OF IfcParameterValue;
-END_ENTITY;
-
-ENTITY IfcTextureVertexList
- SUBTYPE OF (IfcPresentationItem);
-	TexCoordsList : LIST [1:?] OF LIST [2:2] OF IfcParameterValue;
-END_ENTITY;
-
-ENTITY IfcTimePeriod;
-	StartTime : IfcTime;
-	EndTime : IfcTime;
-END_ENTITY;
-
-ENTITY IfcTimeSeries
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcIrregularTimeSeries
-    ,IfcRegularTimeSeries));
-	Name : IfcLabel;
-	Description : OPTIONAL IfcText;
-	StartTime : IfcDateTime;
-	EndTime : IfcDateTime;
-	TimeSeriesDataType : IfcTimeSeriesDataTypeEnum;
-	DataOrigin : IfcDataOriginEnum;
-	UserDefinedDataOrigin : OPTIONAL IfcLabel;
-	Unit : OPTIONAL IfcUnit;
- INVERSE
-	HasExternalReference : SET [1:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
-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('IFC4.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
-)) = 0;
-	WR22 : EXISTS(SELF\IfcRepresentation.RepresentationType);
-	WR23 : IfcTopologyRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
-END_ENTITY;
-
-ENTITY IfcToroidalSurface
- SUBTYPE OF (IfcElementarySurface);
-	MajorRadius : IfcPositiveLengthMeasure;
-	MinorRadius : IfcPositiveLengthMeasure;
- WHERE
-	MajorLargerMinor : MinorRadius < MajorRadius;
-END_ENTITY;
-
-ENTITY IfcTransformer
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcTransformerTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcTransformerTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcTransformerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCTRANFORMERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTransformerType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcTransformerTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTransformerTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTransformerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTransportElement
- SUBTYPE OF (IfcElement);
-	PredefinedType : OPTIONAL IfcTransportElementTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcTransportElementTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcTransportElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCTRANSPORTELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTransportElementType
- SUBTYPE OF (IfcElementType);
-	PredefinedType : IfcTransportElementTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTransportElementTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTransportElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTrapeziumProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	BottomXDim : IfcPositiveLengthMeasure;
-	TopXDim : IfcPositiveLengthMeasure;
-	YDim : IfcPositiveLengthMeasure;
-	TopXOffset : IfcLengthMeasure;
-END_ENTITY;
-
-ENTITY IfcTriangulatedFaceSet
- SUBTYPE OF (IfcTessellatedFaceSet);
-	Normals : OPTIONAL LIST [1:?] OF LIST [3:3] OF IfcParameterValue;
-	Closed : OPTIONAL IfcBoolean;
-	CoordIndex : LIST [1:?] OF LIST [3:3] OF IfcPositiveInteger;
-	PnIndex : OPTIONAL LIST [1:?] OF IfcPositiveInteger;
- DERIVE
-	NumberOfTriangles : IfcInteger := SIZEOF(CoordIndex);
-END_ENTITY;
-
-ENTITY IfcTrimmedCurve
- SUBTYPE OF (IfcBoundedCurve);
-	BasisCurve : IfcCurve;
-	Trim1 : SET [1:2] OF IfcTrimmingSelect;
-	Trim2 : SET [1:2] OF IfcTrimmingSelect;
-	SenseAgreement : IfcBoolean;
-	MasterRepresentation : IfcTrimmingPreference;
- WHERE
-	Trim1ValuesConsistent : (HIINDEX(Trim1) = 1) OR (TYPEOF(Trim1[1]) <> TYPEOF(Trim1[2]));
-	Trim2ValuesConsistent : (HIINDEX(Trim2) = 1) OR (TYPEOF(Trim2[1]) <> TYPEOF(Trim2[2]));
-	NoTrimOfBoundedCurves : NOT('IFC4.IFCBOUNDEDCURVE' IN TYPEOF(BasisCurve));
-END_ENTITY;
-
-ENTITY IfcTubeBundle
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcTubeBundleTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCTUBEBUNDLETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcTubeBundleType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcTubeBundleTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcTypeObject
- SUPERTYPE OF (ONEOF
-    (IfcTypeProcess
-    ,IfcTypeProduct
-    ,IfcTypeResource))
- SUBTYPE OF (IfcObjectDefinition);
-	ApplicableOccurrence : OPTIONAL IfcIdentifier;
-	HasPropertySets : OPTIONAL SET [1:?] OF IfcPropertySetDefinition;
- INVERSE
-	Types : SET [0:1] OF IfcRelDefinesByType FOR RelatingType;
- WHERE
-	NameRequired : EXISTS(SELF\IfcRoot.Name);
-	UniquePropertySetNames : (NOT(EXISTS(HasPropertySets))) OR IfcUniquePropertySetNames(HasPropertySets);
-END_ENTITY;
-
-ENTITY IfcTypeProcess
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcEventType
-    ,IfcProcedureType
-    ,IfcTaskType))
- SUBTYPE OF (IfcTypeObject);
-	Identification : OPTIONAL IfcIdentifier;
-	LongDescription : OPTIONAL IfcText;
-	ProcessType : OPTIONAL IfcLabel;
- INVERSE
-	OperatesOn : SET [0:?] OF IfcRelAssignsToProcess FOR RelatingProcess;
-END_ENTITY;
-
-ENTITY IfcTypeProduct
- SUPERTYPE OF (ONEOF
-    (IfcDoorStyle
-    ,IfcElementType
-    ,IfcSpatialElementType
-    ,IfcWindowStyle))
- SUBTYPE OF (IfcTypeObject);
-	RepresentationMaps : OPTIONAL LIST [1:?] OF UNIQUE IfcRepresentationMap;
-	Tag : OPTIONAL IfcLabel;
- INVERSE
-	ReferencedBy : SET [0:?] OF IfcRelAssignsToProduct FOR RelatingProduct;
- WHERE
-	ApplicableOccurrence : NOT(EXISTS(SELF\IfcTypeObject.Types[1])) OR
-(SIZEOF(QUERY(temp <* SELF\IfcTypeObject.Types[1].RelatedObjects |
-  NOT('IFC4.IFCPRODUCT' IN TYPEOF(temp)))
-) = 0);
-END_ENTITY;
-
-ENTITY IfcTypeResource
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcConstructionResourceType))
- SUBTYPE OF (IfcTypeObject);
-	Identification : OPTIONAL IfcIdentifier;
-	LongDescription : OPTIONAL IfcText;
-	ResourceType : OPTIONAL IfcLabel;
- INVERSE
-	ResourceOf : SET [0:?] OF IfcRelAssignsToResource FOR RelatingResource;
-END_ENTITY;
-
-ENTITY IfcUShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	Depth : IfcPositiveLengthMeasure;
-	FlangeWidth : IfcPositiveLengthMeasure;
-	WebThickness : IfcPositiveLengthMeasure;
-	FlangeThickness : IfcPositiveLengthMeasure;
-	FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
- WHERE
-	ValidFlangeThickness : FlangeThickness < (Depth / 2.);
-	ValidWebThickness : WebThickness < FlangeWidth;
-END_ENTITY;
-
-ENTITY IfcUnitAssignment;
-	Units : SET [1:?] OF IfcUnit;
- WHERE
-	WR01 : IfcCorrectUnitAssignment(Units);
-END_ENTITY;
-
-ENTITY IfcUnitaryControlElement
- SUBTYPE OF (IfcDistributionControlElement);
-	PredefinedType : OPTIONAL IfcUnitaryControlElementTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcUnitaryControlElementTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcUnitaryControlElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-('IFC4.IFCUNITARYCONTROLELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcUnitaryControlElementType
- SUBTYPE OF (IfcDistributionControlElementType);
-	PredefinedType : IfcUnitaryControlElementTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcUnitaryControlElementTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcUnitaryControlElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcUnitaryEquipment
- SUBTYPE OF (IfcEnergyConversionDevice);
-	PredefinedType : OPTIONAL IfcUnitaryEquipmentTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCUNITARYEQUIPMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcUnitaryEquipmentType
- SUBTYPE OF (IfcEnergyConversionDeviceType);
-	PredefinedType : IfcUnitaryEquipmentTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcValve
- SUBTYPE OF (IfcFlowController);
-	PredefinedType : OPTIONAL IfcValveTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcValveTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcValveTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCVALVETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcValveType
- SUBTYPE OF (IfcFlowControllerType);
-	PredefinedType : IfcValveTypeEnum;
- WHERE
-	CorrectPredefinedType : (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
-	MagGreaterOrEqualZero : Magnitude >= 0.0;
-END_ENTITY;
-
-ENTITY IfcVertex
- SUPERTYPE OF (ONEOF
-    (IfcVertexPoint))
- SUBTYPE OF (IfcTopologicalRepresentationItem);
-END_ENTITY;
-
-ENTITY IfcVertexLoop
- SUBTYPE OF (IfcLoop);
-	LoopVertex : IfcVertex;
-END_ENTITY;
-
-ENTITY IfcVertexPoint
- SUBTYPE OF (IfcVertex);
-	VertexGeometry : IfcPoint;
-END_ENTITY;
-
-ENTITY IfcVibrationIsolator
- SUBTYPE OF (IfcElementComponent);
-	PredefinedType : OPTIONAL IfcVibrationIsolatorTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcVibrationIsolatorTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcVibrationIsolatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCVIBRATIONISOLATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcVibrationIsolatorType
- SUBTYPE OF (IfcElementComponentType);
-	PredefinedType : IfcVibrationIsolatorTypeEnum;
- WHERE
-	CorrectPredefinedType : (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 IfcVoidingFeature
- SUBTYPE OF (IfcFeatureElementSubtraction);
-	PredefinedType : OPTIONAL IfcVoidingFeatureTypeEnum;
- WHERE
-	HasObjectType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcVoidingFeatureTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
-END_ENTITY;
-
-ENTITY IfcWall
- SUPERTYPE OF (ONEOF
-    (IfcWallElementedCase
-    ,IfcWallStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	PredefinedType : OPTIONAL IfcWallTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR
- (PredefinedType <> IfcWallTypeEnum.USERDEFINED) OR
- ((PredefinedType = IfcWallTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR
-  ('IFC4.IFCWALLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcWallElementedCase
- SUBTYPE OF (IfcWall);
- WHERE
-	HasDecomposition : HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) > 0;
-END_ENTITY;
-
-ENTITY IfcWallStandardCase
- SUBTYPE OF (IfcWall);
- WHERE
-	HasMaterialLayerSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC4.IFCRELASSOCIATES.RELATEDOBJECTS') |
-              ('IFC4.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
-              ('IFC4.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial))
-              )) = 1;
-END_ENTITY;
-
-ENTITY IfcWallType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcWallTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcWallTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWallTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcWasteTerminal
- SUBTYPE OF (IfcFlowTerminal);
-	PredefinedType : OPTIONAL IfcWasteTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR 
- (PredefinedType <> IfcWasteTerminalTypeEnum.USERDEFINED) OR 
- ((PredefinedType = IfcWasteTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
-	CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR 
-  ('IFC4.IFCWASTETERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcWasteTerminalType
- SUBTYPE OF (IfcFlowTerminalType);
-	PredefinedType : IfcWasteTerminalTypeEnum;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcWasteTerminalTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWasteTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcWindow
- SUPERTYPE OF (ONEOF
-    (IfcWindowStandardCase))
- SUBTYPE OF (IfcBuildingElement);
-	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
-	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
-	PredefinedType : OPTIONAL IfcWindowTypeEnum;
-	PartitioningType : OPTIONAL IfcWindowTypePartitioningEnum;
-	UserDefinedPartitioningType : OPTIONAL IfcLabel;
- WHERE
-	CorrectStyleAssigned : (SIZEOF(IsTypedBy) = 0) 
-OR ('IFC4.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
-END_ENTITY;
-
-ENTITY IfcWindowLiningProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
-	LiningThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	TransomThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	MullionThickness : OPTIONAL IfcNonNegativeLengthMeasure;
-	FirstTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
-	SecondTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
-	FirstMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
-	SecondMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
-	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
-	LiningOffset : OPTIONAL IfcLengthMeasure;
-	LiningToPanelOffsetX : OPTIONAL IfcLengthMeasure;
-	LiningToPanelOffsetY : OPTIONAL IfcLengthMeasure;
- WHERE
-	WR31 : NOT(EXISTS(LiningDepth) AND NOT(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 
-(
- ('IFC4.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-  OR
- ('IFC4.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-);
-END_ENTITY;
-
-ENTITY IfcWindowPanelProperties
- SUBTYPE OF (IfcPreDefinedPropertySet);
-	OperationType : IfcWindowPanelOperationEnum;
-	PanelPosition : IfcWindowPanelPositionEnum;
-	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
-	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
-	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
- WHERE
-	ApplicableToType : (EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1])) 
-AND 
-(
- ('IFC4.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-  OR
- ('IFC4.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]))
-);
-END_ENTITY;
-
-ENTITY IfcWindowStandardCase
- SUBTYPE OF (IfcWindow);
-END_ENTITY;
-
-ENTITY IfcWindowStyle
- SUBTYPE OF (IfcTypeProduct);
-	ConstructionType : IfcWindowStyleConstructionEnum;
-	OperationType : IfcWindowStyleOperationEnum;
-	ParameterTakesPrecedence : IfcBoolean;
-	Sizeable : IfcBoolean;
-END_ENTITY;
-
-ENTITY IfcWindowType
- SUBTYPE OF (IfcBuildingElementType);
-	PredefinedType : IfcWindowTypeEnum;
-	PartitioningType : IfcWindowTypePartitioningEnum;
-	ParameterTakesPrecedence : OPTIONAL IfcBoolean;
-	UserDefinedPartitioningType : OPTIONAL IfcLabel;
- WHERE
-	CorrectPredefinedType : (PredefinedType <> IfcWindowTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWindowTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
-END_ENTITY;
-
-ENTITY IfcWorkCalendar
- SUBTYPE OF (IfcControl);
-	WorkingTimes : OPTIONAL SET [1:?] OF IfcWorkTime;
-	ExceptionTimes : OPTIONAL SET [1:?] OF IfcWorkTime;
-	PredefinedType : OPTIONAL IfcWorkCalendarTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkCalendarTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWorkCalendarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcWorkControl
- ABSTRACT SUPERTYPE OF (ONEOF
-    (IfcWorkPlan
-    ,IfcWorkSchedule))
- SUBTYPE OF (IfcControl);
-	CreationDate : IfcDateTime;
-	Creators : OPTIONAL SET [1:?] OF IfcPerson;
-	Purpose : OPTIONAL IfcLabel;
-	Duration : OPTIONAL IfcDuration;
-	TotalFloat : OPTIONAL IfcDuration;
-	StartTime : IfcDateTime;
-	FinishTime : OPTIONAL IfcDateTime;
-END_ENTITY;
-
-ENTITY IfcWorkPlan
- SUBTYPE OF (IfcWorkControl);
-	PredefinedType : OPTIONAL IfcWorkPlanTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkPlanTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWorkPlanTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcWorkSchedule
- SUBTYPE OF (IfcWorkControl);
-	PredefinedType : OPTIONAL IfcWorkScheduleTypeEnum;
- WHERE
-	CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkScheduleTypeEnum.USERDEFINED) OR
-((PredefinedType = IfcWorkScheduleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
-END_ENTITY;
-
-ENTITY IfcWorkTime
- SUBTYPE OF (IfcSchedulingTime);
-	RecurrencePattern : OPTIONAL IfcRecurrencePattern;
-	Start : OPTIONAL IfcDate;
-	Finish : OPTIONAL IfcDate;
-END_ENTITY;
-
-ENTITY IfcZShapeProfileDef
- SUBTYPE OF (IfcParameterizedProfileDef);
-	Depth : IfcPositiveLengthMeasure;
-	FlangeWidth : IfcPositiveLengthMeasure;
-	WebThickness : IfcPositiveLengthMeasure;
-	FlangeThickness : IfcPositiveLengthMeasure;
-	FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
-	EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
- WHERE
-	ValidFlangeThickness : FlangeThickness < (Depth / 2.);
-END_ENTITY;
-
-ENTITY IfcZone
- SUBTYPE OF (IfcSystem);
-	LongName : OPTIONAL IfcLabel;
- WHERE
-	WR1 : (SIZEOF(SELF\IfcGroup.IsGroupedBy) = 0) OR
-	(SIZEOF (QUERY (temp <* SELF\IfcGroup.IsGroupedBy[1].RelatedObjects |  
-		NOT(('IFC4.IFCZONE' IN TYPEOF(temp)) OR 
-		('IFC4.IFCSPACE' IN TYPEOF(temp)) OR
-		('IFC4.IFCSPATIALZONE' IN TYPEOF(temp))
-	))) = 0);
-END_ENTITY;
-
-FUNCTION IfcAssociatedSurface
-(Arg : IfcPcurve) : IfcSurface;
-
-   LOCAL
-     Surf : IfcSurface;
-   END_LOCAL;
-   
-   Surf := Arg\IfcPcurve.BasisSurface;
-   
-   RETURN(Surf);
-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))\IfcVector.Orientation, D1]);
-END_FUNCTION;
-
-FUNCTION IfcConsecutiveSegments
-(Segments : LIST [1:?] OF IfcSegmentIndexSelect)
-  : BOOLEAN;
-
- LOCAL
-  Result : BOOLEAN := TRUE;
- END_LOCAL;
-
-  REPEAT i := 1 TO (HIINDEX(Segments)-1);
-    IF Segments[i][HIINDEX(Segments[i])] <> Segments[i+1][1] THEN
-      BEGIN
-        Result := FALSE;
-        ESCAPE;
-      END;
-	END_IF;
-  END_REPEAT;
-
-  RETURN (Result);
-END_FUNCTION;
-
-FUNCTION IfcConstraintsParamBSpline
-( Degree, UpKnots, UpCp : INTEGER;
-  KnotMult : LIST OF INTEGER;
-  Knots : LIST OF IfcParameterValue ) 
-: BOOLEAN;
-
-
-  LOCAL
-    Result : BOOLEAN := TRUE;
-    K, Sum : INTEGER;
-  END_LOCAL;
-
-  (* Find sum of knot multiplicities. *)
-  Sum := KnotMult[1];
-  REPEAT i := 2 TO UpKnots;
-    Sum := Sum + KnotMult[i];
-  END_REPEAT;
-
-  (* Check limits holding for all B-spline parametrisations *)
-  IF (Degree < 1) OR (UpKnots < 2) OR (UpCp < Degree) OR
-    (Sum <> (Degree + UpCp + 2)) THEN
-    Result := FALSE;
-    RETURN(Result);
-  END_IF;
-
-  K := KnotMult[1];
-  IF (K < 1) OR (K > Degree + 1) THEN
-    Result := FALSE;
-    RETURN(Result);
-  END_IF;
-
-  REPEAT i := 2 TO UpKnots;
-    IF (KnotMult[i] < 1) OR (Knots[i] <= Knots[i-1]) THEN
-      Result := FALSE;
-      RETURN(Result);
-    END_IF;
-    K := KnotMult[i];
-    IF (i < UpKnots) AND (K > Degree) THEN
-      Result := FALSE;
-      RETURN(Result);
-    END_IF;
-    IF (i = UpKnots) AND (K > Degree + 1) THEN
-      Result := FALSE;
-      RETURN(Result);
-    END_IF;
-  END_REPEAT;
-
-  RETURN(result);
-END_FUNCTION;
-
-FUNCTION IfcConvertDirectionInto2D
-(Direction : IfcDirection)
-    : IfcDirection;
-	
-  LOCAL
-    Direction2D : IfcDirection := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.,1.]);
-  END_LOCAL;
-  
-  Direction2D.DirectionRatios[1] := Direction.DirectionRatios[1];
-  Direction2D.DirectionRatios[2] := Direction.DirectionRatios[2];
-  
-  RETURN (Direction2D);
-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, 2, 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 IfcCorrectFillAreaStyle
-(Styles : SET[1:?] OF IfcFillStyleSelect)
-  :LOGICAL;
-
-LOCAL
-   Hatching : INTEGER := 0;
-   Tiles    : INTEGER := 0;
-   Colour   : INTEGER := 0;
-   External : INTEGER := 0;
-END_LOCAL;
-
-
-External := SIZEOF(QUERY(Style <* Styles |
-  'IFC4.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
-   TYPEOF(Style)));
-
-Hatching  := SIZEOF(QUERY(Style <* Styles |
-  'IFC4.IFCFILLAREASTYLEHATCHING' IN
-   TYPEOF(Style)));
-
-Tiles     := SIZEOF(QUERY(Style <* Styles |
-  'IFC4.IFCFILLAREASTYLETILES' IN
-   TYPEOF(Style)));
-
-Colour    := SIZEOF(QUERY(Style <* Styles |
-  'IFC4.IFCCOLOUR' IN
-   TYPEOF(Style)));
-
-
-IF (External > 1) THEN
-  RETURN (FALSE);
-END_IF;
-
-
-IF ((External = 1) AND ((Hatching > 0) OR (Tiles > 0) OR (Colour > 0))) THEN
-  RETURN (FALSE);
-END_IF;
-
-
-IF (Colour > 1) THEN
-  RETURN (FALSE);
-END_IF;
-
-IF ((Hatching > 0) AND (Tiles >0)) THEN
-  RETURN (FALSE);
-END_IF;
-
-RETURN(TRUE);
-END_FUNCTION;
-
-FUNCTION IfcCorrectLocalPlacement
-(AxisPlacement:IfcAxis2Placement; 
-   RelPlacement : IfcObjectPlacement):LOGICAL;
-
-  IF (EXISTS(RelPlacement)) THEN
-    IF ('IFC4.IFCGRIDPLACEMENT' IN TYPEOF(RelPlacement)) THEN
-      RETURN(?);
-    END_IF;
-    IF ('IFC4.IFCLOCALPLACEMENT' IN TYPEOF(RelPlacement)) THEN
-      IF ('IFC4.IFCAXIS2PLACEMENT2D' IN TYPEOF(AxisPlacement)) THEN
-        RETURN(TRUE);
-      END_IF;
-      IF ('IFC4.IFCAXIS2PLACEMENT3D' IN TYPEOF(AxisPlacement)) THEN
-        IF (RelPlacement\IfcLocalPlacement.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('IFC4.IFCPRODUCT' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.PROCESS :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.IFCPROCESS' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.CONTROL :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.IFCCONTROL' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.RESOURCE :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.IFCRESOURCE' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.ACTOR :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.IFCACTOR' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.GROUP :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.IFCGROUP' IN TYPEOF(temp))));
-          RETURN(Count = 0);
-        END;
-      IfcObjectTypeEnum.PROJECT :
-        BEGIN
-          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC4.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 | ('IFC4.IFCNAMEDUNIT' IN TYPEOF(temp)) AND NOT(temp\IfcNamedUnit.UnitType = IfcUnitEnum.USERDEFINED)));
-  DerivedUnitNumber  := SIZEOF(QUERY(temp <* Units | ('IFC4.IFCDERIVEDUNIT' IN TYPEOF(temp)) AND NOT(temp\IfcDerivedUnit.UnitType = IfcDerivedUnitEnum.USERDEFINED)));
-  MonetaryUnitNumber := SIZEOF(QUERY(temp <* Units |  'IFC4.IFCMONETARYUNIT' IN TYPEOF(temp)));
-
-  REPEAT i := 1 TO SIZEOF(Units);
-    IF (('IFC4.IFCNAMEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i]\IfcNamedUnit.UnitType = IfcUnitEnum.USERDEFINED)) THEN
-        NamedUnitNames := NamedUnitNames + Units[i]\IfcNamedUnit.UnitType;
-    END_IF;
-    IF (('IFC4.IFCDERIVEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i]\IfcDerivedUnit.UnitType = IfcDerivedUnitEnum.USERDEFINED)) THEN
-        DerivedUnitNames := DerivedUnitNames + Units[i]\IfcDerivedUnit.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)\IfcDirection.DirectionRatios;
-
-      V2  := IfcNormalise(Arg2)\IfcDirection.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 ('IFC4.IFCLINE' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcLine.Pnt.Dim);
-  END_IF;
-  IF ('IFC4.IFCCONIC' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcConic.Position.Dim);
-  END_IF;
-  IF ('IFC4.IFCPOLYLINE' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcPolyline.Points[1].Dim);
-  END_IF;
-  IF ('IFC4.IFCTRIMMEDCURVE' IN TYPEOF(Curve))
-    THEN RETURN(IfcCurveDim(Curve\IfcTrimmedCurve.BasisCurve));
-  END_IF;
-  IF ('IFC4.IFCCOMPOSITECURVE' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcCompositeCurve.Segments[1].Dim);
-  END_IF;
-  IF ('IFC4.IFCBSPLINECURVE' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcBSplineCurve.ControlPointsList[1].Dim);
-  END_IF;
-  IF ('IFC4.IFCOFFSETCURVE2D' IN TYPEOF(Curve))
-    THEN RETURN(2); 
-  END_IF;
-  IF ('IFC4.IFCOFFSETCURVE3D' IN TYPEOF(Curve))
-    THEN RETURN(3);
-  END_IF;
-  IF ('IFC4.IFCPCURVE' IN TYPEOF(Curve))
-    THEN RETURN(3);
-  END_IF;
-  IF ('IFC4.IFCINDEXEDPOLYCURVE' IN TYPEOF(Curve))
-    THEN RETURN(Curve\IfcIndexedPolyCurve.Points.Dim);
-  END_IF;
-RETURN (?);
-END_FUNCTION;
-
-FUNCTION IfcCurveWeightsPositive
-( B: IfcRationalBSplineCurveWithKnots)
-: 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
-(UnitElements : SET [1:?] OF IfcDerivedUnitElement)
-    : IfcDimensionalExponents;  
-    LOCAL
-    Result : IfcDimensionalExponents :=
-            IfcDimensionalExponents(0, 0, 0, 0, 0, 0, 0);  
-    END_LOCAL;
-    REPEAT i := LOINDEX(UnitElements) TO HIINDEX(UnitElements);
-        Result.LengthExponent := Result.LengthExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.LengthExponent);
-        Result.MassExponent := Result.MassExponent  +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.MassExponent);
-        Result.TimeExponent := Result.TimeExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.TimeExponent);
-        Result.ElectricCurrentExponent := Result.ElectricCurrentExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.ElectricCurrentExponent);
-        Result.ThermodynamicTemperatureExponent := Result.ThermodynamicTemperatureExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.ThermodynamicTemperatureExponent);
-        Result.AmountOfSubstanceExponent := Result.AmountOfSubstanceExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.AmountOfSubstanceExponent);
-        Result.LuminousIntensityExponent := Result.LuminousIntensityExponent +
-          (UnitElements[i].Exponent *
-           UnitElements[i].Unit.Dimensions.LuminousIntensityExponent);
-    END_REPEAT;  
-    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, 2, 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 IfcGetBasisSurface
-(C : IfcCurveOnSurface) : SET[0:2] OF IfcSurface;
-
-  LOCAL
-    Surfs : SET[0:2] OF IfcSurface;
-    N : INTEGER;
-  END_LOCAL;
-
-  Surfs := [];
-  IF 'IFC4.IFCPCURVE' IN TYPEOF (C) THEN
-    Surfs := [C\IfcPCurve.BasisSurface];
-  ELSE
-    IF 'IFC4.IFCSURFACECURVE' IN TYPEOF (C) THEN
-      N := SIZEOF(C\IfcSurfaceCurve.AssociatedGeometry);
-      REPEAT i := 1 TO N;
-      Surfs := Surfs + IfcAssociatedSurface(C\IfcSurfaceCurve.AssociatedGeometry[i]);
-      END_REPEAT;
-    END_IF;
-  END_IF;
-  IF 'IFC4.IFCCOMPOSITECURVEONSURFACE' IN TYPEOF (C) THEN
-
-    (* For an IfcCompositeCurveOnSurface the BasisSurface is the intersection of the BasisSurface of all the segments. *)
-
-    N := SIZEOF(C\IfcCompositeCurve.Segments);
-    Surfs := IfcGetBasisSurface(C\IfcCompositeCurve.Segments[1].ParentCurve);
-    IF N > 1 THEN
-      REPEAT i := 2 TO N;
-        Surfs := Surfs * IfcGetBasisSurface(C\IfcCompositeCurve.Segments[1].ParentCurve);
-      END_REPEAT;
-    END_IF;
-  END_IF;
-  RETURN(Surfs);
-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 IfcMakeArrayOfArray
-(Lis : LIST[1:?] OF LIST [1:?] OF GENERIC : T;
- Low1, U1, Low2, U2 : INTEGER):
-ARRAY [Low1:U1] OF ARRAY [Low2:U2] OF GENERIC : T;
-
-  LOCAL
-    Res : ARRAY[Low1:U1] OF ARRAY [Low2:U2] OF GENERIC : T;
-  END_LOCAL;
-
-  (* Check input dimensions for consistency *)
-  IF (U1-Low1+1) <> SIZEOF(Lis) THEN
-    RETURN (?);
-  END_IF;
-  IF (U2 - Low2 + 1 ) <> SIZEOF(Lis[1]) THEN
-    RETURN (?) ;
-  END_IF;
-
-  (* Initialise Res with values from Lis[1] *)
-  Res := [IfcListToArray(Lis[1], Low2, U2) : (U1-Low1 + 1)];
-  REPEAT i := 2 TO HIINDEX(Lis);
-    IF (U2-Low2+1) <> SIZEOF(Lis[i]) THEN
-      RETURN (?);
-    END_IF;
-    Res[Low1+i-1] := IfcListToArray(Lis[i], Low2, U2);
-  END_REPEAT;
-  RETURN (Res);
-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 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
-    IF 'IFC4.IFCVECTOR' IN TYPEOF(Arg) THEN
-      BEGIN
-        Ndim := Arg\IfcVector.Dim;
-	V.DirectionRatios := Arg\IfcVector.Orientation.DirectionRatios;
-        Vec.Magnitude := Arg\IfcVector.Magnitude;
-	Vec.Orientation := V;
-        IF Arg\IfcVector.Magnitude = 0.0 THEN
-          RETURN(?);
-        ELSE
-          Vec.Magnitude := 1.0;
-        END_IF;
-      END;
-    ELSE
-      BEGIN
-        Ndim := Arg\IfcDirection.Dim;
-        V.DirectionRatios := Arg\IfcDirection.DirectionRatios;
-      END;
-    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 'IFC4.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 IfcPointListDim
-(PointList : IfcCartesianPointList)
-           : IfcDimensionCount;
-
-  IF ('IFC4.IFCCARTESIANPOINTLIST2D' IN TYPEOF(PointList))
-    THEN RETURN(2);
-  END_IF;		   
-  IF ('IFC4.IFCCARTESIANPOINTLIST3D' IN TYPEOF(PointList))
-    THEN RETURN(3);
-  END_IF;		   
-  RETURN (?);
-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 'IFC4.IFCVECTOR' IN TYPEOF (Vec) THEN
-      V := Vec\IfcVector.Orientation;
-      Mag := Scalar * Vec\IfcVector.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 
-    'Point' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCPOINT' IN TYPEOF(temp))));
-      END;
-
-    'PointCloud' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCCARTESIANPOINTLIST3D' IN TYPEOF(temp))));
-      END;
-
-    'Curve' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCCURVE' IN TYPEOF(temp))));
-      END;
-
-    'Curve2D' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCCURVE' IN TYPEOF(temp)) 
-                 AND (temp\IfcCurve.Dim = 2)));
-      END;
-
-    'Curve3D' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCCURVE' IN TYPEOF(temp)) 
-                 AND (temp\IfcCurve.Dim = 3)));
-      END;
-
-    'Surface' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCSURFACE' IN TYPEOF(temp))));
-      END;
-
-    'Surface2D' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCSURFACE' IN TYPEOF(temp)) 
-                 AND (temp\IfcSurface.Dim = 2)));
-      END;
-
-    'Surface3D' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCSURFACE' IN TYPEOF(temp)) 
-                 AND (temp\IfcSurface.Dim = 3)));
-      END;
-
-    'FillArea' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCANNOTATIONFILLAREA' IN TYPEOF(temp))));
-      END;
-
-    'Text' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCTEXTLITERAL' IN TYPEOF(temp))));
-      END;
-
-    'AdvancedSurface' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | 'IFC4.IFCBSPLINESURFACE' IN TYPEOF(temp)));
-      END;
-
-    'Annotation2D' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | (
-                  SIZEOF(TYPEOF(temp) * [
-                   'IFC4.IFCPOINT',
-                   'IFC4.IFCCURVE',
-                   'IFC4.IFCGEOMETRICCURVESET',
-                   'IFC4.IFCANNOTATIONFILLAREA',
-                   'IFC4.IFCTEXTLITERAL']) = 1)
-                 ));
-      END;
-
-    'GeometricSet' : 
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCGEOMETRICSET' IN TYPEOF(temp))
-                 OR ('IFC4.IFCPOINT' IN TYPEOF(temp))
-                 OR ('IFC4.IFCCURVE' IN TYPEOF(temp))
-                 OR ('IFC4.IFCSURFACE' IN TYPEOF(temp))));
-      END;
-
-    'GeometricCurveSet' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
-                 OR ('IFC4.IFCGEOMETRICSET' IN TYPEOF(temp))
-                 OR ('IFC4.IFCPOINT' IN TYPEOF(temp))
-                 OR ('IFC4.IFCCURVE' IN TYPEOF(temp))));
-         REPEAT i:=1 TO HIINDEX(Items);  
-           IF ('IFC4.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
-           THEN
-             IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFC4.IFCSURFACE' IN TYPEOF(temp))) > 0)
-             THEN
-               Count := Count - 1;
-             END_IF;
-           END_IF;
-         END_REPEAT;
-      END;
-
-    'Tessellation' :
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | 'IFC4.IFCTESSELLATEDITEM' IN TYPEOF(temp)));
-      END;
-
-    'SurfaceOrSolidModel' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
-                   'IFC4.IFCTESSELLATEDITEM',
-                   'IFC4.IFCSHELLBASEDSURFACEMODEL',
-                   'IFC4.IFCFACEBASEDSURFACEMODEL',
-                   'IFC4.IFCSOLIDMODEL'] * TYPEOF(temp)) >= 1
-                 ));      
-      END;
-
-    'SurfaceModel' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
-                   'IFC4.IFCTESSELLATEDITEM',
-                   'IFC4.IFCSHELLBASEDSURFACEMODEL',
-                   'IFC4.IFCFACEBASEDSURFACEMODEL'] * TYPEOF(temp)) >= 1
-                 ));      
-      END;
-
-    'SolidModel' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCSOLIDMODEL' IN TYPEOF(temp))));            
-      END;
-
-    'SweptSolid' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | (SIZEOF([
-                   'IFC4.IFCEXTRUDEDAREASOLID',
-                   'IFC4.IFCREVOLVEDAREASOLID'] * TYPEOF(temp)) >= 1
-                   ) AND (SIZEOF([
-                   'IFC4.IFCEXTRUDEDAREASOLIDTAPERED',
-                   'IFC4.IFCREVOLVEDAREASOLIDTAPERED'] * TYPEOF(temp)) = 0
-                   )
-                 ));                             
-      END;
-
-    'AdvancedSweptSolid' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
-                   'IFC4.IFCSWEPTAREASOLID',
-                   'IFC4.IFCSWEPTDISKSOLID'] *  TYPEOF(temp)) >= 1
-                 ));      
-      END;
-
-    'CSG' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
-                   'IFC4.IFCBOOLEANRESULT',
-                   'IFC4.IFCCSGPRIMITIVE3D',
-                   'IFC4.IFCCSGSOLID'] *  TYPEOF(temp)) >= 1
-                 ));            
-      END;
-
-    'Clipping' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
-                   'IFC4.IFCCSGSOLID',
-                   'IFC4.IFCBOOLEANCLIPPINGRESULT'] * TYPEOF(temp)) >= 1
-                 )); 
-      END;
-
-    'Brep' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCFACETEDBREP' IN TYPEOF(temp))));      
-      END;
-
-    'AdvancedBrep' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCMANIFOLDSOLIDBREP' IN TYPEOF(temp))));      
-      END;
-
-    'BoundingBox' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCBOUNDINGBOX' IN TYPEOF(temp))));
-        IF (SIZEOF(Items) > 1)
-        THEN
-          Count := 0;
-        END_IF;   
-      END;
-
-    'SectionedSpine' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCSECTIONEDSPINE' IN TYPEOF(temp))));      
-      END;
-
-    'LightSource' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCLIGHTSOURCE' IN TYPEOF(temp))));      
-      END;
-
-    'MappedRepresentation' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | ('IFC4.IFCMAPPEDITEM' IN TYPEOF(temp))));  
-      END;
-
-     OTHERWISE : RETURN(?);
-    END_CASE;
-    RETURN (Count = SIZEOF(Items));
-END_FUNCTION;
-
-FUNCTION IfcSurfaceWeightsPositive
-( B: IfcRationalBSplineSurfaceWithKnots) 
-: BOOLEAN;
-
-  LOCAL
-    Result : BOOLEAN := TRUE;
-  END_LOCAL;
-
-  REPEAT i := 0 TO B\IfcBSplineSurface.UUpper;
-    REPEAT j := 0 TO B\IfcBSplineSurface.VUpper;
-      IF (B.Weights[i][j] <= 0.0) THEN
-        Result := FALSE;
-        RETURN(Result);
-      END_IF;
-    END_REPEAT;
-  END_REPEAT;
-  RETURN(Result);
-END_FUNCTION;
-
-FUNCTION IfcTaperedSweptAreaProfiles
-(StartArea, EndArea : IfcProfileDef)
- : LOGICAL;
-
-LOCAL
-   Result : LOGICAL := FALSE;
-END_LOCAL;
-   
-IF ('IFC4.IFCPARAMETERIZEDPROFILEDEF' IN TYPEOF(StartArea)) THEN
-   IF ('IFC4.IFCDERIVEDPROFILEDEF' IN TYPEOF(EndArea)) THEN
-      Result := (StartArea :=: EndArea\IfcDerivedProfileDef.ParentProfile);
-   ELSE
-      Result := (TYPEOF(StartArea) = TYPEOF(EndArea));
-   END_IF;
-ELSE
-   IF ('IFC4.IFCDERIVEDPROFILEDEF' IN TYPEOF(EndArea)) THEN
-      Result := (StartArea :=: EndArea\IfcDerivedProfileDef.ParentProfile);
-   ELSE
-      Result := FALSE;
-   END_IF;
-END_IF;
-
-RETURN(Result);
-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 | 
-                  ('IFC4.IFCVERTEX' IN TYPEOF(temp))));
-      END;
-    'Edge' : 
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | 
-                  ('IFC4.IFCEDGE' IN TYPEOF(temp))));
-      END;
-    'Path' : 
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | 
-                  ('IFC4.IFCPATH' IN TYPEOF(temp))));
-      END;
-    'Face' : 
-      BEGIN 
-        Count := SIZEOF(QUERY(temp <* Items | 
-                  ('IFC4.IFCFACE' IN TYPEOF(temp))));
-      END;
-    'Shell' :
-      BEGIN
-        Count := SIZEOF(QUERY(temp <* Items | 
-                  ('IFC4.IFCOPENSHELL' IN TYPEOF(temp))
-                    OR ('IFC4.IFCCLOSEDSHELL' IN TYPEOF(temp))));
-      END;
-    'Undefined': RETURN(TRUE);
-     OTHERWISE : RETURN(?);
-    END_CASE;
-    RETURN (Count = SIZEOF(Items));
-END_FUNCTION;
-
-FUNCTION IfcUniqueDefinitionNames
-(Relations : SET [1:?] OF IfcRelDefinesByProperties)
-:LOGICAL;
-
-LOCAL
-  Definition : IfcPropertySetDefinitionSelect;
-  DefinitionSet : IfcPropertySetDefinitionSet;
-  Properties : SET OF IfcPropertySetDefinition := [];
-  Result : LOGICAL;
-END_LOCAL;
-
-IF SIZEOF(Relations) = 0 THEN
-  RETURN(TRUE);
-END_IF;
-
-REPEAT i:=1 TO HIINDEX(Relations);
-  Definition := Relations[i].RelatingPropertyDefinition;
-  IF 'IFC4.IFCPROPERTYSETDEFINITION' IN TYPEOF(Definition) THEN
-    Properties := Properties + Definition;
-  ELSE 
-    IF 'IFC4.IFCPROPERTYSETDEFINITIONSET' IN TYPEOF(Definition) THEN
-      BEGIN
-        DefinitionSet := Definition;
-        REPEAT j:= 1 TO HIINDEX(DefinitionSet);
-          Properties := Properties + DefinitionSet[j];
-        END_REPEAT;
-      END;
-	END_IF;
-  END_IF;
-END_REPEAT;
-
-Result := IfcUniquePropertySetNames(Properties);
-RETURN (Result);
-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 IfcUniquePropertySetNames
-(Properties : SET [1:?] OF IfcPropertySetDefinition)
-:LOGICAL;
-
-LOCAL
-  Names : SET OF IfcLabel := [];
-  Unnamed : INTEGER := 0;
-END_LOCAL;
-
-REPEAT i:=1 TO HIINDEX(Properties);
-  IF 'IFC4.IFCPROPERTYSET' IN TYPEOF(Properties[i]) THEN
-    Names := Names + Properties[i]\IfcRoot.Name;
-  ELSE
-    Unnamed := Unnamed + 1;
-  END_IF;
-END_REPEAT;
-
-RETURN (SIZEOF(Names) + Unnamed = SIZEOF(Properties));
-END_FUNCTION;
-
-FUNCTION IfcUniquePropertyTemplateNames
-(Properties : SET [1:?] OF IfcPropertyTemplate)
-:LOGICAL;
-
-LOCAL
-  Names : SET OF IfcLabel := [];
-END_LOCAL;
-
-REPEAT i:=1 TO HIINDEX(Properties);
-  Names := Names + Properties[i].Name;
-END_REPEAT;
-RETURN (SIZEOF(Names) = SIZEOF(Properties));
-END_FUNCTION;
-
-FUNCTION IfcUniqueQuantityNames
-(Properties : SET [1:?] OF IfcPhysicalQuantity)
-:LOGICAL;
-
-LOCAL
-  Names : SET OF IfcLabel := [];
-END_LOCAL;
-
-REPEAT i:=1 TO HIINDEX(Properties);
-  Names := Names + Properties[i].Name;
-END_REPEAT;
-RETURN (SIZEOF(Names) = SIZEOF(Properties));
-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 'IFC4.IFCVECTOR' IN TYPEOF(Arg1) THEN
-        Mag1 := Arg1\IfcVector.Magnitude;
-        Vec1 := Arg1\IfcVector.Orientation;
-      ELSE
-        Mag1 := 1.0;
-        Vec1 := Arg1;
-      END_IF;
-      IF 'IFC4.IFCVECTOR' IN TYPEOF(Arg2) THEN
-        Mag2 := Arg2\IfcVector.Magnitude;
-        Vec2 := Arg2\IfcVector.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 'IFC4.IFCVECTOR' IN TYPEOF(Arg1) THEN
-        Mag1 := Arg1\IfcVector.Magnitude;
-        Vec1 := Arg1\IfcVector.Orientation;
-      ELSE
-        Mag1 := 1.0;
-        Vec1 := Arg1;
-      END_IF;
-      IF 'IFC4.IFCVECTOR' IN TYPEOF(Arg2) THEN
-        Mag2 := Arg2\IfcVector.Magnitude;
-        Vec2 := Arg2\IfcVector.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;

+ 1 - 0
test/CMakeLists.txt

@@ -117,6 +117,7 @@ SET( IMPORTERS
   unit/utB3DImportExport.cpp
   unit/utB3DImportExport.cpp
   unit/utMDCImportExport.cpp
   unit/utMDCImportExport.cpp
   unit/utAssbinImportExport.cpp
   unit/utAssbinImportExport.cpp
+  unit/ImportExport/utCOBImportExport.cpp
 )
 )
 
 
 SET( MATERIAL
 SET( MATERIAL

+ 38 - 0
test/models/AMF/test_with_mat.amf

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<amf unit="inch" version="1.1">
+  <metadata type="name">Split Pyramid</metadata>
+  <metadata type="author">John Smith</metadata> 
+  <object id="1">
+    <mesh>
+      <vertices>
+        <vertex><coordinates><x>0</x><y>0</y><z>0</z></coordinates></vertex>
+        <vertex><coordinates><x>1</x><y>0</y><z>0</z></coordinates></vertex>
+        <vertex><coordinates><x>0</x><y>1</y><z>0</z></coordinates></vertex>
+        <vertex><coordinates><x>1</x><y>1</y><z>0</z></coordinates></vertex>
+        <vertex><coordinates><x>0.5</x><y>0.5</y><z>1</z></coordinates></vertex>
+      </vertices>
+      <volume materialid="2">
+        <metadata type="name">Hard side</metadata> 
+        <triangle><v1>2</v1><v2>1</v2><v3>0</v3></triangle>
+        <triangle><v1>0</v1><v2>1</v2><v3>4</v3></triangle>
+        <triangle><v1>4</v1><v2>1</v2><v3>2</v3></triangle>
+        <triangle><v1>0</v1><v2>4</v2><v3>2</v3></triangle>
+      </volume>
+      <volume materialid="3">
+        <metadata type="name">Soft side</metadata> 
+        <triangle><v1>2</v1><v2>3</v2><v3>1</v3></triangle>
+        <triangle><v1>1</v1><v2>3</v2><v3>4</v3></triangle>
+        <triangle><v1>4</v1><v2>3</v2><v3>2</v3></triangle>
+        <triangle><v1>4</v1><v2>2</v2><v3>1</v3></triangle>
+      </volume>
+    </mesh>
+  </object>
+  <material id="2">
+    <metadata type="name">Hard material</metadata>
+    <color><r>0.1</r><g>0.1</g><b>0.1</b></color>
+  </material>
+  <material id="3">
+    <metadata type="name">Soft material</metadata>
+    <color><r>0</r><g>0.9</g><b>0.9</b><a>0.5</a></color>
+  </material>
+</amf>

+ 64 - 0
test/unit/ImportExport/utCOBImportExport.cpp

@@ -0,0 +1,64 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2018, assimp team
+
+
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the following
+conditions are met:
+
+* Redistributions of source code must retain the above
+copyright notice, this list of conditions and the
+following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the
+following disclaimer in the documentation and/or other
+materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+contributors may be used to endorse or promote products
+derived from this software without specific prior
+written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+---------------------------------------------------------------------------
+*/
+
+#include "UnitTestPCH.h"
+#include "SceneDiffer.h"
+#include "AbstractImportExportBase.h"
+
+#include <assimp/Importer.hpp>
+#include <assimp/postprocess.h>
+
+using namespace Assimp;
+
+class utCOBImportExport : public AbstractImportExportBase {
+public:
+    virtual bool importerTest() {
+        Assimp::Importer importer;
+        const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/molecule.cob", aiProcess_ValidateDataStructure);
+        return nullptr != scene;
+    }
+};
+
+TEST_F(utCOBImportExport, importAMFFromFileTest) {
+    EXPECT_TRUE(importerTest());
+}

+ 9 - 1
test/unit/utAMFImportExport.cpp

@@ -59,6 +59,14 @@ public:
     }
     }
 };
 };
 
 
-TEST_F( utAMFImportExport, importACFromFileTest ) {
+TEST_F( utAMFImportExport, importAMFFromFileTest ) {
     EXPECT_TRUE( importerTest() );
     EXPECT_TRUE( importerTest() );
 }
 }
+
+
+
+TEST_F(utAMFImportExport, importAMFWithMatFromFileTest) {
+    Assimp::Importer importer;
+    const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AMF/test_with_mat.amf", aiProcess_ValidateDataStructure);
+    EXPECT_NE(nullptr, scene);
+}

+ 1 - 1
test/unit/utSceneCombiner.cpp

@@ -73,7 +73,7 @@ TEST_F( utSceneCombiner, MergeMeshes_ValidNames_Test ) {
     EXPECT_EQ( "mesh_1.mesh_2.mesh_3", outName );
     EXPECT_EQ( "mesh_1.mesh_2.mesh_3", outName );
 }
 }
 
 
-TEST_F( utSceneCombiner, CopySceneWithNullptr_NoException ) {
+TEST_F( utSceneCombiner, CopySceneWithNullptr_AI_NO_EXCEPTion ) {
     EXPECT_NO_THROW( SceneCombiner::CopyScene( nullptr, nullptr ) );
     EXPECT_NO_THROW( SceneCombiner::CopyScene( nullptr, nullptr ) );
     EXPECT_NO_THROW( SceneCombiner::CopySceneFlat( nullptr, nullptr ) );
     EXPECT_NO_THROW( SceneCombiner::CopySceneFlat( nullptr, nullptr ) );
 }
 }