(*
Copyright by:
buildingSMART International Ltd, 1996-2013
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.

Content:
full IFC object model EXPRESS definitions for the IFC4 Release
(released for production)
- express longform distribution
- compiled for EXPRESS version 1 technical corrigendum 2

Issue date:
February 28, 2013

Development Team:
Modeling Support Group of buildingSMART International
compiled by Thomas Liebich tl@aec3.com

*)
SCHEMA IFC4;

TYPE IfcAbsorbedDoseMeasure = REAL;
END_TYPE;

TYPE IfcAccelerationMeasure = REAL;
END_TYPE;

TYPE IfcAmountOfSubstanceMeasure = REAL;
END_TYPE;

TYPE IfcAngularVelocityMeasure = REAL;
END_TYPE;

TYPE IfcAreaDensityMeasure = REAL;
END_TYPE;

TYPE IfcAreaMeasure = REAL;
END_TYPE;

TYPE IfcBoolean = BOOLEAN;
END_TYPE;

TYPE IfcBoxAlignment = IfcLabel;
 WHERE
	WR1 : SELF IN ['top-left', 'top-middle', 'top-right', 'middle-left', 'center', 'middle-right', 'bottom-left', 'bottom-middle', 'bottom-right'];
END_TYPE;

TYPE 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 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 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
	,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
	,NOTDEFIEND);
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 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
	(CONDUCTANCESENSOR
	,CONTACTSENSOR
	,FIRESENSOR
	,FLOWSENSOR
	,GASSENSOR
	,HEATSENSOR
	,HUMIDITYSENSOR
	,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);
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);
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 IfcShell = SELECT
	(IfcClosedShell
	,IfcOpenShell);
END_TYPE;

TYPE IfcSimpleValue = SELECT
	(IfcBoolean
	,IfcDate
	,IfcDateTime
	,IfcDuration
	,IfcIdentifier
	,IfcInteger
	,IfcLabel
	,IfcLogical
	,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 : INTEGER;
	ControlPointsList : LIST [2:?] OF IfcCartesianPoint;
	CurveForm : IfcBSplineCurveForm;
	ClosedCurve : LOGICAL;
	SelfIntersect : LOGICAL;
 DERIVE
	UpperIndexOnControlPoints : INTEGER := (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 INTEGER;
	Knots : LIST [2:?] OF IfcParameterValue;
	KnotSpec : IfcKnotType;
 DERIVE
	UpperIndexOnKnots : INTEGER := 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 : INTEGER;
	VDegree : INTEGER;
	ControlPointsList : LIST [2:?] OF LIST [2:?] OF IfcCartesianPoint;
	SurfaceForm : IfcBSplineSurfaceForm;
	UClosed : LOGICAL;
	VClosed : LOGICAL;
	SelfIntersect : LOGICAL;
 DERIVE
	UUpper : INTEGER := SIZEOF(ControlPointsList) - 1;
	VUpper : INTEGER := 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 INTEGER;
	VMultiplicities : LIST [2:?] OF INTEGER;
	UKnots : LIST [2:?] OF IfcParameterValue;
	VKnots : LIST [2:?] OF IfcParameterValue;
	KnotSpec : IfcKnotType;
 DERIVE
	KnotVUpper : INTEGER := SIZEOF(VKnots);
	KnotUUpper : INTEGER := 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 : BINARY;
 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;
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
	,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;
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);
 INVERSE
	HasCoverings : SET [0:?] OF IfcRelCoversBldgElements FOR RelatingBuildingElement;
 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;
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
	(IfcCartesianPointList3D))
 SUBTYPE OF (IfcGeometricRepresentationItem);
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 REAL;
 DERIVE
	Scl : REAL := 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 REAL;
 DERIVE
	Scl2 : REAL := 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 REAL;
	Scale3 : OPTIONAL REAL;
 DERIVE
	Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
	Scl3 : REAL := 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 : LOGICAL;
 DERIVE
	NSegments : INTEGER := SIZEOF(Segments);
	ClosedCurve : LOGICAL := 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 : BOOLEAN;
	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 : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	GeodeticDatum : IfcIdentifier;
	VerticalDatum : OPTIONAL IfcIdentifier;
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))
 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 : BOOLEAN;
END_ENTITY;

ENTITY IfcCurveStyle
 SUBTYPE OF (IfcPresentationStyle);
	CurveFont : OPTIONAL IfcCurveFontOrScaledCurveFontSelect;
	CurveWidth : OPTIONAL IfcSizeSelect;
	CurveColour : OPTIONAL IfcColour;
	ModelOrDraughting : OPTIONAL BOOLEAN;
 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 REAL;
 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 : BOOLEAN;
	Sizeable : BOOLEAN;
END_ENTITY;

ENTITY IfcDoorType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcDoorTypeEnum;
	OperationType : IfcDoorTypeOperationEnum;
	ParameterTakesPrecedence : OPTIONAL BOOLEAN;
	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 : BOOLEAN;
END_ENTITY;

ENTITY IfcEdgeLoop
 SUBTYPE OF (IfcLoop);
	EdgeList : LIST [1:?] OF IfcOrientedEdge;
 DERIVE
	Ne : INTEGER := 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;
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))
 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 : BOOLEAN;
END_ENTITY;

ENTITY IfcFaceOuterBound
 SUBTYPE OF (IfcFaceBound);
END_ENTITY;

ENTITY IfcFaceSurface
 SUPERTYPE OF (ONEOF
	(IfcAdvancedFace))
 SUBTYPE OF (IfcFace);
	FaceSurface : IfcSurface;
	SameSense : BOOLEAN;
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 BOOLEAN;
 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 REAL;
	WorldCoordinateSystem : IfcAxis2Placement;
	TrueNorth : OPTIONAL IfcDirection;
 INVERSE
	HasSubContexts : SET [0:?] OF IfcGeometricRepresentationSubContext FOR ParentContext;
 WHERE
	WR11 : 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 : REAL := NVL(ParentContext.Precision,1.E-5);
 WHERE
	WR31 : NOT('IFC4.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(ParentContext));
	WR32 : (TargetView <> IfcGeometricProjectionEnum.USERDEFINED) OR 
             ((TargetView =  IfcGeometricProjectionEnum.USERDEFINED) AND 
              EXISTS(UserDefinedTargetView));
END_ENTITY;

ENTITY IfcGeometricSet
 SUPERTYPE OF (ONEOF
	(IfcGeometricCurveSet))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Elements : SET [1:?] OF IfcGeometricSetSelect;
 DERIVE
	Dim : IfcDimensionCount := Elements[1].Dim;
 WHERE
	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 : BOOLEAN;
 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;
	Overrides : OPTIONAL IfcSurfaceStyleShading;
	Colours : IfcColourRgbList;
	ColourIndex : LIST [1:?] OF INTEGER;
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 INTEGER;
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 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 IfcNormalisedRatioMeasure;
 INVERSE
	ToMaterialLayerSet : IfcMaterialLayerSet FOR MaterialLayers;
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 IfcNormalisedRatioMeasure;
	Category : OPTIONAL IfcLabel;
 INVERSE
	ToMaterialProfileSet : IfcMaterialProfileSet FOR MaterialProfiles;
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 : IfcMetricValueSelect;
	ReferencePath : OPTIONAL IfcReference;
END_ENTITY;

ENTITY IfcMirroredProfileDef
 SUBTYPE OF (IfcDerivedProfileDef);
 DERIVE
	SELF\IfcDerivedProfileDef.Operator : IfcCartesianTransformationOperator2D := IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
                                           IfcCartesianTransformationOperator(
                                               
                                               IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
                                               IfcDirection([-1., 0.]),
                                               
                                               IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
                                               IfcDirection([ 0., 1.]),
                                               
                                               IfcRepresentationItem() || IfcGeometricRepresentationItem() ||
                                               IfcPoint() || IfcCartesianPoint([0., 0.]),
                                               
                                               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;
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 : LOGICAL;
 WHERE
	DimIs2D : BasisCurve.Dim = 2;
END_ENTITY;

ENTITY IfcOffsetCurve3D
 SUBTYPE OF (IfcCurve);
	BasisCurve : IfcCurve;
	Distance : IfcLengthMeasure;
	SelfIntersect : LOGICAL;
	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 : BOOLEAN;
 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 BINARY(32);
 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 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 : LOGICAL;
	LayerFrozen : LOGICAL;
	LayerBlocked : LOGICAL;
	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;
	HasOwnerHistory : EXISTS(SELF\IfcRoot.OwnerHistory);
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
	WR11 : 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;
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:1] 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
	CorrectShapeDecomposition : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) 
                                   OR 
                                  ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) 
                                    AND 
                                    ((NOT(EXISTS(SELF\IfcProduct.Representation))) 
                                      OR
                                      ((EXISTS(SELF\IfcProduct.Representation)) 
                                        AND 
                                        (SIZEOF(QUERY( temp <* SELF\IfcProduct.Representation.Representations |
                                          temp.RepresentationIdentifier = 'Body')) = 0
                                        )
                                      )
                                    )
                                  );
	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 REAL;
 DERIVE
	Weights : ARRAY [0:UpperIndexOnControlPoints] OF REAL := 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 REAL;
 DERIVE
	Weights : ARRAY [0:UUpper] OF ARRAY [0:VUpper] OF REAL := 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 : BOOLEAN;
	Vsense : BOOLEAN;
 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 INTEGER;
	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 NUMBER;
	RelatedPriorities : LIST [0:?] OF NUMBER;
	RelatedConnectionType : IfcConnectionTypeEnum;
	RelatingConnectionType : IfcConnectionTypeEnum;
 WHERE
	NormalizedRelatingPriorities : (SIZEOF(RelatingPriorities) = 0)
                                     OR
                                     (SIZEOF (QUERY (temp <* RelatingPriorities
                                       | {0.0 <= temp <= 1.0}
                                       )) = SIZEOF(RelatingPriorities));
	NormalizedRelatedPriorities : (SIZEOF(RelatedPriorities) = 0)
                                     OR
                                     (SIZEOF (QUERY (temp <* RelatedPriorities
                                       | {0.0 <= temp <= 1.0}
                                       )) = 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:1] OF IfcObjectDefinition;
	RelatingPropertyDefinition : IfcPropertySetDefinitionSelect;
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
	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC4.IFCSPATIALSTRUCTUREELEMENT' 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 BOOLEAN;
	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
	CorrectShapeDecomposition : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) 
                                   OR 
                                  ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) 
                                    AND 
                                    ((NOT(EXISTS(SELF\IfcProduct.Representation))) 
                                      OR
                                      ((EXISTS(SELF\IfcProduct.Representation)) 
                                        AND 
                                        (SIZEOF(QUERY( temp <* SELF\IfcProduct.Representation.Representations |
                                          temp.RepresentationIdentifier = 'Body')) = 0
                                        )
                                      )
                                    )
                                  );
	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 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 : LOGICAL;
	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
	WR21 : 'IFC4.IFCGEOMETRICREPRESENTATIONCONTEXT' 
             IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
	WR22 : SIZEOF(QUERY(temp <* Items | 
               ('IFC4.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
                 AND (NOT(SIZEOF(
                   ['IFC4.IFCVERTEXPOINT',
                    'IFC4.IFCEDGECURVE',
                    'IFC4.IFCFACESURFACE'] * TYPEOF(temp)) = 1))
             )) = 0;
	WR23 : EXISTS(SELF\IfcRepresentation.RepresentationType);
	WR24 : IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
END_ENTITY;

ENTITY IfcShellBasedSurfaceModel
 SUBTYPE OF (IfcGeometricRepresentationItem);
	SbsmBoundary : SET [1:?] OF IfcShell;
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcSimpleProperty
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPropertyBoundedValue
	,IfcPropertyEnumeratedValue
	,IfcPropertyListValue
	,IfcPropertyReferenceValue
	,IfcPropertySingleValue
	,IfcPropertyTableValue))
 SUBTYPE OF (IfcProperty);
END_ENTITY;

ENTITY 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 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
	CorrectShapeDecomposition : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) 
                                   OR 
                                  ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) 
                                    AND 
                                    ((NOT(EXISTS(SELF\IfcProduct.Representation))) 
                                      OR
                                      ((EXISTS(SELF\IfcProduct.Representation)) 
                                        AND 
                                        (SIZEOF(QUERY( temp <* SELF\IfcProduct.Representation.Representations |
                                          temp.RepresentationIdentifier = 'Body')) = 0
                                        )
                                      )
                                    )
                                  );
	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);
	NumberOfRiser : OPTIONAL INTEGER;
	NumberOfTreads : OPTIONAL INTEGER;
	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 BOOLEAN;
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 : BOOLEAN;
 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 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);
	Transparency : OPTIONAL IfcNormalisedRatioMeasure;
	DiffuseColour : OPTIONAL IfcColourOrFactor;
	TransmissionColour : OPTIONAL IfcColourOrFactor;
	DiffuseTransmissionColour : OPTIONAL IfcColourOrFactor;
	ReflectionColour : OPTIONAL IfcColourOrFactor;
	SpecularColour : OPTIONAL IfcColourOrFactor;
	SpecularHighlight : OPTIONAL IfcSpecularHighlightSelect;
	ReflectanceMethod : IfcReflectanceMethodEnum;
END_ENTITY;

ENTITY IfcSurfaceStyleShading
 SUPERTYPE OF (ONEOF
	(IfcSurfaceStyleRendering))
 SUBTYPE OF (IfcPresentationItem);
	SurfaceColour : IfcColourRgb;
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 : BOOLEAN;
	RepeatT : BOOLEAN;
	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);
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 : INTEGER := HIINDEX(Rows[1].RowCells);
	NumberOfHeadings : INTEGER := SIZEOF(QUERY( Temp <* Rows | Temp.IsHeading));
	NumberOfDataRows : INTEGER := SIZEOF(QUERY( Temp <* Rows | NOT(Temp.IsHeading)));
 WHERE
	WR1 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
	WR2 : { 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 BOOLEAN;
 INVERSE
	OfTable : IfcTable FOR Rows;
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 : BOOLEAN;
	Priority : OPTIONAL INTEGER;
	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 BOOLEAN;
	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);
	Recurrance : 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;
	SheethDiameter : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	CorrectPredefinedType : (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR
                              ((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTessellatedFaceSet
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcTriangulatedFaceSet))
 SUBTYPE OF (IfcTessellatedItem);
	Coordinates : IfcCartesianPointList3D;
	Normals : OPTIONAL LIST [1:?] OF LIST [3:3] OF IfcParameterValue;
	Closed : OPTIONAL BOOLEAN;
 INVERSE
	HasColours : SET [0:1] OF IfcIndexedColourMap FOR MappedTo;
	HasTextures : SET [0:?] OF IfcIndexedTextureMap FOR MappedTo;
END_ENTITY;

ENTITY IfcTessellatedItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(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 BOOLEAN;
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 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);
	CoordIndex : LIST [1:?] OF LIST [3:3] OF INTEGER;
	NormalIndex : OPTIONAL LIST [1:?] OF LIST [3:3] OF INTEGER;
 DERIVE
	NumberOfTriangles : INTEGER := SIZEOF(CoordIndex);
END_ENTITY;

ENTITY IfcTrimmedCurve
 SUBTYPE OF (IfcBoundedCurve);
	BasisCurve : IfcCurve;
	Trim1 : SET [1:2] OF IfcTrimmingSelect;
	Trim2 : SET [1:2] OF IfcTrimmingSelect;
	SenseAgreement : BOOLEAN;
	MasterRepresentation : IfcTrimmingPreference;
 WHERE
	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
	WR1 : EXISTS(SELF\IfcRoot.Name);
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 : BOOLEAN;
	Sizeable : BOOLEAN;
END_ENTITY;

ENTITY IfcWindowType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcWindowTypeEnum;
	PartitioningType : IfcWindowTypePartitioningEnum;
	ParameterTakesPrecedence : OPTIONAL BOOLEAN;
	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 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 IfcConstraintsParamBSpline
	( Degree, UpKnots, UpCp : INTEGER;
    KnotMult : LIST OF INTEGER;
    Knots : LIST OF IfcParameterValue )
	: BOOLEAN;
  
  
    LOCAL
      Result : BOOLEAN := TRUE;
      K, Sum : INTEGER;
    END_LOCAL;
  
    
    Sum := KnotMult[1];
    REPEAT i := 2 TO UpKnots;
      Sum := Sum + KnotMult[i];
    END_REPEAT;
  
    
    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;
  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.IFCCOMPOSITECURVEONSURFACE' IN TYPEOF (C) THEN
  
      
  
      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;
    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;
  
    
    IF (U1-Low1+1) <> SIZEOF(Lis) THEN
      RETURN (?);
    END_IF;
    IF (U2 - Low2 + 1 ) <> SIZEOF(Lis[1]) THEN
      RETURN (?) ;
    END_IF;
  
    
    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 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.IFCTESSELATEDITEM',
                   '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 | ('IFC4.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(temp))));            
      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 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 IfcUniquePropertyTemplateNames
	(Properties : SET [1:?] OF IfcPropertyTemplate)
	: 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 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;