(*
Copyright by:
International Alliance for Interoperability, 1996-2005

All rights reserved. No part of this documentation may be
reproduced, stored in a retrieval system, or transmitted
in any form or by any means, without the prior written
permission of the owner.

Contents:
full IFC object model EXPRESS definitions for the IFC2x Edition 3 final version


- express longform distribution
- compiled for EXPRESS version 1 technical corrigendum 2

Issue date:
December 15, 2005

Development Team:
Modeling Support Group of the 
International Alliance for Interoperability
compiled by Thomas Liebich tl@aec3.com
*)
SCHEMA IFC2X3;

TYPE IfcAbsorbedDoseMeasure = REAL;
END_TYPE;

TYPE IfcAccelerationMeasure = REAL;
END_TYPE;

TYPE IfcAmountOfSubstanceMeasure = REAL;
END_TYPE;

TYPE IfcAngularVelocityMeasure = REAL;
END_TYPE;

TYPE IfcAreaMeasure = REAL;
END_TYPE;

TYPE IfcBoolean = BOOLEAN;
END_TYPE;

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

TYPE IfcComplexNumber = ARRAY [1:2] OF REAL;
END_TYPE;

TYPE IfcCompoundPlaneAngleMeasure = LIST [3:3] OF INTEGER;
 WHERE
	WR1 : { -360 <= SELF[1] < 360 };
	WR2 : { -60 <= SELF[2] < 60 };
	WR3 : { -60 <= SELF[3] < 60 };
	WR4 : ((SELF[1] >= 0) AND (SELF[2] >= 0) AND (SELF[3] >= 0)) OR ((SELF[1] <= 0) AND (SELF[2] <= 0) AND (SELF[3] <= 0));
END_TYPE;

TYPE IfcContextDependentMeasure = REAL;
END_TYPE;

TYPE IfcCountMeasure = NUMBER;
END_TYPE;

TYPE IfcCurvatureMeasure = REAL;
END_TYPE;

TYPE IfcDayInMonthNumber = INTEGER;
END_TYPE;

TYPE IfcDaylightSavingHour = INTEGER;
 WHERE
	WR1 : { 0 <= SELF <= 2 };
END_TYPE;

TYPE IfcDescriptiveMeasure = STRING;
END_TYPE;

TYPE IfcDimensionCount = INTEGER;
 WHERE
	WR1 : { 0 < SELF <= 3 };
END_TYPE;

TYPE IfcDoseEquivalentMeasure = REAL;
END_TYPE;

TYPE IfcDynamicViscosityMeasure = REAL;
END_TYPE;

TYPE IfcElectricCapacitanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricChargeMeasure = REAL;
END_TYPE;

TYPE IfcElectricConductanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricCurrentMeasure = REAL;
END_TYPE;

TYPE IfcElectricResistanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricVoltageMeasure = REAL;
END_TYPE;

TYPE IfcEnergyMeasure = REAL;
END_TYPE;

TYPE IfcFontStyle = STRING;
 WHERE
	WR1 : SELF IN ['normal','italic','oblique'];
END_TYPE;

TYPE IfcFontVariant = STRING;
 WHERE
	WR1 : SELF IN ['normal','small-caps'];
END_TYPE;

TYPE IfcFontWeight = STRING;
 WHERE
	WR1 : SELF IN ['normal','small-caps','100','200','300','400','500','600','700','800','900'];
END_TYPE;

TYPE IfcForceMeasure = REAL;
END_TYPE;

TYPE IfcFrequencyMeasure = REAL;
END_TYPE;

TYPE IfcGloballyUniqueId = STRING(22) FIXED;
END_TYPE;

TYPE IfcHeatFluxDensityMeasure = REAL;
END_TYPE;

TYPE IfcHeatingValueMeasure = REAL;
 WHERE
	WR1 : SELF > 0.;
END_TYPE;

TYPE IfcHourInDay = INTEGER;
 WHERE
	WR1 : { 0 <= SELF < 24 };
END_TYPE;

TYPE IfcIdentifier = STRING;
END_TYPE;

TYPE IfcIlluminanceMeasure = REAL;
END_TYPE;

TYPE IfcInductanceMeasure = REAL;
END_TYPE;

TYPE IfcInteger = INTEGER;
END_TYPE;

TYPE IfcIntegerCountRateMeasure = INTEGER;
END_TYPE;

TYPE IfcIonConcentrationMeasure = REAL;
END_TYPE;

TYPE IfcIsothermalMoistureCapacityMeasure = REAL;
END_TYPE;

TYPE IfcKinematicViscosityMeasure = REAL;
END_TYPE;

TYPE IfcLabel = STRING;
END_TYPE;

TYPE IfcLengthMeasure = REAL;
END_TYPE;

TYPE IfcLinearForceMeasure = REAL;
END_TYPE;

TYPE IfcLinearMomentMeasure = REAL;
END_TYPE;

TYPE IfcLinearStiffnessMeasure = REAL;
END_TYPE;

TYPE IfcLinearVelocityMeasure = REAL;
END_TYPE;

TYPE IfcLogical = LOGICAL;
END_TYPE;

TYPE IfcLuminousFluxMeasure = REAL;
END_TYPE;

TYPE IfcLuminousIntensityDistributionMeasure = REAL;
END_TYPE;

TYPE IfcLuminousIntensityMeasure = REAL;
END_TYPE;

TYPE IfcMagneticFluxDensityMeasure = REAL;
END_TYPE;

TYPE IfcMagneticFluxMeasure = REAL;
END_TYPE;

TYPE IfcMassDensityMeasure = REAL;
END_TYPE;

TYPE IfcMassFlowRateMeasure = REAL;
END_TYPE;

TYPE IfcMassMeasure = REAL;
END_TYPE;

TYPE IfcMassPerLengthMeasure = REAL;
END_TYPE;

TYPE IfcMinuteInHour = INTEGER;
 WHERE
	WR1 : {0 <= SELF <= 59 };
END_TYPE;

TYPE IfcModulusOfElasticityMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfLinearSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfRotationalSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcMoistureDiffusivityMeasure = REAL;
END_TYPE;

TYPE IfcMolecularWeightMeasure = REAL;
END_TYPE;

TYPE IfcMomentOfInertiaMeasure = REAL;
END_TYPE;

TYPE IfcMonetaryMeasure = REAL;
END_TYPE;

TYPE IfcMonthInYearNumber = INTEGER;
 WHERE
	WR1 : { 1<= SELF <= 12 };
END_TYPE;

TYPE IfcNormalisedRatioMeasure = IfcRatioMeasure;
 WHERE
	WR1 : {0.0 <= SELF <= 1.0};
END_TYPE;

TYPE IfcNumericMeasure = NUMBER;
END_TYPE;

TYPE IfcPHMeasure = REAL;
 WHERE
	WR21 : {0.0 <= SELF <= 14.0};
END_TYPE;

TYPE IfcParameterValue = REAL;
END_TYPE;

TYPE IfcPlanarForceMeasure = REAL;
END_TYPE;

TYPE IfcPlaneAngleMeasure = REAL;
END_TYPE;

TYPE IfcPositiveLengthMeasure = IfcLengthMeasure;
 WHERE
	WR1 : SELF > 0.;
END_TYPE;

TYPE IfcPositivePlaneAngleMeasure = IfcPlaneAngleMeasure;
 WHERE
	WR1 : SELF > 0.;
END_TYPE;

TYPE IfcPositiveRatioMeasure = IfcRatioMeasure;
 WHERE
	WR1 : SELF > 0.;
END_TYPE;

TYPE IfcPowerMeasure = REAL;
END_TYPE;

TYPE IfcPresentableText = STRING;
END_TYPE;

TYPE IfcPressureMeasure = REAL;
END_TYPE;

TYPE IfcRadioActivityMeasure = REAL;
END_TYPE;

TYPE IfcRatioMeasure = REAL;
END_TYPE;

TYPE IfcReal = REAL;
END_TYPE;

TYPE IfcRotationalFrequencyMeasure = REAL;
END_TYPE;

TYPE IfcRotationalMassMeasure = REAL;
END_TYPE;

TYPE IfcRotationalStiffnessMeasure = REAL;
END_TYPE;

TYPE IfcSecondInMinute = REAL;
 WHERE
	WR1 : { 0. <= SELF < 60. };
END_TYPE;

TYPE IfcSectionModulusMeasure = REAL;
END_TYPE;

TYPE IfcSectionalAreaIntegralMeasure = REAL;
END_TYPE;

TYPE IfcShearModulusMeasure = REAL;
END_TYPE;

TYPE IfcSolidAngleMeasure = REAL;
END_TYPE;

TYPE IfcSoundPowerMeasure = REAL;
END_TYPE;

TYPE IfcSoundPressureMeasure = REAL;
END_TYPE;

TYPE IfcSpecificHeatCapacityMeasure = REAL;
END_TYPE;

TYPE IfcSpecularExponent = REAL;
END_TYPE;

TYPE IfcSpecularRoughness = REAL;
 WHERE
	WR1 : {0.0 <= SELF <= 1.0};
END_TYPE;

TYPE IfcTemperatureGradientMeasure = REAL;
END_TYPE;

TYPE IfcText = STRING;
END_TYPE;

TYPE IfcTextAlignment = STRING;
 WHERE
	WR1 : SELF IN ['left', 'right', 'center', 'justify'];
END_TYPE;

TYPE IfcTextDecoration = STRING;
 WHERE
	WR1 : SELF IN ['none', 'underline', 'overline', 'line-through', 'blink'];
END_TYPE;

TYPE IfcTextFontName = STRING;
END_TYPE;

TYPE IfcTextTransformation = STRING;
 WHERE
	WR1 : SELF IN ['capitalize', 'uppercase', 'lowercase', 'none'];
END_TYPE;

TYPE IfcThermalAdmittanceMeasure = REAL;
END_TYPE;

TYPE IfcThermalConductivityMeasure = REAL;
END_TYPE;

TYPE IfcThermalExpansionCoefficientMeasure = REAL;
END_TYPE;

TYPE IfcThermalResistanceMeasure = REAL;
END_TYPE;

TYPE IfcThermalTransmittanceMeasure = REAL;
END_TYPE;

TYPE IfcThermodynamicTemperatureMeasure = REAL;
END_TYPE;

TYPE IfcTimeMeasure = REAL;
END_TYPE;

TYPE IfcTimeStamp = INTEGER;
END_TYPE;

TYPE IfcTorqueMeasure = REAL;
END_TYPE;

TYPE IfcVaporPermeabilityMeasure = REAL;
END_TYPE;

TYPE IfcVolumeMeasure = REAL;
END_TYPE;

TYPE IfcVolumetricFlowRateMeasure = REAL;
END_TYPE;

TYPE IfcWarpingConstantMeasure = REAL;
END_TYPE;

TYPE IfcWarpingMomentMeasure = REAL;
END_TYPE;

TYPE IfcYearNumber = INTEGER;
END_TYPE;

TYPE IfcActionSourceTypeEnum = ENUMERATION OF
	(DEAD_LOAD_G
	,COMPLETION_G1
	,LIVE_LOAD_Q
	,SNOW_S
	,WIND_W
	,PRESTRESSING_P
	,SETTLEMENT_U
	,TEMPERATURE_T
	,EARTHQUAKE_E
	,FIRE
	,IMPULSE
	,IMPACT
	,TRANSPORT
	,ERECTION
	,PROPPING
	,SYSTEM_IMPERFECTION
	,SHRINKAGE
	,CREEP
	,LACK_OF_FIT
	,BUOYANCY
	,ICE
	,CURRENT
	,WAVE
	,RAIN
	,BRAKES
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcActionTypeEnum = ENUMERATION OF
	(PERMANENT_G
	,VARIABLE_Q
	,EXTRAORDINARY_A
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcActuatorTypeEnum = ENUMERATION OF
	(ELECTRICACTUATOR
	,HANDOPERATEDACTUATOR
	,HYDRAULICACTUATOR
	,PNEUMATICACTUATOR
	,THERMOSTATICACTUATOR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAddressTypeEnum = ENUMERATION OF
	(OFFICE
	,SITE
	,HOME
	,DISTRIBUTIONPOINT
	,USERDEFINED);
END_TYPE;

TYPE IfcAheadOrBehind = ENUMERATION OF
	(AHEAD
	,BEHIND);
END_TYPE;

TYPE IfcAirTerminalBoxTypeEnum = ENUMERATION OF
	(CONSTANTFLOW
	,VARIABLEFLOWPRESSUREDEPENDANT
	,VARIABLEFLOWPRESSUREINDEPENDANT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAirTerminalTypeEnum = ENUMERATION OF
	(GRILLE
	,REGISTER
	,DIFFUSER
	,EYEBALL
	,IRIS
	,LINEARGRILLE
	,LINEARDIFFUSER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAirToAirHeatRecoveryTypeEnum = ENUMERATION OF
	(FIXEDPLATECOUNTERFLOWEXCHANGER
	,FIXEDPLATECROSSFLOWEXCHANGER
	,FIXEDPLATEPARALLELFLOWEXCHANGER
	,ROTARYWHEEL
	,RUNAROUNDCOILLOOP
	,HEATPIPE
	,TWINTOWERENTHALPYRECOVERYLOOPS
	,THERMOSIPHONSEALEDTUBEHEATEXCHANGERS
	,THERMOSIPHONCOILTYPEHEATEXCHANGERS
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAlarmTypeEnum = ENUMERATION OF
	(BELL
	,BREAKGLASSBUTTON
	,LIGHT
	,MANUALPULLBOX
	,SIREN
	,WHISTLE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAnalysisModelTypeEnum = ENUMERATION OF
	(IN_PLANE_LOADING_2D
	,OUT_PLANE_LOADING_2D
	,LOADING_3D
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcAnalysisTheoryTypeEnum = ENUMERATION OF
	(FIRST_ORDER_THEORY
	,SECOND_ORDER_THEORY
	,THIRD_ORDER_THEORY
	,FULL_NONLINEAR_THEORY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcArithmeticOperatorEnum = ENUMERATION OF
	(ADD
	,DIVIDE
	,MULTIPLY
	,SUBTRACT);
END_TYPE;

TYPE IfcAssemblyPlaceEnum = ENUMERATION OF
	(SITE
	,FACTORY
	,NOTDEFINED);
END_TYPE;

TYPE IfcBSplineCurveForm = ENUMERATION OF
	(POLYLINE_FORM
	,CIRCULAR_ARC
	,ELLIPTIC_ARC
	,PARABOLIC_ARC
	,HYPERBOLIC_ARC
	,UNSPECIFIED);
END_TYPE;

TYPE IfcBeamTypeEnum = ENUMERATION OF
	(BEAM
	,JOIST
	,LINTEL
	,T_BEAM
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcBenchmarkEnum = ENUMERATION OF
	(GREATERTHAN
	,GREATERTHANOREQUALTO
	,LESSTHAN
	,LESSTHANOREQUALTO
	,EQUALTO
	,NOTEQUALTO);
END_TYPE;

TYPE IfcBoilerTypeEnum = ENUMERATION OF
	(WATER
	,STEAM
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcBooleanOperator = ENUMERATION OF
	(UNION
	,INTERSECTION
	,DIFFERENCE);
END_TYPE;

TYPE IfcBuildingElementProxyTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCableCarrierFittingTypeEnum = ENUMERATION OF
	(BEND
	,CROSS
	,REDUCER
	,TEE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCableCarrierSegmentTypeEnum = ENUMERATION OF
	(CABLELADDERSEGMENT
	,CABLETRAYSEGMENT
	,CABLETRUNKINGSEGMENT
	,CONDUITSEGMENT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCableSegmentTypeEnum = ENUMERATION OF
	(CABLESEGMENT
	,CONDUCTORSEGMENT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcChangeActionEnum = ENUMERATION OF
	(NOCHANGE
	,MODIFIED
	,ADDED
	,DELETED
	,MODIFIEDADDED
	,MODIFIEDDELETED);
END_TYPE;

TYPE IfcChillerTypeEnum = ENUMERATION OF
	(AIRCOOLED
	,WATERCOOLED
	,HEATRECOVERY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCoilTypeEnum = ENUMERATION OF
	(DXCOOLINGCOIL
	,WATERCOOLINGCOIL
	,STEAMHEATINGCOIL
	,WATERHEATINGCOIL
	,ELECTRICHEATINGCOIL
	,GASHEATINGCOIL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcColumnTypeEnum = ENUMERATION OF
	(COLUMN
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCompressorTypeEnum = ENUMERATION OF
	(DYNAMIC
	,RECIPROCATING
	,ROTARY
	,SCROLL
	,TROCHOIDAL
	,SINGLESTAGE
	,BOOSTER
	,OPENTYPE
	,HERMETIC
	,SEMIHERMETIC
	,WELDEDSHELLHERMETIC
	,ROLLINGPISTON
	,ROTARYVANE
	,SINGLESCREW
	,TWINSCREW
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCondenserTypeEnum = ENUMERATION OF
	(WATERCOOLEDSHELLTUBE
	,WATERCOOLEDSHELLCOIL
	,WATERCOOLEDTUBEINTUBE
	,WATERCOOLEDBRAZEDPLATE
	,AIRCOOLED
	,EVAPORATIVECOOLED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcConnectionTypeEnum = ENUMERATION OF
	(ATPATH
	,ATSTART
	,ATEND
	,NOTDEFINED);
END_TYPE;

TYPE IfcConstraintEnum = ENUMERATION OF
	(HARD
	,SOFT
	,ADVISORY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcControllerTypeEnum = ENUMERATION OF
	(FLOATING
	,PROPORTIONAL
	,PROPORTIONALINTEGRAL
	,PROPORTIONALINTEGRALDERIVATIVE
	,TIMEDTWOPOSITION
	,TWOPOSITION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCooledBeamTypeEnum = ENUMERATION OF
	(ACTIVE
	,PASSIVE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCoolingTowerTypeEnum = ENUMERATION OF
	(NATURALDRAFT
	,MECHANICALINDUCEDDRAFT
	,MECHANICALFORCEDDRAFT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCostScheduleTypeEnum = ENUMERATION OF
	(BUDGET
	,COSTPLAN
	,ESTIMATE
	,TENDER
	,PRICEDBILLOFQUANTITIES
	,UNPRICEDBILLOFQUANTITIES
	,SCHEDULEOFRATES
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCoveringTypeEnum = ENUMERATION OF
	(CEILING
	,FLOORING
	,CLADDING
	,ROOFING
	,INSULATION
	,MEMBRANE
	,SLEEVING
	,WRAPPING
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcCurrencyEnum = ENUMERATION OF
	(AED
	,AES
	,ATS
	,AUD
	,BBD
	,BEG
	,BGL
	,BHD
	,BMD
	,BND
	,BRL
	,BSD
	,BWP
	,BZD
	,CAD
	,CBD
	,CHF
	,CLP
	,CNY
	,CYS
	,CZK
	,DDP
	,DEM
	,DKK
	,EGL
	,EST
	,EUR
	,FAK
	,FIM
	,FJD
	,FKP
	,FRF
	,GBP
	,GIP
	,GMD
	,GRX
	,HKD
	,HUF
	,ICK
	,IDR
	,ILS
	,INR
	,IRP
	,ITL
	,JMD
	,JOD
	,JPY
	,KES
	,KRW
	,KWD
	,KYD
	,LKR
	,LUF
	,MTL
	,MUR
	,MXN
	,MYR
	,NLG
	,NZD
	,OMR
	,PGK
	,PHP
	,PKR
	,PLN
	,PTN
	,QAR
	,RUR
	,SAR
	,SCR
	,SEK
	,SGD
	,SKP
	,THB
	,TRL
	,TTD
	,TWD
	,USD
	,VEB
	,VND
	,XEU
	,ZAR
	,ZWD
	,NOK);
END_TYPE;

TYPE IfcCurtainWallTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDamperTypeEnum = ENUMERATION OF
	(CONTROLDAMPER
	,FIREDAMPER
	,SMOKEDAMPER
	,FIRESMOKEDAMPER
	,BACKDRAFTDAMPER
	,RELIEFDAMPER
	,BLASTDAMPER
	,GRAVITYDAMPER
	,GRAVITYRELIEFDAMPER
	,BALANCINGDAMPER
	,FUMEHOODEXHAUST
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDataOriginEnum = ENUMERATION OF
	(MEASURED
	,PREDICTED
	,SIMULATED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDerivedUnitEnum = ENUMERATION OF
	(ANGULARVELOCITYUNIT
	,COMPOUNDPLANEANGLEUNIT
	,DYNAMICVISCOSITYUNIT
	,HEATFLUXDENSITYUNIT
	,INTEGERCOUNTRATEUNIT
	,ISOTHERMALMOISTURECAPACITYUNIT
	,KINEMATICVISCOSITYUNIT
	,LINEARVELOCITYUNIT
	,MASSDENSITYUNIT
	,MASSFLOWRATEUNIT
	,MOISTUREDIFFUSIVITYUNIT
	,MOLECULARWEIGHTUNIT
	,SPECIFICHEATCAPACITYUNIT
	,THERMALADMITTANCEUNIT
	,THERMALCONDUCTANCEUNIT
	,THERMALRESISTANCEUNIT
	,THERMALTRANSMITTANCEUNIT
	,VAPORPERMEABILITYUNIT
	,VOLUMETRICFLOWRATEUNIT
	,ROTATIONALFREQUENCYUNIT
	,TORQUEUNIT
	,MOMENTOFINERTIAUNIT
	,LINEARMOMENTUNIT
	,LINEARFORCEUNIT
	,PLANARFORCEUNIT
	,MODULUSOFELASTICITYUNIT
	,SHEARMODULUSUNIT
	,LINEARSTIFFNESSUNIT
	,ROTATIONALSTIFFNESSUNIT
	,MODULUSOFSUBGRADEREACTIONUNIT
	,ACCELERATIONUNIT
	,CURVATUREUNIT
	,HEATINGVALUEUNIT
	,IONCONCENTRATIONUNIT
	,LUMINOUSINTENSITYDISTRIBUTIONUNIT
	,MASSPERLENGTHUNIT
	,MODULUSOFLINEARSUBGRADEREACTIONUNIT
	,MODULUSOFROTATIONALSUBGRADEREACTIONUNIT
	,PHUNIT
	,ROTATIONALMASSUNIT
	,SECTIONAREAINTEGRALUNIT
	,SECTIONMODULUSUNIT
	,SOUNDPOWERUNIT
	,SOUNDPRESSUREUNIT
	,TEMPERATUREGRADIENTUNIT
	,THERMALEXPANSIONCOEFFICIENTUNIT
	,WARPINGCONSTANTUNIT
	,WARPINGMOMENTUNIT
	,USERDEFINED);
END_TYPE;

TYPE IfcDimensionExtentUsage = ENUMERATION OF
	(ORIGIN
	,TARGET);
END_TYPE;

TYPE IfcDirectionSenseEnum = ENUMERATION OF
	(POSITIVE
	,NEGATIVE);
END_TYPE;

TYPE IfcDistributionChamberElementTypeEnum = ENUMERATION OF
	(FORMEDDUCT
	,INSPECTIONCHAMBER
	,INSPECTIONPIT
	,MANHOLE
	,METERCHAMBER
	,SUMP
	,TRENCH
	,VALVECHAMBER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDocumentConfidentialityEnum = ENUMERATION OF
	(PUBLIC
	,RESTRICTED
	,CONFIDENTIAL
	,PERSONAL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDocumentStatusEnum = ENUMERATION OF
	(DRAFT
	,FINALDRAFT
	,FINAL
	,REVISION
	,NOTDEFINED);
END_TYPE;

TYPE IfcDoorPanelOperationEnum = ENUMERATION OF
	(SWINGING
	,DOUBLE_ACTING
	,SLIDING
	,FOLDING
	,REVOLVING
	,ROLLINGUP
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDoorPanelPositionEnum = ENUMERATION OF
	(LEFT
	,MIDDLE
	,RIGHT
	,NOTDEFINED);
END_TYPE;

TYPE IfcDoorStyleConstructionEnum = ENUMERATION OF
	(ALUMINIUM
	,HIGH_GRADE_STEEL
	,STEEL
	,WOOD
	,ALUMINIUM_WOOD
	,ALUMINIUM_PLASTIC
	,PLASTIC
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDoorStyleOperationEnum = ENUMERATION OF
	(SINGLE_SWING_LEFT
	,SINGLE_SWING_RIGHT
	,DOUBLE_DOOR_SINGLE_SWING
	,DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_LEFT
	,DOUBLE_DOOR_SINGLE_SWING_OPPOSITE_RIGHT
	,DOUBLE_SWING_LEFT
	,DOUBLE_SWING_RIGHT
	,DOUBLE_DOOR_DOUBLE_SWING
	,SLIDING_TO_LEFT
	,SLIDING_TO_RIGHT
	,DOUBLE_DOOR_SLIDING
	,FOLDING_TO_LEFT
	,FOLDING_TO_RIGHT
	,DOUBLE_DOOR_FOLDING
	,REVOLVING
	,ROLLINGUP
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDuctFittingTypeEnum = ENUMERATION OF
	(BEND
	,CONNECTOR
	,ENTRY
	,EXIT
	,JUNCTION
	,OBSTRUCTION
	,TRANSITION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDuctSegmentTypeEnum = ENUMERATION OF
	(RIGIDSEGMENT
	,FLEXIBLESEGMENT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcDuctSilencerTypeEnum = ENUMERATION OF
	(FLATOVAL
	,RECTANGULAR
	,ROUND
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricApplianceTypeEnum = ENUMERATION OF
	(COMPUTER
	,DIRECTWATERHEATER
	,DISHWASHER
	,ELECTRICCOOKER
	,ELECTRICHEATER
	,FACSIMILE
	,FREESTANDINGFAN
	,FREEZER
	,FRIDGE_FREEZER
	,HANDDRYER
	,INDIRECTWATERHEATER
	,MICROWAVE
	,PHOTOCOPIER
	,PRINTER
	,REFRIGERATOR
	,RADIANTHEATER
	,SCANNER
	,TELEPHONE
	,TUMBLEDRYER
	,TV
	,VENDINGMACHINE
	,WASHINGMACHINE
	,WATERHEATER
	,WATERCOOLER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricCurrentEnum = ENUMERATION OF
	(ALTERNATING
	,DIRECT
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricDistributionPointFunctionEnum = ENUMERATION OF
	(ALARMPANEL
	,CONSUMERUNIT
	,CONTROLPANEL
	,DISTRIBUTIONBOARD
	,GASDETECTORPANEL
	,INDICATORPANEL
	,MIMICPANEL
	,MOTORCONTROLCENTRE
	,SWITCHBOARD
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricFlowStorageDeviceTypeEnum = ENUMERATION OF
	(BATTERY
	,CAPACITORBANK
	,HARMONICFILTER
	,INDUCTORBANK
	,UPS
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricGeneratorTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricHeaterTypeEnum = ENUMERATION OF
	(ELECTRICPOINTHEATER
	,ELECTRICCABLEHEATER
	,ELECTRICMATHEATER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricMotorTypeEnum = ENUMERATION OF
	(DC
	,INDUCTION
	,POLYPHASE
	,RELUCTANCESYNCHRONOUS
	,SYNCHRONOUS
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElectricTimeControlTypeEnum = ENUMERATION OF
	(TIMECLOCK
	,TIMEDELAY
	,RELAY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElementAssemblyTypeEnum = ENUMERATION OF
	(ACCESSORY_ASSEMBLY
	,ARCH
	,BEAM_GRID
	,BRACED_FRAME
	,GIRDER
	,REINFORCEMENT_UNIT
	,RIGID_FRAME
	,SLAB_FIELD
	,TRUSS
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcElementCompositionEnum = ENUMERATION OF
	(COMPLEX
	,ELEMENT
	,PARTIAL);
END_TYPE;

TYPE IfcEnergySequenceEnum = ENUMERATION OF
	(PRIMARY
	,SECONDARY
	,TERTIARY
	,AUXILIARY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcEnvironmentalImpactCategoryEnum = ENUMERATION OF
	(COMBINEDVALUE
	,DISPOSAL
	,EXTRACTION
	,INSTALLATION
	,MANUFACTURE
	,TRANSPORTATION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcEvaporativeCoolerTypeEnum = ENUMERATION OF
	(DIRECTEVAPORATIVERANDOMMEDIAAIRCOOLER
	,DIRECTEVAPORATIVERIGIDMEDIAAIRCOOLER
	,DIRECTEVAPORATIVESLINGERSPACKAGEDAIRCOOLER
	,DIRECTEVAPORATIVEPACKAGEDROTARYAIRCOOLER
	,DIRECTEVAPORATIVEAIRWASHER
	,INDIRECTEVAPORATIVEPACKAGEAIRCOOLER
	,INDIRECTEVAPORATIVEWETCOIL
	,INDIRECTEVAPORATIVECOOLINGTOWERORCOILCOOLER
	,INDIRECTDIRECTCOMBINATION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcEvaporatorTypeEnum = ENUMERATION OF
	(DIRECTEXPANSIONSHELLANDTUBE
	,DIRECTEXPANSIONTUBEINTUBE
	,DIRECTEXPANSIONBRAZEDPLATE
	,FLOODEDSHELLANDTUBE
	,SHELLANDCOIL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFanTypeEnum = ENUMERATION OF
	(CENTRIFUGALFORWARDCURVED
	,CENTRIFUGALRADIAL
	,CENTRIFUGALBACKWARDINCLINEDCURVED
	,CENTRIFUGALAIRFOIL
	,TUBEAXIAL
	,VANEAXIAL
	,PROPELLORAXIAL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFilterTypeEnum = ENUMERATION OF
	(AIRPARTICLEFILTER
	,ODORFILTER
	,OILFILTER
	,STRAINER
	,WATERFILTER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFireSuppressionTerminalTypeEnum = ENUMERATION OF
	(BREECHINGINLET
	,FIREHYDRANT
	,HOSEREEL
	,SPRINKLER
	,SPRINKLERDEFLECTOR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFlowDirectionEnum = ENUMERATION OF
	(SOURCE
	,SINK
	,SOURCEANDSINK
	,NOTDEFINED);
END_TYPE;

TYPE IfcFlowInstrumentTypeEnum = ENUMERATION OF
	(PRESSUREGAUGE
	,THERMOMETER
	,AMMETER
	,FREQUENCYMETER
	,POWERFACTORMETER
	,PHASEANGLEMETER
	,VOLTMETER_PEAK
	,VOLTMETER_RMS
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFlowMeterTypeEnum = ENUMERATION OF
	(ELECTRICMETER
	,ENERGYMETER
	,FLOWMETER
	,GASMETER
	,OILMETER
	,WATERMETER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcFootingTypeEnum = ENUMERATION OF
	(FOOTING_BEAM
	,PAD_FOOTING
	,PILE_CAP
	,STRIP_FOOTING
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcGasTerminalTypeEnum = ENUMERATION OF
	(GASAPPLIANCE
	,GASBOOSTER
	,GASBURNER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcGeometricProjectionEnum = ENUMERATION OF
	(GRAPH_VIEW
	,SKETCH_VIEW
	,MODEL_VIEW
	,PLAN_VIEW
	,REFLECTED_PLAN_VIEW
	,SECTION_VIEW
	,ELEVATION_VIEW
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcGlobalOrLocalEnum = ENUMERATION OF
	(GLOBAL_COORDS
	,LOCAL_COORDS);
END_TYPE;

TYPE IfcHeatExchangerTypeEnum = ENUMERATION OF
	(PLATE
	,SHELLANDTUBE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcHumidifierTypeEnum = ENUMERATION OF
	(STEAMINJECTION
	,ADIABATICAIRWASHER
	,ADIABATICPAN
	,ADIABATICWETTEDELEMENT
	,ADIABATICATOMIZING
	,ADIABATICULTRASONIC
	,ADIABATICRIGIDMEDIA
	,ADIABATICCOMPRESSEDAIRNOZZLE
	,ASSISTEDELECTRIC
	,ASSISTEDNATURALGAS
	,ASSISTEDPROPANE
	,ASSISTEDBUTANE
	,ASSISTEDSTEAM
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcInternalOrExternalEnum = ENUMERATION OF
	(INTERNAL
	,EXTERNAL
	,NOTDEFINED);
END_TYPE;

TYPE IfcInventoryTypeEnum = ENUMERATION OF
	(ASSETINVENTORY
	,SPACEINVENTORY
	,FURNITUREINVENTORY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcJunctionBoxTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcLampTypeEnum = ENUMERATION OF
	(COMPACTFLUORESCENT
	,FLUORESCENT
	,HIGHPRESSUREMERCURY
	,HIGHPRESSURESODIUM
	,METALHALIDE
	,TUNGSTENFILAMENT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcLayerSetDirectionEnum = ENUMERATION OF
	(AXIS1
	,AXIS2
	,AXIS3);
END_TYPE;

TYPE IfcLightDistributionCurveEnum = ENUMERATION OF
	(TYPE_A
	,TYPE_B
	,TYPE_C
	,NOTDEFINED);
END_TYPE;

TYPE IfcLightEmissionSourceEnum = ENUMERATION OF
	(COMPACTFLUORESCENT
	,FLUORESCENT
	,HIGHPRESSUREMERCURY
	,HIGHPRESSURESODIUM
	,LIGHTEMITTINGDIODE
	,LOWPRESSURESODIUM
	,LOWVOLTAGEHALOGEN
	,MAINVOLTAGEHALOGEN
	,METALHALIDE
	,TUNGSTENFILAMENT
	,NOTDEFINED);
END_TYPE;

TYPE IfcLightFixtureTypeEnum = ENUMERATION OF
	(POINTSOURCE
	,DIRECTIONSOURCE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcLoadGroupTypeEnum = ENUMERATION OF
	(LOAD_GROUP
	,LOAD_CASE
	,LOAD_COMBINATION_GROUP
	,LOAD_COMBINATION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcLogicalOperatorEnum = ENUMERATION OF
	(LOGICALAND
	,LOGICALOR);
END_TYPE;

TYPE IfcMemberTypeEnum = ENUMERATION OF
	(BRACE
	,CHORD
	,COLLAR
	,MEMBER
	,MULLION
	,PLATE
	,POST
	,PURLIN
	,RAFTER
	,STRINGER
	,STRUT
	,STUD
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcMotorConnectionTypeEnum = ENUMERATION OF
	(BELTDRIVE
	,COUPLING
	,DIRECTDRIVE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcNullStyle = ENUMERATION OF
	(NULL);
END_TYPE;

TYPE IfcObjectTypeEnum = ENUMERATION OF
	(PRODUCT
	,PROCESS
	,CONTROL
	,RESOURCE
	,ACTOR
	,GROUP
	,PROJECT
	,NOTDEFINED);
END_TYPE;

TYPE IfcObjectiveEnum = ENUMERATION OF
	(CODECOMPLIANCE
	,DESIGNINTENT
	,HEALTHANDSAFETY
	,REQUIREMENT
	,SPECIFICATION
	,TRIGGERCONDITION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcOccupantTypeEnum = ENUMERATION OF
	(ASSIGNEE
	,ASSIGNOR
	,LESSEE
	,LESSOR
	,LETTINGAGENT
	,OWNER
	,TENANT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcOutletTypeEnum = ENUMERATION OF
	(AUDIOVISUALOUTLET
	,COMMUNICATIONSOUTLET
	,POWEROUTLET
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPermeableCoveringOperationEnum = ENUMERATION OF
	(GRILL
	,LOUVER
	,SCREEN
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPhysicalOrVirtualEnum = ENUMERATION OF
	(PHYSICAL
	,VIRTUAL
	,NOTDEFINED);
END_TYPE;

TYPE IfcPileConstructionEnum = ENUMERATION OF
	(CAST_IN_PLACE
	,COMPOSITE
	,PRECAST_CONCRETE
	,PREFAB_STEEL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPileTypeEnum = ENUMERATION OF
	(COHESION
	,FRICTION
	,SUPPORT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPipeFittingTypeEnum = ENUMERATION OF
	(BEND
	,CONNECTOR
	,ENTRY
	,EXIT
	,JUNCTION
	,OBSTRUCTION
	,TRANSITION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPipeSegmentTypeEnum = ENUMERATION OF
	(FLEXIBLESEGMENT
	,RIGIDSEGMENT
	,GUTTER
	,SPOOL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPlateTypeEnum = ENUMERATION OF
	(CURTAIN_PANEL
	,SHEET
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcProcedureTypeEnum = ENUMERATION OF
	(ADVICE_CAUTION
	,ADVICE_NOTE
	,ADVICE_WARNING
	,CALIBRATION
	,DIAGNOSTIC
	,SHUTDOWN
	,STARTUP
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcProfileTypeEnum = ENUMERATION OF
	(CURVE
	,AREA);
END_TYPE;

TYPE IfcProjectOrderRecordTypeEnum = ENUMERATION OF
	(CHANGE
	,MAINTENANCE
	,MOVE
	,PURCHASE
	,WORK
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcProjectOrderTypeEnum = ENUMERATION OF
	(CHANGEORDER
	,MAINTENANCEWORKORDER
	,MOVEORDER
	,PURCHASEORDER
	,WORKORDER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcProjectedOrTrueLengthEnum = ENUMERATION OF
	(PROJECTED_LENGTH
	,TRUE_LENGTH);
END_TYPE;

TYPE IfcPropertySourceEnum = ENUMERATION OF
	(DESIGN
	,DESIGNMAXIMUM
	,DESIGNMINIMUM
	,SIMULATED
	,ASBUILT
	,COMMISSIONING
	,MEASURED
	,USERDEFINED
	,NOTKNOWN);
END_TYPE;

TYPE IfcProtectiveDeviceTypeEnum = ENUMERATION OF
	(FUSEDISCONNECTOR
	,CIRCUITBREAKER
	,EARTHFAILUREDEVICE
	,RESIDUALCURRENTCIRCUITBREAKER
	,RESIDUALCURRENTSWITCH
	,VARISTOR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcPumpTypeEnum = ENUMERATION OF
	(CIRCULATOR
	,ENDSUCTION
	,SPLITCASE
	,VERTICALINLINE
	,VERTICALTURBINE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcRailingTypeEnum = ENUMERATION OF
	(HANDRAIL
	,GUARDRAIL
	,BALUSTRADE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcRampFlightTypeEnum = ENUMERATION OF
	(STRAIGHT
	,SPIRAL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcRampTypeEnum = ENUMERATION OF
	(STRAIGHT_RUN_RAMP
	,TWO_STRAIGHT_RUN_RAMP
	,QUARTER_TURN_RAMP
	,TWO_QUARTER_TURN_RAMP
	,HALF_TURN_RAMP
	,SPIRAL_RAMP
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcReflectanceMethodEnum = ENUMERATION OF
	(BLINN
	,FLAT
	,GLASS
	,MATT
	,METAL
	,MIRROR
	,PHONG
	,PLASTIC
	,STRAUSS
	,NOTDEFINED);
END_TYPE;

TYPE IfcReinforcingBarRoleEnum = ENUMERATION OF
	(MAIN
	,SHEAR
	,LIGATURE
	,STUD
	,PUNCHING
	,EDGE
	,RING
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcReinforcingBarSurfaceEnum = ENUMERATION OF
	(PLAIN
	,TEXTURED);
END_TYPE;

TYPE IfcResourceConsumptionEnum = ENUMERATION OF
	(CONSUMED
	,PARTIALLYCONSUMED
	,NOTCONSUMED
	,OCCUPIED
	,PARTIALLYOCCUPIED
	,NOTOCCUPIED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcRibPlateDirectionEnum = ENUMERATION OF
	(DIRECTION_X
	,DIRECTION_Y);
END_TYPE;

TYPE IfcRoleEnum = ENUMERATION OF
	(SUPPLIER
	,MANUFACTURER
	,CONTRACTOR
	,SUBCONTRACTOR
	,ARCHITECT
	,STRUCTURALENGINEER
	,COSTENGINEER
	,CLIENT
	,BUILDINGOWNER
	,BUILDINGOPERATOR
	,MECHANICALENGINEER
	,ELECTRICALENGINEER
	,PROJECTMANAGER
	,FACILITIESMANAGER
	,CIVILENGINEER
	,COMISSIONINGENGINEER
	,ENGINEER
	,OWNER
	,CONSULTANT
	,CONSTRUCTIONMANAGER
	,FIELDCONSTRUCTIONMANAGER
	,RESELLER
	,USERDEFINED);
END_TYPE;

TYPE IfcRoofTypeEnum = ENUMERATION OF
	(FLAT_ROOF
	,SHED_ROOF
	,GABLE_ROOF
	,HIP_ROOF
	,HIPPED_GABLE_ROOF
	,GAMBREL_ROOF
	,MANSARD_ROOF
	,BARREL_ROOF
	,RAINBOW_ROOF
	,BUTTERFLY_ROOF
	,PAVILION_ROOF
	,DOME_ROOF
	,FREEFORM
	,NOTDEFINED);
END_TYPE;

TYPE IfcSIPrefix = ENUMERATION OF
	(EXA
	,PETA
	,TERA
	,GIGA
	,MEGA
	,KILO
	,HECTO
	,DECA
	,DECI
	,CENTI
	,MILLI
	,MICRO
	,NANO
	,PICO
	,FEMTO
	,ATTO);
END_TYPE;

TYPE IfcSIUnitName = ENUMERATION OF
	(AMPERE
	,BECQUEREL
	,CANDELA
	,COULOMB
	,CUBIC_METRE
	,DEGREE_CELSIUS
	,FARAD
	,GRAM
	,GRAY
	,HENRY
	,HERTZ
	,JOULE
	,KELVIN
	,LUMEN
	,LUX
	,METRE
	,MOLE
	,NEWTON
	,OHM
	,PASCAL
	,RADIAN
	,SECOND
	,SIEMENS
	,SIEVERT
	,SQUARE_METRE
	,STERADIAN
	,TESLA
	,VOLT
	,WATT
	,WEBER);
END_TYPE;

TYPE IfcSanitaryTerminalTypeEnum = ENUMERATION OF
	(BATH
	,BIDET
	,CISTERN
	,SHOWER
	,SINK
	,SANITARYFOUNTAIN
	,TOILETPAN
	,URINAL
	,WASHHANDBASIN
	,WCSEAT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSectionTypeEnum = ENUMERATION OF
	(UNIFORM
	,TAPERED);
END_TYPE;

TYPE IfcSensorTypeEnum = ENUMERATION OF
	(CO2SENSOR
	,FIRESENSOR
	,FLOWSENSOR
	,GASSENSOR
	,HEATSENSOR
	,HUMIDITYSENSOR
	,LIGHTSENSOR
	,MOISTURESENSOR
	,MOVEMENTSENSOR
	,PRESSURESENSOR
	,SMOKESENSOR
	,SOUNDSENSOR
	,TEMPERATURESENSOR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSequenceEnum = ENUMERATION OF
	(START_START
	,START_FINISH
	,FINISH_START
	,FINISH_FINISH
	,NOTDEFINED);
END_TYPE;

TYPE IfcServiceLifeFactorTypeEnum = ENUMERATION OF
	(A_QUALITYOFCOMPONENTS
	,B_DESIGNLEVEL
	,C_WORKEXECUTIONLEVEL
	,D_INDOORENVIRONMENT
	,E_OUTDOORENVIRONMENT
	,F_INUSECONDITIONS
	,G_MAINTENANCELEVEL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcServiceLifeTypeEnum = ENUMERATION OF
	(ACTUALSERVICELIFE
	,EXPECTEDSERVICELIFE
	,OPTIMISTICREFERENCESERVICELIFE
	,PESSIMISTICREFERENCESERVICELIFE
	,REFERENCESERVICELIFE);
END_TYPE;

TYPE IfcSlabTypeEnum = ENUMERATION OF
	(FLOOR
	,ROOF
	,LANDING
	,BASESLAB
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSoundScaleEnum = ENUMERATION OF
	(DBA
	,DBB
	,DBC
	,NC
	,NR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSpaceHeaterTypeEnum = ENUMERATION OF
	(SECTIONALRADIATOR
	,PANELRADIATOR
	,TUBULARRADIATOR
	,CONVECTOR
	,BASEBOARDHEATER
	,FINNEDTUBEUNIT
	,UNITHEATER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSpaceTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcStackTerminalTypeEnum = ENUMERATION OF
	(BIRDCAGE
	,COWL
	,RAINWATERHOPPER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcStairFlightTypeEnum = ENUMERATION OF
	(STRAIGHT
	,WINDER
	,SPIRAL
	,CURVED
	,FREEFORM
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcStairTypeEnum = ENUMERATION OF
	(STRAIGHT_RUN_STAIR
	,TWO_STRAIGHT_RUN_STAIR
	,QUARTER_WINDING_STAIR
	,QUARTER_TURN_STAIR
	,HALF_WINDING_STAIR
	,HALF_TURN_STAIR
	,TWO_QUARTER_WINDING_STAIR
	,TWO_QUARTER_TURN_STAIR
	,THREE_QUARTER_WINDING_STAIR
	,THREE_QUARTER_TURN_STAIR
	,SPIRAL_STAIR
	,DOUBLE_RETURN_STAIR
	,CURVED_RUN_STAIR
	,TWO_CURVED_RUN_STAIR
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcStateEnum = ENUMERATION OF
	(READWRITE
	,READONLY
	,LOCKED
	,READWRITELOCKED
	,READONLYLOCKED);
END_TYPE;

TYPE IfcStructuralCurveTypeEnum = ENUMERATION OF
	(RIGID_JOINED_MEMBER
	,PIN_JOINED_MEMBER
	,CABLE
	,TENSION_MEMBER
	,COMPRESSION_MEMBER
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcStructuralSurfaceTypeEnum = ENUMERATION OF
	(BENDING_ELEMENT
	,MEMBRANE_ELEMENT
	,SHELL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcSurfaceSide = ENUMERATION OF
	(POSITIVE
	,NEGATIVE
	,BOTH);
END_TYPE;

TYPE IfcSurfaceTextureEnum = ENUMERATION OF
	(BUMP
	,OPACITY
	,REFLECTION
	,SELFILLUMINATION
	,SHININESS
	,SPECULAR
	,TEXTURE
	,TRANSPARENCYMAP
	,NOTDEFINED);
END_TYPE;

TYPE IfcSwitchingDeviceTypeEnum = ENUMERATION OF
	(CONTACTOR
	,EMERGENCYSTOP
	,STARTER
	,SWITCHDISCONNECTOR
	,TOGGLESWITCH
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTankTypeEnum = ENUMERATION OF
	(PREFORMED
	,SECTIONAL
	,EXPANSION
	,PRESSUREVESSEL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTendonTypeEnum = ENUMERATION OF
	(STRAND
	,WIRE
	,BAR
	,COATED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTextPath = ENUMERATION OF
	(LEFT
	,RIGHT
	,UP
	,DOWN);
END_TYPE;

TYPE IfcThermalLoadSourceEnum = ENUMERATION OF
	(PEOPLE
	,LIGHTING
	,EQUIPMENT
	,VENTILATIONINDOORAIR
	,VENTILATIONOUTSIDEAIR
	,RECIRCULATEDAIR
	,EXHAUSTAIR
	,AIREXCHANGERATE
	,DRYBULBTEMPERATURE
	,RELATIVEHUMIDITY
	,INFILTRATION
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcThermalLoadTypeEnum = ENUMERATION OF
	(SENSIBLE
	,LATENT
	,RADIANT
	,NOTDEFINED);
END_TYPE;

TYPE IfcTimeSeriesDataTypeEnum = ENUMERATION OF
	(CONTINUOUS
	,DISCRETE
	,DISCRETEBINARY
	,PIECEWISEBINARY
	,PIECEWISECONSTANT
	,PIECEWISECONTINUOUS
	,NOTDEFINED);
END_TYPE;

TYPE IfcTimeSeriesScheduleTypeEnum = ENUMERATION OF
	(ANNUAL
	,MONTHLY
	,WEEKLY
	,DAILY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTransformerTypeEnum = ENUMERATION OF
	(CURRENT
	,FREQUENCY
	,VOLTAGE
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTransitionCode = ENUMERATION OF
	(DISCONTINUOUS
	,CONTINUOUS
	,CONTSAMEGRADIENT
	,CONTSAMEGRADIENTSAMECURVATURE);
END_TYPE;

TYPE IfcTransportElementTypeEnum = ENUMERATION OF
	(ELEVATOR
	,ESCALATOR
	,MOVINGWALKWAY
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcTrimmingPreference = ENUMERATION OF
	(CARTESIAN
	,PARAMETER
	,UNSPECIFIED);
END_TYPE;

TYPE IfcTubeBundleTypeEnum = ENUMERATION OF
	(FINNED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcUnitEnum = ENUMERATION OF
	(ABSORBEDDOSEUNIT
	,AMOUNTOFSUBSTANCEUNIT
	,AREAUNIT
	,DOSEEQUIVALENTUNIT
	,ELECTRICCAPACITANCEUNIT
	,ELECTRICCHARGEUNIT
	,ELECTRICCONDUCTANCEUNIT
	,ELECTRICCURRENTUNIT
	,ELECTRICRESISTANCEUNIT
	,ELECTRICVOLTAGEUNIT
	,ENERGYUNIT
	,FORCEUNIT
	,FREQUENCYUNIT
	,ILLUMINANCEUNIT
	,INDUCTANCEUNIT
	,LENGTHUNIT
	,LUMINOUSFLUXUNIT
	,LUMINOUSINTENSITYUNIT
	,MAGNETICFLUXDENSITYUNIT
	,MAGNETICFLUXUNIT
	,MASSUNIT
	,PLANEANGLEUNIT
	,POWERUNIT
	,PRESSUREUNIT
	,RADIOACTIVITYUNIT
	,SOLIDANGLEUNIT
	,THERMODYNAMICTEMPERATUREUNIT
	,TIMEUNIT
	,VOLUMEUNIT
	,USERDEFINED);
END_TYPE;

TYPE IfcUnitaryEquipmentTypeEnum = ENUMERATION OF
	(AIRHANDLER
	,AIRCONDITIONINGUNIT
	,SPLITSYSTEM
	,ROOFTOPUNIT
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcValveTypeEnum = ENUMERATION OF
	(AIRRELEASE
	,ANTIVACUUM
	,CHANGEOVER
	,CHECK
	,COMMISSIONING
	,DIVERTING
	,DRAWOFFCOCK
	,DOUBLECHECK
	,DOUBLEREGULATING
	,FAUCET
	,FLUSHING
	,GASCOCK
	,GASTAP
	,ISOLATING
	,MIXING
	,PRESSUREREDUCING
	,PRESSURERELIEF
	,REGULATING
	,SAFETYCUTOFF
	,STEAMTRAP
	,STOPCOCK
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcVibrationIsolatorTypeEnum = ENUMERATION OF
	(COMPRESSION
	,SPRING
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcWallTypeEnum = ENUMERATION OF
	(STANDARD
	,POLYGONAL
	,SHEAR
	,ELEMENTEDWALL
	,PLUMBINGWALL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcWasteTerminalTypeEnum = ENUMERATION OF
	(FLOORTRAP
	,FLOORWASTE
	,GULLYSUMP
	,GULLYTRAP
	,GREASEINTERCEPTOR
	,OILINTERCEPTOR
	,PETROLINTERCEPTOR
	,ROOFDRAIN
	,WASTEDISPOSALUNIT
	,WASTETRAP
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcWindowPanelOperationEnum = ENUMERATION OF
	(SIDEHUNGRIGHTHAND
	,SIDEHUNGLEFTHAND
	,TILTANDTURNRIGHTHAND
	,TILTANDTURNLEFTHAND
	,TOPHUNG
	,BOTTOMHUNG
	,PIVOTHORIZONTAL
	,PIVOTVERTICAL
	,SLIDINGHORIZONTAL
	,SLIDINGVERTICAL
	,REMOVABLECASEMENT
	,FIXEDCASEMENT
	,OTHEROPERATION
	,NOTDEFINED);
END_TYPE;

TYPE IfcWindowPanelPositionEnum = ENUMERATION OF
	(LEFT
	,MIDDLE
	,RIGHT
	,BOTTOM
	,TOP
	,NOTDEFINED);
END_TYPE;

TYPE IfcWindowStyleConstructionEnum = ENUMERATION OF
	(ALUMINIUM
	,HIGH_GRADE_STEEL
	,STEEL
	,WOOD
	,ALUMINIUM_WOOD
	,PLASTIC
	,OTHER_CONSTRUCTION
	,NOTDEFINED);
END_TYPE;

TYPE IfcWindowStyleOperationEnum = ENUMERATION OF
	(SINGLE_PANEL
	,DOUBLE_PANEL_VERTICAL
	,DOUBLE_PANEL_HORIZONTAL
	,TRIPLE_PANEL_VERTICAL
	,TRIPLE_PANEL_BOTTOM
	,TRIPLE_PANEL_TOP
	,TRIPLE_PANEL_LEFT
	,TRIPLE_PANEL_RIGHT
	,TRIPLE_PANEL_HORIZONTAL
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcWorkControlTypeEnum = ENUMERATION OF
	(ACTUAL
	,BASELINE
	,PLANNED
	,USERDEFINED
	,NOTDEFINED);
END_TYPE;

TYPE IfcActorSelect = SELECT
	(IfcOrganization
	,IfcPerson
	,IfcPersonAndOrganization);
END_TYPE;

TYPE IfcAppliedValueSelect = SELECT
	(IfcRatioMeasure
	,IfcMeasureWithUnit
	,IfcMonetaryMeasure);
END_TYPE;

TYPE IfcAxis2Placement = SELECT
	(IfcAxis2Placement2D
	,IfcAxis2Placement3D);
END_TYPE;

TYPE IfcBooleanOperand = SELECT
	(IfcSolidModel
	,IfcHalfSpaceSolid
	,IfcBooleanResult
	,IfcCsgPrimitive3D);
END_TYPE;

TYPE IfcCharacterStyleSelect = SELECT
	(IfcTextStyleForDefinedFont);
END_TYPE;

TYPE IfcClassificationNotationSelect = SELECT
	(IfcClassificationNotation
	,IfcClassificationReference);
END_TYPE;

TYPE IfcColour = SELECT
	(IfcColourSpecification
	,IfcPreDefinedColour);
END_TYPE;

TYPE IfcColourOrFactor = SELECT
	(IfcColourRgb
	,IfcNormalisedRatioMeasure);
END_TYPE;

TYPE IfcConditionCriterionSelect = SELECT
	(IfcLabel
	,IfcMeasureWithUnit);
END_TYPE;

TYPE IfcCsgSelect = SELECT
	(IfcBooleanResult
	,IfcCsgPrimitive3D);
END_TYPE;

TYPE IfcCurveFontOrScaledCurveFontSelect = SELECT
	(IfcCurveStyleFontSelect
	,IfcCurveStyleFontAndScaling);
END_TYPE;

TYPE IfcCurveOrEdgeCurve = SELECT
	(IfcBoundedCurve
	,IfcEdgeCurve);
END_TYPE;

TYPE IfcCurveStyleFontSelect = SELECT
	(IfcPreDefinedCurveFont
	,IfcCurveStyleFont);
END_TYPE;

TYPE IfcDateTimeSelect = SELECT
	(IfcCalendarDate
	,IfcLocalTime
	,IfcDateAndTime);
END_TYPE;

TYPE IfcDefinedSymbolSelect = SELECT
	(IfcPreDefinedSymbol
	,IfcExternallyDefinedSymbol);
END_TYPE;

TYPE IfcDerivedMeasureValue = SELECT
	(IfcVolumetricFlowRateMeasure
	,IfcTimeStamp
	,IfcThermalTransmittanceMeasure
	,IfcThermalResistanceMeasure
	,IfcThermalAdmittanceMeasure
	,IfcPressureMeasure
	,IfcPowerMeasure
	,IfcMassFlowRateMeasure
	,IfcMassDensityMeasure
	,IfcLinearVelocityMeasure
	,IfcKinematicViscosityMeasure
	,IfcIntegerCountRateMeasure
	,IfcHeatFluxDensityMeasure
	,IfcFrequencyMeasure
	,IfcEnergyMeasure
	,IfcElectricVoltageMeasure
	,IfcDynamicViscosityMeasure
	,IfcCompoundPlaneAngleMeasure
	,IfcAngularVelocityMeasure
	,IfcThermalConductivityMeasure
	,IfcMolecularWeightMeasure
	,IfcVaporPermeabilityMeasure
	,IfcMoistureDiffusivityMeasure
	,IfcIsothermalMoistureCapacityMeasure
	,IfcSpecificHeatCapacityMeasure
	,IfcMonetaryMeasure
	,IfcMagneticFluxDensityMeasure
	,IfcMagneticFluxMeasure
	,IfcLuminousFluxMeasure
	,IfcForceMeasure
	,IfcInductanceMeasure
	,IfcIlluminanceMeasure
	,IfcElectricResistanceMeasure
	,IfcElectricConductanceMeasure
	,IfcElectricChargeMeasure
	,IfcDoseEquivalentMeasure
	,IfcElectricCapacitanceMeasure
	,IfcAbsorbedDoseMeasure
	,IfcRadioActivityMeasure
	,IfcRotationalFrequencyMeasure
	,IfcTorqueMeasure
	,IfcAccelerationMeasure
	,IfcLinearForceMeasure
	,IfcLinearStiffnessMeasure
	,IfcModulusOfSubgradeReactionMeasure
	,IfcModulusOfElasticityMeasure
	,IfcMomentOfInertiaMeasure
	,IfcPlanarForceMeasure
	,IfcRotationalStiffnessMeasure
	,IfcShearModulusMeasure
	,IfcLinearMomentMeasure
	,IfcLuminousIntensityDistributionMeasure
	,IfcCurvatureMeasure
	,IfcMassPerLengthMeasure
	,IfcModulusOfLinearSubgradeReactionMeasure
	,IfcModulusOfRotationalSubgradeReactionMeasure
	,IfcRotationalMassMeasure
	,IfcSectionalAreaIntegralMeasure
	,IfcSectionModulusMeasure
	,IfcTemperatureGradientMeasure
	,IfcThermalExpansionCoefficientMeasure
	,IfcWarpingConstantMeasure
	,IfcWarpingMomentMeasure
	,IfcSoundPowerMeasure
	,IfcSoundPressureMeasure
	,IfcHeatingValueMeasure
	,IfcPHMeasure
	,IfcIonConcentrationMeasure);
END_TYPE;

TYPE IfcDocumentSelect = SELECT
	(IfcDocumentReference
	,IfcDocumentInformation);
END_TYPE;

TYPE IfcDraughtingCalloutElement = SELECT
	(IfcAnnotationCurveOccurrence
	,IfcAnnotationTextOccurrence
	,IfcAnnotationSymbolOccurrence);
END_TYPE;

TYPE IfcFillAreaStyleTileShapeSelect = SELECT
	(IfcFillAreaStyleTileSymbolWithStyle);
END_TYPE;

TYPE IfcFillStyleSelect = SELECT
	(IfcFillAreaStyleHatching
	,IfcFillAreaStyleTiles
	,IfcColour
	,IfcExternallyDefinedHatchStyle);
END_TYPE;

TYPE IfcGeometricSetSelect = SELECT
	(IfcPoint
	,IfcCurve
	,IfcSurface);
END_TYPE;

TYPE IfcHatchLineDistanceSelect = SELECT
	(IfcOneDirectionRepeatFactor
	,IfcPositiveLengthMeasure);
END_TYPE;

TYPE IfcLayeredItem = SELECT
	(IfcRepresentationItem
	,IfcRepresentation);
END_TYPE;

TYPE IfcLibrarySelect = SELECT
	(IfcLibraryReference
	,IfcLibraryInformation);
END_TYPE;

TYPE IfcLightDistributionDataSourceSelect = SELECT
	(IfcExternalReference
	,IfcLightIntensityDistribution);
END_TYPE;

TYPE IfcMaterialSelect = SELECT
	(IfcMaterial
	,IfcMaterialList
	,IfcMaterialLayerSetUsage
	,IfcMaterialLayerSet
	,IfcMaterialLayer);
END_TYPE;

TYPE IfcMeasureValue = SELECT
	(IfcVolumeMeasure
	,IfcTimeMeasure
	,IfcThermodynamicTemperatureMeasure
	,IfcSolidAngleMeasure
	,IfcPositiveRatioMeasure
	,IfcRatioMeasure
	,IfcPositivePlaneAngleMeasure
	,IfcPlaneAngleMeasure
	,IfcParameterValue
	,IfcNumericMeasure
	,IfcMassMeasure
	,IfcPositiveLengthMeasure
	,IfcLengthMeasure
	,IfcElectricCurrentMeasure
	,IfcDescriptiveMeasure
	,IfcCountMeasure
	,IfcContextDependentMeasure
	,IfcAreaMeasure
	,IfcAmountOfSubstanceMeasure
	,IfcLuminousIntensityMeasure
	,IfcNormalisedRatioMeasure
	,IfcComplexNumber);
END_TYPE;

TYPE IfcMetricValueSelect = SELECT
	(IfcDateTimeSelect
	,IfcMeasureWithUnit
	,IfcTable
	,IfcText
	,IfcTimeSeries
	,IfcCostValue);
END_TYPE;

TYPE IfcObjectReferenceSelect = SELECT
	(IfcMaterial
	,IfcPerson
	,IfcDateAndTime
	,IfcMaterialList
	,IfcOrganization
	,IfcCalendarDate
	,IfcLocalTime
	,IfcPersonAndOrganization
	,IfcMaterialLayer
	,IfcExternalReference
	,IfcTimeSeries
	,IfcAddress
	,IfcAppliedValue);
END_TYPE;

TYPE IfcOrientationSelect = SELECT
	(IfcPlaneAngleMeasure
	,IfcDirection);
END_TYPE;

TYPE IfcPointOrVertexPoint = SELECT
	(IfcPoint
	,IfcVertexPoint);
END_TYPE;

TYPE IfcPresentationStyleSelect = SELECT
	(IfcNullStyle
	,IfcCurveStyle
	,IfcSymbolStyle
	,IfcFillAreaStyle
	,IfcTextStyle
	,IfcSurfaceStyle);
END_TYPE;

TYPE IfcShell = SELECT
	(IfcClosedShell
	,IfcOpenShell);
END_TYPE;

TYPE IfcSimpleValue = SELECT
	(IfcInteger
	,IfcReal
	,IfcBoolean
	,IfcIdentifier
	,IfcText
	,IfcLabel
	,IfcLogical);
END_TYPE;

TYPE IfcSizeSelect = SELECT
	(IfcRatioMeasure
	,IfcLengthMeasure
	,IfcDescriptiveMeasure
	,IfcPositiveLengthMeasure
	,IfcNormalisedRatioMeasure
	,IfcPositiveRatioMeasure);
END_TYPE;

TYPE IfcSpecularHighlightSelect = SELECT
	(IfcSpecularExponent
	,IfcSpecularRoughness);
END_TYPE;

TYPE IfcStructuralActivityAssignmentSelect = SELECT
	(IfcStructuralItem
	,IfcElement);
END_TYPE;

TYPE IfcSurfaceOrFaceSurface = SELECT
	(IfcSurface
	,IfcFaceSurface
	,IfcFaceBasedSurfaceModel);
END_TYPE;

TYPE IfcSurfaceStyleElementSelect = SELECT
	(IfcSurfaceStyleShading
	,IfcSurfaceStyleLighting
	,IfcSurfaceStyleWithTextures
	,IfcExternallyDefinedSurfaceStyle
	,IfcSurfaceStyleRefraction);
END_TYPE;

TYPE IfcSymbolStyleSelect = SELECT
	(IfcColour);
END_TYPE;

TYPE IfcTextFontSelect = SELECT
	(IfcPreDefinedTextFont
	,IfcExternallyDefinedTextFont);
END_TYPE;

TYPE IfcTextStyleSelect = SELECT
	(IfcTextStyleWithBoxCharacteristics
	,IfcTextStyleTextModel);
END_TYPE;

TYPE IfcTrimmingSelect = SELECT
	(IfcCartesianPoint
	,IfcParameterValue);
END_TYPE;

TYPE IfcUnit = SELECT
	(IfcDerivedUnit
	,IfcNamedUnit
	,IfcMonetaryUnit);
END_TYPE;

TYPE IfcValue = SELECT
	(IfcMeasureValue
	,IfcSimpleValue
	,IfcDerivedMeasureValue);
END_TYPE;

TYPE IfcVectorOrDirection = SELECT
	(IfcDirection
	,IfcVector);
END_TYPE;

ENTITY Ifc2DCompositeCurve
 SUBTYPE OF (IfcCompositeCurve);
 WHERE
	WR1 : SELF\IfcCompositeCurve.ClosedCurve;
	WR2 : SELF\IfcCurve.Dim = 2;
END_ENTITY;

ENTITY IfcActionRequest
 SUBTYPE OF (IfcControl);
	RequestID : IfcIdentifier;
 UNIQUE
	UR2 : RequestID;
END_ENTITY;

ENTITY IfcActor
 SUPERTYPE OF (ONEOF
	(IfcOccupant))
 SUBTYPE OF (IfcObject);
	TheActor : IfcActorSelect;
 INVERSE
	IsActingUpon : SET [0:?] OF IfcRelAssignsToActor FOR RelatingActor;
END_ENTITY;

ENTITY IfcActorRole;
	Role : IfcRoleEnum;
	UserDefinedRole : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
 WHERE
	WR1 : (Role <> IfcRoleEnum.USERDEFINED) OR
            ((Role = IfcRoleEnum.USERDEFINED) AND
              EXISTS(SELF.UserDefinedRole));
END_ENTITY;

ENTITY IfcActuatorType
 SUBTYPE OF (IfcDistributionControlElementType);
	PredefinedType : IfcActuatorTypeEnum;
END_ENTITY;

ENTITY IfcAddress
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPostalAddress
	,IfcTelecomAddress));
	Purpose : OPTIONAL IfcAddressTypeEnum;
	Description : OPTIONAL IfcText;
	UserDefinedPurpose : OPTIONAL IfcLabel;
 INVERSE
	OfPerson : SET [0:?] OF IfcPerson FOR Addresses;
	OfOrganization : SET [0:?] OF IfcOrganization FOR Addresses;
 WHERE
	WR1 : (NOT(EXISTS(Purpose))) OR
            ((Purpose <> IfcAddressTypeEnum.USERDEFINED) OR
            ((Purpose = IfcAddressTypeEnum.USERDEFINED) AND
              EXISTS(SELF.UserDefinedPurpose)));
END_ENTITY;

ENTITY IfcAirTerminalBoxType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcAirTerminalBoxTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcAirTerminalBoxTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcAirTerminalBoxTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcAirTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcAirTerminalTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcAirTerminalTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcAirTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcAirToAirHeatRecoveryType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcAirToAirHeatRecoveryTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcAlarmType
 SUBTYPE OF (IfcDistributionControlElementType);
	PredefinedType : IfcAlarmTypeEnum;
END_ENTITY;

ENTITY IfcAngularDimension
 SUBTYPE OF (IfcDimensionCurveDirectedCallout);
END_ENTITY;

ENTITY IfcAnnotation
 SUBTYPE OF (IfcProduct);
 INVERSE
	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
END_ENTITY;

ENTITY IfcAnnotationCurveOccurrence
 SUPERTYPE OF (ONEOF
	(IfcDimensionCurve
	,IfcProjectionCurve))
 SUBTYPE OF (IfcAnnotationOccurrence);
 WHERE
	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
             ('IFC2X3.IFCCURVE' IN TYPEOF (SELF\IfcStyledItem.Item));
END_ENTITY;

ENTITY IfcAnnotationFillArea
 SUBTYPE OF (IfcGeometricRepresentationItem);
	OuterBoundary : IfcCurve;
	InnerBoundaries : OPTIONAL SET [1:?] OF IfcCurve;
END_ENTITY;

ENTITY IfcAnnotationFillAreaOccurrence
 SUBTYPE OF (IfcAnnotationOccurrence);
	FillStyleTarget : OPTIONAL IfcPoint;
	GlobalOrLocal : OPTIONAL IfcGlobalOrLocalEnum;
 WHERE
	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
             ('IFC2X3.IFCANNOTATIONFILLAREA' IN TYPEOF (SELF\IfcStyledItem.Item));
END_ENTITY;

ENTITY IfcAnnotationOccurrence
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAnnotationCurveOccurrence
	,IfcAnnotationFillAreaOccurrence
	,IfcAnnotationSurfaceOccurrence
	,IfcAnnotationSymbolOccurrence
	,IfcAnnotationTextOccurrence))
 SUBTYPE OF (IfcStyledItem);
END_ENTITY;

ENTITY IfcAnnotationSurface
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Item : IfcGeometricRepresentationItem;
	TextureCoordinates : OPTIONAL IfcTextureCoordinate;
 WHERE
	WR01 : SIZEOF([
               'IFC2X3.IFCSURFACE',
               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
               'IFC2X3.IFCSOLIDMODEL',
               'IFC2X3.IFCBOOLEANRESULT',
               'IFC2X3.IFCCSGPRIMITIVE3D'] 
              * TYPEOF(Item)
               ) >= 1;
END_ENTITY;

ENTITY IfcAnnotationSurfaceOccurrence
 SUBTYPE OF (IfcAnnotationOccurrence);
 WHERE
	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR 
             (SIZEOF(
              ['IFC2X3.IFCSURFACE',
               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
               'IFC2X3.IFCSOLIDMODEL'] *
              TYPEOF(SELF\IfcStyledItem.Item)) > 0);
END_ENTITY;

ENTITY IfcAnnotationSymbolOccurrence
 SUPERTYPE OF (ONEOF
	(IfcTerminatorSymbol))
 SUBTYPE OF (IfcAnnotationOccurrence);
 WHERE
	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
             ('IFC2X3.IFCDEFINEDSYMBOL' IN TYPEOF (SELF\IfcStyledItem.Item));
END_ENTITY;

ENTITY IfcAnnotationTextOccurrence
 SUBTYPE OF (IfcAnnotationOccurrence);
 WHERE
	WR31 : NOT(EXISTS(SELF\IfcStyledItem.Item)) OR
             ('IFC2X3.IFCTEXTLITERAL' IN TYPEOF (SELF\IfcStyledItem.Item));
END_ENTITY;

ENTITY IfcApplication;
	ApplicationDeveloper : IfcOrganization;
	Version : IfcLabel;
	ApplicationFullName : IfcLabel;
	ApplicationIdentifier : IfcIdentifier;
 UNIQUE
	UR1 : ApplicationIdentifier;
	UR2 : ApplicationFullName, Version;
END_ENTITY;

ENTITY IfcAppliedValue
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCostValue
	,IfcEnvironmentalImpactValue));
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	AppliedValue : OPTIONAL IfcAppliedValueSelect;
	UnitBasis : OPTIONAL IfcMeasureWithUnit;
	ApplicableDate : OPTIONAL IfcDateTimeSelect;
	FixedUntilDate : OPTIONAL IfcDateTimeSelect;
 INVERSE
	ValuesReferenced : SET [0:?] OF IfcReferencesValueDocument FOR ReferencingValues;
	ValueOfComponents : SET [0:?] OF IfcAppliedValueRelationship FOR ComponentOfTotal;
	IsComponentIn : SET [0:?] OF IfcAppliedValueRelationship FOR Components;
 WHERE
	WR1 : EXISTS (AppliedValue) OR 
            EXISTS (ValueOfComponents);
END_ENTITY;

ENTITY IfcAppliedValueRelationship;
	ComponentOfTotal : IfcAppliedValue;
	Components : SET [1:?] OF IfcAppliedValue;
	ArithmeticOperator : IfcArithmeticOperatorEnum;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcApproval;
	Description : OPTIONAL IfcText;
	ApprovalDateTime : IfcDateTimeSelect;
	ApprovalStatus : OPTIONAL IfcLabel;
	ApprovalLevel : OPTIONAL IfcLabel;
	ApprovalQualifier : OPTIONAL IfcText;
	Name : IfcLabel;
	Identifier : IfcIdentifier;
 INVERSE
	Actors : SET [0:?] OF IfcApprovalActorRelationship FOR Approval;
	IsRelatedWith : SET [0:?] OF IfcApprovalRelationship FOR RelatedApproval;
	Relates : SET [0:?] OF IfcApprovalRelationship FOR RelatingApproval;
END_ENTITY;

ENTITY IfcApprovalActorRelationship;
	Actor : IfcActorSelect;
	Approval : IfcApproval;
	Role : IfcActorRole;
END_ENTITY;

ENTITY IfcApprovalPropertyRelationship;
	ApprovedProperties : SET [1:?] OF IfcProperty;
	Approval : IfcApproval;
END_ENTITY;

ENTITY IfcApprovalRelationship;
	RelatedApproval : IfcApproval;
	RelatingApproval : IfcApproval;
	Description : OPTIONAL IfcText;
	Name : IfcLabel;
END_ENTITY;

ENTITY IfcArbitraryClosedProfileDef
 SUPERTYPE OF (ONEOF
	(IfcArbitraryProfileDefWithVoids))
 SUBTYPE OF (IfcProfileDef);
	OuterCurve : IfcCurve;
 WHERE
	WR1 : OuterCurve.Dim = 2;
	WR2 : NOT('IFC2X3.IFCLINE' IN TYPEOF(OuterCurve));
	WR3 : NOT('IFC2X3.IFCOFFSETCURVE2D' IN TYPEOF(OuterCurve));
END_ENTITY;

ENTITY IfcArbitraryOpenProfileDef
 SUPERTYPE OF (ONEOF
	(IfcCenterLineProfileDef))
 SUBTYPE OF (IfcProfileDef);
	Curve : IfcBoundedCurve;
 WHERE
	WR11 : ('IFC2X3.IFCCENTERLINEPROFILEDEF' IN TYPEOF(SELF)) OR 
              (SELF\IfcProfileDef.ProfileType = IfcProfileTypeEnum.CURVE);
	WR12 : Curve.Dim = 2;
END_ENTITY;

ENTITY IfcArbitraryProfileDefWithVoids
 SUBTYPE OF (IfcArbitraryClosedProfileDef);
	InnerCurves : SET [1:?] OF IfcCurve;
 WHERE
	WR1 : SELF\IfcProfileDef.ProfileType = AREA;
	WR2 : SIZEOF(QUERY(temp <* InnerCurves | temp.Dim <> 2)) = 0;
	WR3 : SIZEOF(QUERY(temp <* InnerCurves | 'IFC2X3.IFCLINE' IN TYPEOF(temp))) = 0;
END_ENTITY;

ENTITY IfcAsset
 SUBTYPE OF (IfcGroup);
	AssetID : IfcIdentifier;
	OriginalValue : IfcCostValue;
	CurrentValue : IfcCostValue;
	TotalReplacementCost : IfcCostValue;
	Owner : IfcActorSelect;
	User : IfcActorSelect;
	ResponsiblePerson : IfcPerson;
	IncorporationDate : IfcCalendarDate;
	DepreciatedValue : IfcCostValue;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects | NOT('IFC2X3.IFCELEMENT' IN TYPEOF(Temp)))) = 0;
END_ENTITY;

ENTITY IfcAsymmetricIShapeProfileDef
 SUBTYPE OF (IfcIShapeProfileDef);
	TopFlangeWidth : IfcPositiveLengthMeasure;
	TopFlangeThickness : OPTIONAL IfcPositiveLengthMeasure;
	TopFlangeFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcAxis1Placement
 SUBTYPE OF (IfcPlacement);
	Axis : OPTIONAL IfcDirection;
 DERIVE
	Z : IfcDirection := NVL (IfcNormalise(Axis), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
 WHERE
	WR1 : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
	WR2 : SELF\IfcPlacement.Location.Dim = 3;
END_ENTITY;

ENTITY IfcAxis2Placement2D
 SUBTYPE OF (IfcPlacement);
	RefDirection : OPTIONAL IfcDirection;
 DERIVE
	P : LIST [2:2] OF IfcDirection := IfcBuild2Axes(RefDirection);
 WHERE
	WR1 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 2);
	WR2 : SELF\IfcPlacement.Location.Dim = 2;
END_ENTITY;

ENTITY IfcAxis2Placement3D
 SUBTYPE OF (IfcPlacement);
	Axis : OPTIONAL IfcDirection;
	RefDirection : OPTIONAL IfcDirection;
 DERIVE
	P : LIST [3:3] OF IfcDirection := IfcBuildAxes(Axis, RefDirection);
 WHERE
	WR1 : SELF\IfcPlacement.Location.Dim = 3;
	WR2 : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
	WR3 : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 3);
	WR4 : (NOT (EXISTS (Axis))) OR (NOT (EXISTS (RefDirection))) OR (IfcCrossProduct(Axis,RefDirection).Magnitude > 0.0);
	WR5 : NOT ((EXISTS (Axis)) XOR (EXISTS (RefDirection)));
END_ENTITY;

ENTITY IfcBSplineCurve
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBezierCurve))
 SUBTYPE OF (IfcBoundedCurve);
	Degree : INTEGER;
	ControlPointsList : LIST [2:?] OF IfcCartesianPoint;
	CurveForm : IfcBSplineCurveForm;
	ClosedCurve : LOGICAL;
	SelfIntersect : LOGICAL;
 DERIVE
	ControlPoints : ARRAY [0:255] OF IfcCartesianPoint := IfcListToArray(ControlPointsList,0,UpperIndexOnControlPoints);
	UpperIndexOnControlPoints : INTEGER := (SIZEOF(ControlPointsList) - 1);
 WHERE
	WR41 : SIZEOF(QUERY(Temp <* ControlPointsList |
               Temp.Dim <> ControlPointsList[1].Dim))
             = 0;
END_ENTITY;

ENTITY IfcBeam
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcBeamType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcBeamTypeEnum;
END_ENTITY;

ENTITY IfcBezierCurve
 SUPERTYPE OF (ONEOF
	(IfcRationalBezierCurve))
 SUBTYPE OF (IfcBSplineCurve);
END_ENTITY;

ENTITY IfcBlobTexture
 SUBTYPE OF (IfcSurfaceTexture);
	RasterFormat : IfcIdentifier;
	RasterCode : BOOLEAN;
 WHERE
	WR11 : SELF.RasterFormat IN ['BMP', 'JPG', 'GIF', 'PNG'];
END_ENTITY;

ENTITY IfcBlock
 SUBTYPE OF (IfcCsgPrimitive3D);
	XLength : IfcPositiveLengthMeasure;
	YLength : IfcPositiveLengthMeasure;
	ZLength : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcBoilerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcBoilerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcBoilerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcBoilerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcBooleanClippingResult
 SUBTYPE OF (IfcBooleanResult);
 WHERE
	WR1 : ('IFC2X3.IFCSWEPTAREASOLID' IN TYPEOF(FirstOperand)) OR ('IFC2X3.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(FirstOperand));
	WR2 : ('IFC2X3.IFCHALFSPACESOLID' IN TYPEOF(SecondOperand));
	WR3 : Operator = DIFFERENCE;
END_ENTITY;

ENTITY IfcBooleanResult
 SUPERTYPE OF (ONEOF
	(IfcBooleanClippingResult))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Operator : IfcBooleanOperator;
	FirstOperand : IfcBooleanOperand;
	SecondOperand : IfcBooleanOperand;
 DERIVE
	Dim : IfcDimensionCount := FirstOperand.Dim;
 WHERE
	WR1 : FirstOperand.Dim = SecondOperand.Dim;
END_ENTITY;

ENTITY IfcBoundaryCondition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBoundaryEdgeCondition
	,IfcBoundaryFaceCondition
	,IfcBoundaryNodeCondition));
	Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcBoundaryEdgeCondition
 SUBTYPE OF (IfcBoundaryCondition);
	LinearStiffnessByLengthX : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
	LinearStiffnessByLengthY : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
	LinearStiffnessByLengthZ : OPTIONAL IfcModulusOfLinearSubgradeReactionMeasure;
	RotationalStiffnessByLengthX : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
	RotationalStiffnessByLengthY : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
	RotationalStiffnessByLengthZ : OPTIONAL IfcModulusOfRotationalSubgradeReactionMeasure;
END_ENTITY;

ENTITY IfcBoundaryFaceCondition
 SUBTYPE OF (IfcBoundaryCondition);
	LinearStiffnessByAreaX : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
	LinearStiffnessByAreaY : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
	LinearStiffnessByAreaZ : OPTIONAL IfcModulusOfSubgradeReactionMeasure;
END_ENTITY;

ENTITY IfcBoundaryNodeCondition
 SUPERTYPE OF (ONEOF
	(IfcBoundaryNodeConditionWarping))
 SUBTYPE OF (IfcBoundaryCondition);
	LinearStiffnessX : OPTIONAL IfcLinearStiffnessMeasure;
	LinearStiffnessY : OPTIONAL IfcLinearStiffnessMeasure;
	LinearStiffnessZ : OPTIONAL IfcLinearStiffnessMeasure;
	RotationalStiffnessX : OPTIONAL IfcRotationalStiffnessMeasure;
	RotationalStiffnessY : OPTIONAL IfcRotationalStiffnessMeasure;
	RotationalStiffnessZ : OPTIONAL IfcRotationalStiffnessMeasure;
END_ENTITY;

ENTITY IfcBoundaryNodeConditionWarping
 SUBTYPE OF (IfcBoundaryNodeCondition);
	WarpingStiffness : OPTIONAL IfcWarpingMomentMeasure;
END_ENTITY;

ENTITY IfcBoundedCurve
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBSplineCurve
	,IfcCompositeCurve
	,IfcPolyline
	,IfcTrimmedCurve))
 SUBTYPE OF (IfcCurve);
END_ENTITY;

ENTITY IfcBoundedSurface
 SUPERTYPE OF (ONEOF
	(IfcCurveBoundedPlane
	,IfcRectangularTrimmedSurface))
 SUBTYPE OF (IfcSurface);
END_ENTITY;

ENTITY IfcBoundingBox
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Corner : IfcCartesianPoint;
	XDim : IfcPositiveLengthMeasure;
	YDim : IfcPositiveLengthMeasure;
	ZDim : IfcPositiveLengthMeasure;
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcBoxedHalfSpace
 SUBTYPE OF (IfcHalfSpaceSolid);
	Enclosure : IfcBoundingBox;
 WHERE
	WR1 : NOT ('IFC2X3.IFCCURVEBOUNDEDPLANE' IN TYPEOF(SELF\IfcHalfSpaceSolid.BaseSurface));
END_ENTITY;

ENTITY IfcBuilding
 SUBTYPE OF (IfcSpatialStructureElement);
	ElevationOfRefHeight : OPTIONAL IfcLengthMeasure;
	ElevationOfTerrain : OPTIONAL IfcLengthMeasure;
	BuildingAddress : OPTIONAL IfcPostalAddress;
END_ENTITY;

ENTITY IfcBuildingElement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBeam
	,IfcBuildingElementComponent
	,IfcBuildingElementProxy
	,IfcColumn
	,IfcCovering
	,IfcCurtainWall
	,IfcDoor
	,IfcFooting
	,IfcMember
	,IfcPile
	,IfcPlate
	,IfcRailing
	,IfcRamp
	,IfcRampFlight
	,IfcRoof
	,IfcSlab
	,IfcStair
	,IfcStairFlight
	,IfcWall
	,IfcWindow))
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcBuildingElementComponent
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBuildingElementPart
	,IfcReinforcingElement))
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcBuildingElementPart
 SUBTYPE OF (IfcBuildingElementComponent);
END_ENTITY;

ENTITY IfcBuildingElementProxy
 SUBTYPE OF (IfcBuildingElement);
	CompositionType : OPTIONAL IfcElementCompositionEnum;
 WHERE
	WR1 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcBuildingElementProxyType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcBuildingElementProxyTypeEnum;
END_ENTITY;

ENTITY IfcBuildingElementType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBeamType
	,IfcBuildingElementProxyType
	,IfcColumnType
	,IfcCoveringType
	,IfcCurtainWallType
	,IfcMemberType
	,IfcPlateType
	,IfcRailingType
	,IfcRampFlightType
	,IfcSlabType
	,IfcStairFlightType
	,IfcWallType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcBuildingStorey
 SUBTYPE OF (IfcSpatialStructureElement);
	Elevation : OPTIONAL IfcLengthMeasure;
END_ENTITY;

ENTITY IfcCShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	Depth : IfcPositiveLengthMeasure;
	Width : IfcPositiveLengthMeasure;
	WallThickness : IfcPositiveLengthMeasure;
	Girth : IfcPositiveLengthMeasure;
	InternalFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR1 : Girth < (Depth / 2.);
	WR2 : NOT(EXISTS(InternalFilletRadius)) OR
            ((InternalFilletRadius <= Width/2.) AND (InternalFilletRadius <= Depth/2.));
	WR3 : (WallThickness < Width/2.) AND (WallThickness < Depth/2.);
END_ENTITY;

ENTITY IfcCableCarrierFittingType
 SUBTYPE OF (IfcFlowFittingType);
	PredefinedType : IfcCableCarrierFittingTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCableCarrierFittingTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCableCarrierFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCableCarrierSegmentType
 SUBTYPE OF (IfcFlowSegmentType);
	PredefinedType : IfcCableCarrierSegmentTypeEnum;
END_ENTITY;

ENTITY IfcCableSegmentType
 SUBTYPE OF (IfcFlowSegmentType);
	PredefinedType : IfcCableSegmentTypeEnum;
END_ENTITY;

ENTITY IfcCalendarDate;
	DayComponent : IfcDayInMonthNumber;
	MonthComponent : IfcMonthInYearNumber;
	YearComponent : IfcYearNumber;
 WHERE
	WR21 : IfcValidCalendarDate (SELF);
END_ENTITY;

ENTITY IfcCartesianPoint
 SUBTYPE OF (IfcPoint);
	Coordinates : LIST [1:3] OF IfcLengthMeasure;
 DERIVE
	Dim : IfcDimensionCount := HIINDEX(Coordinates);
 WHERE
	WR1 : HIINDEX(Coordinates) >= 2;
END_ENTITY;

ENTITY IfcCartesianTransformationOperator
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCartesianTransformationOperator2D
	,IfcCartesianTransformationOperator3D))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Axis1 : OPTIONAL IfcDirection;
	Axis2 : OPTIONAL IfcDirection;
	LocalOrigin : IfcCartesianPoint;
	Scale : OPTIONAL REAL;
 DERIVE
	Scl : REAL := NVL(Scale, 1.0);
	Dim : IfcDimensionCount := LocalOrigin.Dim;
 WHERE
	WR1 : Scl > 0.0;
END_ENTITY;

ENTITY IfcCartesianTransformationOperator2D
 SUPERTYPE OF (ONEOF
	(IfcCartesianTransformationOperator2DnonUniform))
 SUBTYPE OF (IfcCartesianTransformationOperator);
 DERIVE
	U : LIST [2:2] OF IfcDirection := IfcBaseAxis(2,SELF\IfcCartesianTransformationOperator.Axis1,
          SELF\IfcCartesianTransformationOperator.Axis2,?);
 WHERE
	WR1 : SELF\IfcCartesianTransformationOperator.Dim = 2;
	WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
            (SELF\IfcCartesianTransformationOperator.Axis1.Dim = 2);
	WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
            (SELF\IfcCartesianTransformationOperator.Axis2.Dim = 2);
END_ENTITY;

ENTITY IfcCartesianTransformationOperator2DnonUniform
 SUBTYPE OF (IfcCartesianTransformationOperator2D);
	Scale2 : OPTIONAL REAL;
 DERIVE
	Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
 WHERE
	WR1 : Scl2 > 0.0;
END_ENTITY;

ENTITY IfcCartesianTransformationOperator3D
 SUPERTYPE OF (ONEOF
	(IfcCartesianTransformationOperator3DnonUniform))
 SUBTYPE OF (IfcCartesianTransformationOperator);
	Axis3 : OPTIONAL IfcDirection;
 DERIVE
	U : LIST [3:3] OF IfcDirection := IfcBaseAxis(3,SELF\IfcCartesianTransformationOperator.Axis1,
              SELF\IfcCartesianTransformationOperator.Axis2,Axis3);
 WHERE
	WR1 : SELF\IfcCartesianTransformationOperator.Dim = 3;
	WR2 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR 
            (SELF\IfcCartesianTransformationOperator.Axis1.Dim = 3);
	WR3 : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR 
            (SELF\IfcCartesianTransformationOperator.Axis2.Dim = 3);
	WR4 : NOT(EXISTS(Axis3)) OR (Axis3.Dim = 3);
END_ENTITY;

ENTITY IfcCartesianTransformationOperator3DnonUniform
 SUBTYPE OF (IfcCartesianTransformationOperator3D);
	Scale2 : OPTIONAL REAL;
	Scale3 : OPTIONAL REAL;
 DERIVE
	Scl2 : REAL := NVL(Scale2, SELF\IfcCartesianTransformationOperator.Scl);
	Scl3 : REAL := NVL(Scale3, SELF\IfcCartesianTransformationOperator.Scl);
 WHERE
	WR1 : Scl2 > 0.0;
	WR2 : Scl3 > 0.0;
END_ENTITY;

ENTITY IfcCenterLineProfileDef
 SUBTYPE OF (IfcArbitraryOpenProfileDef);
	Thickness : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcChamferEdgeFeature
 SUBTYPE OF (IfcEdgeFeature);
	Width : OPTIONAL IfcPositiveLengthMeasure;
	Height : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcChillerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcChillerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcChillerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcChillerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCircle
 SUBTYPE OF (IfcConic);
	Radius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcCircleHollowProfileDef
 SUBTYPE OF (IfcCircleProfileDef);
	WallThickness : IfcPositiveLengthMeasure;
 WHERE
	WR1 : WallThickness < SELF\IfcCircleProfileDef.Radius;
END_ENTITY;

ENTITY IfcCircleProfileDef
 SUPERTYPE OF (ONEOF
	(IfcCircleHollowProfileDef))
 SUBTYPE OF (IfcParameterizedProfileDef);
	Radius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcClassification;
	Source : IfcLabel;
	Edition : IfcLabel;
	EditionDate : OPTIONAL IfcCalendarDate;
	Name : IfcLabel;
 INVERSE
	Contains : SET [0:?] OF IfcClassificationItem FOR ItemOf;
END_ENTITY;

ENTITY IfcClassificationItem;
	Notation : IfcClassificationNotationFacet;
	ItemOf : OPTIONAL IfcClassification;
	Title : IfcLabel;
 INVERSE
	IsClassifiedItemIn : SET [0:1] OF IfcClassificationItemRelationship FOR RelatedItems;
	IsClassifyingItemIn : SET [0:1] OF IfcClassificationItemRelationship FOR RelatingItem;
END_ENTITY;

ENTITY IfcClassificationItemRelationship;
	RelatingItem : IfcClassificationItem;
	RelatedItems : SET [1:?] OF IfcClassificationItem;
END_ENTITY;

ENTITY IfcClassificationNotation;
	NotationFacets : SET [1:?] OF IfcClassificationNotationFacet;
END_ENTITY;

ENTITY IfcClassificationNotationFacet;
	NotationValue : IfcLabel;
END_ENTITY;

ENTITY IfcClassificationReference
 SUBTYPE OF (IfcExternalReference);
	ReferencedSource : OPTIONAL IfcClassification;
END_ENTITY;

ENTITY IfcClosedShell
 SUBTYPE OF (IfcConnectedFaceSet);
END_ENTITY;

ENTITY IfcCoilType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcCoilTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCoilTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCoilTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcColourRgb
 SUBTYPE OF (IfcColourSpecification);
	Red : IfcNormalisedRatioMeasure;
	Green : IfcNormalisedRatioMeasure;
	Blue : IfcNormalisedRatioMeasure;
END_ENTITY;

ENTITY IfcColourSpecification
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcColourRgb));
	Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcColumn
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcColumnType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcColumnTypeEnum;
END_ENTITY;

ENTITY IfcComplexProperty
 SUBTYPE OF (IfcProperty);
	UsageName : IfcIdentifier;
	HasProperties : SET [1:?] OF IfcProperty;
 WHERE
	WR21 : SIZEOF(QUERY(temp <* HasProperties | SELF :=: temp)) = 0;
	WR22 : IfcUniquePropertyName(HasProperties);
END_ENTITY;

ENTITY IfcCompositeCurve
 SUPERTYPE OF (ONEOF
	(Ifc2DCompositeCurve))
 SUBTYPE OF (IfcBoundedCurve);
	Segments : LIST [1:?] OF IfcCompositeCurveSegment;
	SelfIntersect : LOGICAL;
 DERIVE
	NSegments : INTEGER := SIZEOF(Segments);
	ClosedCurve : LOGICAL := Segments[NSegments].Transition <> Discontinuous;
 WHERE
	WR41 : ((NOT ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 1)) OR ((ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 0));
	WR42 : SIZEOF( QUERY( Temp <* Segments | Temp.Dim <> Segments[1].Dim)) = 0;
END_ENTITY;

ENTITY IfcCompositeCurveSegment
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Transition : IfcTransitionCode;
	SameSense : BOOLEAN;
	ParentCurve : IfcCurve;
 DERIVE
	Dim : IfcDimensionCount := ParentCurve.Dim;
 INVERSE
	UsingCurves : SET [1:?] OF IfcCompositeCurve FOR Segments;
 WHERE
	WR1 : ('IFC2X3.IFCBOUNDEDCURVE' IN TYPEOF(ParentCurve));
END_ENTITY;

ENTITY IfcCompositeProfileDef
 SUBTYPE OF (IfcProfileDef);
	Profiles : SET [2:?] OF IfcProfileDef;
	Label : OPTIONAL IfcLabel;
 WHERE
	WR1 : SIZEOF(QUERY(temp <* Profiles | temp.ProfileType <> Profiles[1].ProfileType)) = 0;
	WR2 : SIZEOF(QUERY(temp <* Profiles | 'IFC2X3.IFCCOMPOSITEPROFILEDEF' IN TYPEOF(temp))) = 0;
END_ENTITY;

ENTITY IfcCompressorType
 SUBTYPE OF (IfcFlowMovingDeviceType);
	PredefinedType : IfcCompressorTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCompressorTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCompressorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCondenserType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcCondenserTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCondenserTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCondenserTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCondition
 SUBTYPE OF (IfcGroup);
END_ENTITY;

ENTITY IfcConditionCriterion
 SUBTYPE OF (IfcControl);
	Criterion : IfcConditionCriterionSelect;
	CriterionDateTime : IfcDateTimeSelect;
 WHERE
	WR1 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcConic
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCircle
	,IfcEllipse))
 SUBTYPE OF (IfcCurve);
	Position : IfcAxis2Placement;
END_ENTITY;

ENTITY IfcConnectedFaceSet
 SUPERTYPE OF (ONEOF
	(IfcClosedShell
	,IfcOpenShell))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
	CfsFaces : SET [1:?] OF IfcFace;
END_ENTITY;

ENTITY IfcConnectionCurveGeometry
 SUBTYPE OF (IfcConnectionGeometry);
	CurveOnRelatingElement : IfcCurveOrEdgeCurve;
	CurveOnRelatedElement : OPTIONAL IfcCurveOrEdgeCurve;
END_ENTITY;

ENTITY IfcConnectionGeometry
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcConnectionCurveGeometry
	,IfcConnectionPointGeometry
	,IfcConnectionPortGeometry
	,IfcConnectionSurfaceGeometry));
END_ENTITY;

ENTITY IfcConnectionPointEccentricity
 SUBTYPE OF (IfcConnectionPointGeometry);
	EccentricityInX : OPTIONAL IfcLengthMeasure;
	EccentricityInY : OPTIONAL IfcLengthMeasure;
	EccentricityInZ : OPTIONAL IfcLengthMeasure;
END_ENTITY;

ENTITY IfcConnectionPointGeometry
 SUPERTYPE OF (ONEOF
	(IfcConnectionPointEccentricity))
 SUBTYPE OF (IfcConnectionGeometry);
	PointOnRelatingElement : IfcPointOrVertexPoint;
	PointOnRelatedElement : OPTIONAL IfcPointOrVertexPoint;
END_ENTITY;

ENTITY IfcConnectionPortGeometry
 SUBTYPE OF (IfcConnectionGeometry);
	LocationAtRelatingElement : IfcAxis2Placement;
	LocationAtRelatedElement : OPTIONAL IfcAxis2Placement;
	ProfileOfPort : IfcProfileDef;
END_ENTITY;

ENTITY IfcConnectionSurfaceGeometry
 SUBTYPE OF (IfcConnectionGeometry);
	SurfaceOnRelatingElement : IfcSurfaceOrFaceSurface;
	SurfaceOnRelatedElement : OPTIONAL IfcSurfaceOrFaceSurface;
END_ENTITY;

ENTITY IfcConstraint
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcMetric
	,IfcObjective));
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	ConstraintGrade : IfcConstraintEnum;
	ConstraintSource : OPTIONAL IfcLabel;
	CreatingActor : OPTIONAL IfcActorSelect;
	CreationTime : OPTIONAL IfcDateTimeSelect;
	UserDefinedGrade : OPTIONAL IfcLabel;
 INVERSE
	ClassifiedAs : SET [0:?] OF IfcConstraintClassificationRelationship FOR ClassifiedConstraint;
	RelatesConstraints : SET [0:?] OF IfcConstraintRelationship FOR RelatingConstraint;
	IsRelatedWith : SET [0:?] OF IfcConstraintRelationship FOR RelatedConstraints;
	PropertiesForConstraint : SET [0:?] OF IfcPropertyConstraintRelationship FOR RelatingConstraint;
	Aggregates : SET [0:?] OF IfcConstraintAggregationRelationship FOR RelatingConstraint;
	IsAggregatedIn : SET [0:?] OF IfcConstraintAggregationRelationship FOR RelatedConstraints;
 WHERE
	WR11 : (ConstraintGrade <> IfcConstraintEnum.USERDEFINED) OR
             ((ConstraintGrade = IfcConstraintEnum.USERDEFINED) AND EXISTS(SELF\IfcConstraint.UserDefinedGrade));
END_ENTITY;

ENTITY IfcConstraintAggregationRelationship;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	RelatingConstraint : IfcConstraint;
	RelatedConstraints : LIST [1:?] OF UNIQUE IfcConstraint;
	LogicalAggregator : IfcLogicalOperatorEnum;
 WHERE
	WR11 : SIZEOF(QUERY(temp <* RelatedConstraints | 
               temp :=: RelatingConstraint
               )) = 0;
END_ENTITY;

ENTITY IfcConstraintClassificationRelationship;
	ClassifiedConstraint : IfcConstraint;
	RelatedClassifications : SET [1:?] OF IfcClassificationNotationSelect;
END_ENTITY;

ENTITY IfcConstraintRelationship;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	RelatingConstraint : IfcConstraint;
	RelatedConstraints : SET [1:?] OF IfcConstraint;
 WHERE
	WR11 : SIZEOF(QUERY(temp <* RelatedConstraints | temp :=: RelatingConstraint )) = 0;
END_ENTITY;

ENTITY IfcConstructionEquipmentResource
 SUBTYPE OF (IfcConstructionResource);
END_ENTITY;

ENTITY IfcConstructionMaterialResource
 SUBTYPE OF (IfcConstructionResource);
	Suppliers : OPTIONAL SET [1:?] OF IfcActorSelect;
	UsageRatio : OPTIONAL IfcRatioMeasure;
 WHERE
	WR1 : SIZEOF(SELF\IfcResource.ResourceOf) <=1;
	WR2 : NOT(EXISTS(SELF\IfcResource.ResourceOf[1])) OR
            (SELF\IfcResource.ResourceOf[1].RelatedObjectsType = IfcObjectTypeEnum.PRODUCT);
END_ENTITY;

ENTITY IfcConstructionProductResource
 SUBTYPE OF (IfcConstructionResource);
 WHERE
	WR1 : SIZEOF(SELF\IfcResource.ResourceOf) <=1;
	WR2 : NOT(EXISTS(SELF\IfcResource.ResourceOf[1])) OR
            (SELF\IfcResource.ResourceOf[1].RelatedObjectsType = IfcObjectTypeEnum.PRODUCT);
END_ENTITY;

ENTITY IfcConstructionResource
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcConstructionEquipmentResource
	,IfcConstructionMaterialResource
	,IfcConstructionProductResource
	,IfcCrewResource
	,IfcLaborResource
	,IfcSubContractResource))
 SUBTYPE OF (IfcResource);
	ResourceIdentifier : OPTIONAL IfcIdentifier;
	ResourceGroup : OPTIONAL IfcLabel;
	ResourceConsumption : OPTIONAL IfcResourceConsumptionEnum;
	BaseQuantity : OPTIONAL IfcMeasureWithUnit;
END_ENTITY;

ENTITY IfcContextDependentUnit
 SUBTYPE OF (IfcNamedUnit);
	Name : IfcLabel;
END_ENTITY;

ENTITY IfcControl
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcActionRequest
	,IfcConditionCriterion
	,IfcCostItem
	,IfcCostSchedule
	,IfcEquipmentStandard
	,IfcFurnitureStandard
	,IfcPerformanceHistory
	,IfcPermit
	,IfcProjectOrder
	,IfcProjectOrderRecord
	,IfcScheduleTimeControl
	,IfcServiceLife
	,IfcSpaceProgram
	,IfcTimeSeriesSchedule
	,IfcWorkControl))
 SUBTYPE OF (IfcObject);
 INVERSE
	Controls : SET [0:?] OF IfcRelAssignsToControl FOR RelatingControl;
END_ENTITY;

ENTITY IfcControllerType
 SUBTYPE OF (IfcDistributionControlElementType);
	PredefinedType : IfcControllerTypeEnum;
END_ENTITY;

ENTITY IfcConversionBasedUnit
 SUBTYPE OF (IfcNamedUnit);
	Name : IfcLabel;
	ConversionFactor : IfcMeasureWithUnit;
END_ENTITY;

ENTITY IfcCooledBeamType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcCooledBeamTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCooledBeamTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCooledBeamTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCoolingTowerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcCoolingTowerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcCoolingTowerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcCoolingTowerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCoordinatedUniversalTimeOffset;
	HourOffset : IfcHourInDay;
	MinuteOffset : OPTIONAL IfcMinuteInHour;
	Sense : IfcAheadOrBehind;
END_ENTITY;

ENTITY IfcCostItem
 SUBTYPE OF (IfcControl);
END_ENTITY;

ENTITY IfcCostSchedule
 SUBTYPE OF (IfcControl);
	SubmittedBy : OPTIONAL IfcActorSelect;
	PreparedBy : OPTIONAL IfcActorSelect;
	SubmittedOn : OPTIONAL IfcDateTimeSelect;
	Status : OPTIONAL IfcLabel;
	TargetUsers : OPTIONAL SET [1:?] OF IfcActorSelect;
	UpdateDate : OPTIONAL IfcDateTimeSelect;
	ID : IfcIdentifier;
	PredefinedType : IfcCostScheduleTypeEnum;
 UNIQUE
	UR2 : ID;
END_ENTITY;

ENTITY IfcCostValue
 SUBTYPE OF (IfcAppliedValue);
	CostType : IfcLabel;
	Condition : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcCovering
 SUBTYPE OF (IfcBuildingElement);
	PredefinedType : OPTIONAL IfcCoveringTypeEnum;
 INVERSE
	CoversSpaces : SET [0:1] OF IfcRelCoversSpaces FOR RelatedCoverings;
	Covers : SET [0:1] OF IfcRelCoversBldgElements FOR RelatedCoverings;
END_ENTITY;

ENTITY IfcCoveringType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcCoveringTypeEnum;
END_ENTITY;

ENTITY IfcCraneRailAShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	OverallHeight : IfcPositiveLengthMeasure;
	BaseWidth2 : IfcPositiveLengthMeasure;
	Radius : OPTIONAL IfcPositiveLengthMeasure;
	HeadWidth : IfcPositiveLengthMeasure;
	HeadDepth2 : IfcPositiveLengthMeasure;
	HeadDepth3 : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	BaseWidth4 : IfcPositiveLengthMeasure;
	BaseDepth1 : IfcPositiveLengthMeasure;
	BaseDepth2 : IfcPositiveLengthMeasure;
	BaseDepth3 : IfcPositiveLengthMeasure;
	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcCraneRailFShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	OverallHeight : IfcPositiveLengthMeasure;
	HeadWidth : IfcPositiveLengthMeasure;
	Radius : OPTIONAL IfcPositiveLengthMeasure;
	HeadDepth2 : IfcPositiveLengthMeasure;
	HeadDepth3 : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	BaseDepth1 : IfcPositiveLengthMeasure;
	BaseDepth2 : IfcPositiveLengthMeasure;
	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcCrewResource
 SUBTYPE OF (IfcConstructionResource);
END_ENTITY;

ENTITY IfcCsgPrimitive3D
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBlock
	,IfcRectangularPyramid
	,IfcRightCircularCone
	,IfcRightCircularCylinder
	,IfcSphere))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Position : IfcAxis2Placement3D;
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcCsgSolid
 SUBTYPE OF (IfcSolidModel);
	TreeRootExpression : IfcCsgSelect;
END_ENTITY;

ENTITY IfcCurrencyRelationship;
	RelatingMonetaryUnit : IfcMonetaryUnit;
	RelatedMonetaryUnit : IfcMonetaryUnit;
	ExchangeRate : IfcPositiveRatioMeasure;
	RateDateTime : IfcDateAndTime;
	RateSource : OPTIONAL IfcLibraryInformation;
END_ENTITY;

ENTITY IfcCurtainWall
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcCurtainWallType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcCurtainWallTypeEnum;
END_ENTITY;

ENTITY IfcCurve
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBoundedCurve
	,IfcConic
	,IfcLine
	,IfcOffsetCurve2D
	,IfcOffsetCurve3D))
 SUBTYPE OF (IfcGeometricRepresentationItem);
 DERIVE
	Dim : IfcDimensionCount := IfcCurveDim(SELF);
END_ENTITY;

ENTITY IfcCurveBoundedPlane
 SUBTYPE OF (IfcBoundedSurface);
	BasisSurface : IfcPlane;
	OuterBoundary : IfcCurve;
	InnerBoundaries : SET [0:?] OF IfcCurve;
 DERIVE
	Dim : IfcDimensionCount := BasisSurface.Dim;
END_ENTITY;

ENTITY IfcCurveStyle
 SUBTYPE OF (IfcPresentationStyle);
	CurveFont : OPTIONAL IfcCurveFontOrScaledCurveFontSelect;
	CurveWidth : OPTIONAL IfcSizeSelect;
	CurveColour : OPTIONAL IfcColour;
 WHERE
	WR11 : (NOT(EXISTS(CurveWidth))) OR
             ('IFC2X3.IFCPOSITIVELENGTHMEASURE' IN TYPEOF(CurveWidth)) OR 
              (('IFC2X3.IFCDESCRIPTIVEMEASURE' IN TYPEOF(CurveWidth)) AND
              (CurveWidth = 'by layer'));
END_ENTITY;

ENTITY IfcCurveStyleFont;
	Name : OPTIONAL IfcLabel;
	PatternList : LIST [1:?] OF IfcCurveStyleFontPattern;
END_ENTITY;

ENTITY IfcCurveStyleFontAndScaling;
	Name : OPTIONAL IfcLabel;
	CurveFont : IfcCurveStyleFontSelect;
	CurveFontScaling : IfcPositiveRatioMeasure;
END_ENTITY;

ENTITY IfcCurveStyleFontPattern;
	VisibleSegmentLength : IfcLengthMeasure;
	InvisibleSegmentLength : IfcPositiveLengthMeasure;
 WHERE
	WR01 : VisibleSegmentLength >= 0.;
END_ENTITY;

ENTITY IfcDamperType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcDamperTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcDamperTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcDamperTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcDateAndTime;
	DateComponent : IfcCalendarDate;
	TimeComponent : IfcLocalTime;
END_ENTITY;

ENTITY IfcDefinedSymbol
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Definition : IfcDefinedSymbolSelect;
	Target : IfcCartesianTransformationOperator2D;
END_ENTITY;

ENTITY IfcDerivedProfileDef
 SUBTYPE OF (IfcProfileDef);
	ParentProfile : IfcProfileDef;
	Operator : IfcCartesianTransformationOperator2D;
	Label : OPTIONAL IfcLabel;
 WHERE
	WR1 : SELF\IfcProfileDef.ProfileType = ParentProfile.ProfileType;
END_ENTITY;

ENTITY IfcDerivedUnit;
	Elements : SET [1:?] OF IfcDerivedUnitElement;
	UnitType : IfcDerivedUnitEnum;
	UserDefinedType : OPTIONAL IfcLabel;
 DERIVE
	Dimensions : IfcDimensionalExponents := IfcDeriveDimensionalExponents(SELF);
 WHERE
	WR1 : (SIZEOF (Elements) > 1) OR ((SIZEOF (Elements) = 1) AND (Elements[1].Exponent <> 1 ));
	WR2 : (UnitType <> IfcDerivedUnitEnum.USERDEFINED) OR
            ((UnitType = IfcDerivedUnitEnum.USERDEFINED) AND 
             (EXISTS(SELF.UserDefinedType)));
END_ENTITY;

ENTITY IfcDerivedUnitElement;
	Unit : IfcNamedUnit;
	Exponent : INTEGER;
END_ENTITY;

ENTITY IfcDiameterDimension
 SUBTYPE OF (IfcDimensionCurveDirectedCallout);
END_ENTITY;

ENTITY IfcDimensionCalloutRelationship
 SUBTYPE OF (IfcDraughtingCalloutRelationship);
 WHERE
	WR11 : SELF\IfcDraughtingCalloutRelationship.Name IN ['primary','secondary'];
	WR12 : SIZEOF(TYPEOF(SELF\IfcDraughtingCalloutRelationship.RelatingDraughtingCallout) * [
                  'IFC2X3.IFCANGULARDIMENSION',
                  'IFC2X3.IFCDIAMETERDIMENSION',
                  'IFC2X3.IFCLINEARDIMENSION',
                  'IFC2X3.IFCRADIUSDIMENSION']) = 1;
	WR13 : NOT ('IFC2X3.IFCDIMENSIONCURVEDIRECTEDCALLOUT'
               IN TYPEOF (SELF\IfcDraughtingCalloutRelationship.RelatedDraughtingCallout));
END_ENTITY;

ENTITY IfcDimensionCurve
 SUBTYPE OF (IfcAnnotationCurveOccurrence);
 INVERSE
	AnnotatedBySymbols : SET [0:2] OF IfcTerminatorSymbol FOR AnnotatedCurve;
 WHERE
	WR51 : SIZEOF(USEDIN(SELF,'IFC2X3.IFCDRAUGHTINGCALLOUT.CONTENTS')) 
                   >= 1;
	WR52 : (SIZEOF(QUERY (Dct1 <* USEDIN(SELF,'IFC2X3.' + 
                            'IFCTERMINATORSYMBOL.ANNOTATEDCURVE') | (Dct1.Role = IfcDimensionExtentUsage.ORIGIN))) <= 1) 
             AND 
             (SIZEOF(QUERY (Dct2 <* USEDIN(SELF,'IFC2X3.' + 
                            'IFCTERMINATORSYMBOL.ANNOTATEDCURVE') | (Dct2.Role = IfcDimensionExtentUsage.TARGET))) <= 1);
	WR53 : SIZEOF(QUERY (Dct <* AnnotatedBySymbols | 
               NOT('IFC2X3.IFCDIMENSIONCURVETERMINATOR' IN TYPEOF(Dct)))) 
               = 0;
END_ENTITY;

ENTITY IfcDimensionCurveDirectedCallout
 SUPERTYPE OF (ONEOF
	(IfcAngularDimension
	,IfcDiameterDimension
	,IfcLinearDimension
	,IfcRadiusDimension))
 SUBTYPE OF (IfcDraughtingCallout);
 WHERE
	WR41 : SIZEOF(QUERY (Dc <* SELF\IfcDraughtingCallout.Contents | (
                   'IFC2X3.IFCDIMENSIONCURVE' IN TYPEOF(Dc)))) 
                  = 1;
	WR42 : SIZEOF (QUERY (Dc <* SELF.contents |
                    ('IFC2X3.IFCPROJECTIONCURVE' IN
                      TYPEOF (Dc)))) <= 2;
END_ENTITY;

ENTITY IfcDimensionCurveTerminator
 SUBTYPE OF (IfcTerminatorSymbol);
	Role : IfcDimensionExtentUsage;
 WHERE
	WR61 : 'IFC2X3.IFCDIMENSIONCURVE' IN TYPEOF
             (SELF\IfcTerminatorSymbol.AnnotatedCurve);
END_ENTITY;

ENTITY IfcDimensionPair
 SUBTYPE OF (IfcDraughtingCalloutRelationship);
 WHERE
	WR11 : SELF.Name IN ['chained','parallel'];
	WR12 : SIZEOF(TYPEOF(SELF.RelatingDraughtingCallout) * [
                            'IFC2X3.IFCANGULARDIMENSION',
                            'IFC2X3.IFCDIAMETERDIMENSION',
                            'IFC2X3.IFCLINEARDIMENSION',
                            'IFC2X3.IFCRADIUSDIMENSION']) = 1;
	WR13 : SIZEOF(TYPEOF(SELF.RelatedDraughtingCallout) * [
                            'IFC2X3.IFCANGULARDIMENSION',
                            'IFC2X3.IFCDIAMETERDIMENSION',
                            'IFC2X3.IFCLINEARDIMENSION',
                            'IFC2X3.IFCRADIUSDIMENSION']) = 1;
END_ENTITY;

ENTITY IfcDimensionalExponents;
	LengthExponent : INTEGER;
	MassExponent : INTEGER;
	TimeExponent : INTEGER;
	ElectricCurrentExponent : INTEGER;
	ThermodynamicTemperatureExponent : INTEGER;
	AmountOfSubstanceExponent : INTEGER;
	LuminousIntensityExponent : INTEGER;
END_ENTITY;

ENTITY IfcDirection
 SUBTYPE OF (IfcGeometricRepresentationItem);
	DirectionRatios : LIST [2:3] OF REAL;
 DERIVE
	Dim : IfcDimensionCount := HIINDEX(DirectionRatios);
END_ENTITY;

ENTITY IfcDiscreteAccessory
 SUBTYPE OF (IfcElementComponent);
END_ENTITY;

ENTITY IfcDiscreteAccessoryType
 SUPERTYPE OF (ONEOF
	(IfcVibrationIsolatorType))
 SUBTYPE OF (IfcElementComponentType);
END_ENTITY;

ENTITY IfcDistributionChamberElement
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcDistributionChamberElementType
 SUBTYPE OF (IfcDistributionFlowElementType);
	PredefinedType : IfcDistributionChamberElementTypeEnum;
END_ENTITY;

ENTITY IfcDistributionControlElement
 SUBTYPE OF (IfcDistributionElement);
	ControlElementId : OPTIONAL IfcIdentifier;
 INVERSE
	AssignedToFlowElement : SET [0:1] OF IfcRelFlowControlElements FOR RelatedControlElements;
END_ENTITY;

ENTITY IfcDistributionControlElementType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcActuatorType
	,IfcAlarmType
	,IfcControllerType
	,IfcFlowInstrumentType
	,IfcSensorType))
 SUBTYPE OF (IfcDistributionElementType);
END_ENTITY;

ENTITY IfcDistributionElement
 SUPERTYPE OF (ONEOF
	(IfcDistributionControlElement
	,IfcDistributionFlowElement))
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcDistributionElementType
 SUPERTYPE OF (ONEOF
	(IfcDistributionControlElementType
	,IfcDistributionFlowElementType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcDistributionFlowElement
 SUPERTYPE OF (ONEOF
	(IfcDistributionChamberElement
	,IfcEnergyConversionDevice
	,IfcFlowController
	,IfcFlowFitting
	,IfcFlowMovingDevice
	,IfcFlowSegment
	,IfcFlowStorageDevice
	,IfcFlowTerminal
	,IfcFlowTreatmentDevice))
 SUBTYPE OF (IfcDistributionElement);
 INVERSE
	HasControlElements : SET [0:1] OF IfcRelFlowControlElements FOR RelatingFlowElement;
END_ENTITY;

ENTITY IfcDistributionFlowElementType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDistributionChamberElementType
	,IfcEnergyConversionDeviceType
	,IfcFlowControllerType
	,IfcFlowFittingType
	,IfcFlowMovingDeviceType
	,IfcFlowSegmentType
	,IfcFlowStorageDeviceType
	,IfcFlowTerminalType
	,IfcFlowTreatmentDeviceType))
 SUBTYPE OF (IfcDistributionElementType);
END_ENTITY;

ENTITY IfcDistributionPort
 SUBTYPE OF (IfcPort);
	FlowDirection : OPTIONAL IfcFlowDirectionEnum;
END_ENTITY;

ENTITY IfcDocumentElectronicFormat;
	FileExtension : OPTIONAL IfcLabel;
	MimeContentType : OPTIONAL IfcLabel;
	MimeSubtype : OPTIONAL IfcLabel;
 WHERE
	WR1 : EXISTS(FileExtension) OR EXISTS(MimeContentType);
END_ENTITY;

ENTITY IfcDocumentInformation;
	DocumentId : IfcIdentifier;
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	DocumentReferences : OPTIONAL SET [1:?] OF IfcDocumentReference;
	Purpose : OPTIONAL IfcText;
	IntendedUse : OPTIONAL IfcText;
	Scope : OPTIONAL IfcText;
	Revision : OPTIONAL IfcLabel;
	DocumentOwner : OPTIONAL IfcActorSelect;
	Editors : OPTIONAL SET [1:?] OF IfcActorSelect;
	CreationTime : OPTIONAL IfcDateAndTime;
	LastRevisionTime : OPTIONAL IfcDateAndTime;
	ElectronicFormat : OPTIONAL IfcDocumentElectronicFormat;
	ValidFrom : OPTIONAL IfcCalendarDate;
	ValidUntil : OPTIONAL IfcCalendarDate;
	Confidentiality : OPTIONAL IfcDocumentConfidentialityEnum;
	Status : OPTIONAL IfcDocumentStatusEnum;
 INVERSE
	IsPointedTo : SET [0:?] OF IfcDocumentInformationRelationship FOR RelatedDocuments;
	IsPointer : SET [0:1] OF IfcDocumentInformationRelationship FOR RelatingDocument;
END_ENTITY;

ENTITY IfcDocumentInformationRelationship;
	RelatingDocument : IfcDocumentInformation;
	RelatedDocuments : SET [1:?] OF IfcDocumentInformation;
	RelationshipType : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcDocumentReference
 SUBTYPE OF (IfcExternalReference);
 INVERSE
	ReferenceToDocument : SET [0:1] OF IfcDocumentInformation FOR DocumentReferences;
 WHERE
	WR1 : EXISTS(Name) XOR EXISTS(ReferenceToDocument[1]);
END_ENTITY;

ENTITY IfcDoor
 SUBTYPE OF (IfcBuildingElement);
	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcDoorLiningProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
	LiningThickness : OPTIONAL IfcPositiveLengthMeasure;
	ThresholdDepth : OPTIONAL IfcPositiveLengthMeasure;
	ThresholdThickness : OPTIONAL IfcPositiveLengthMeasure;
	TransomThickness : OPTIONAL IfcPositiveLengthMeasure;
	TransomOffset : OPTIONAL IfcLengthMeasure;
	LiningOffset : OPTIONAL IfcLengthMeasure;
	ThresholdOffset : OPTIONAL IfcLengthMeasure;
	CasingThickness : OPTIONAL IfcPositiveLengthMeasure;
	CasingDepth : OPTIONAL IfcPositiveLengthMeasure;
	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
 WHERE
	WR31 : NOT(NOT(EXISTS(LiningDepth)) AND EXISTS(LiningThickness));
	WR32 : NOT(NOT(EXISTS(ThresholdDepth)) AND EXISTS(ThresholdThickness));
	WR33 : (EXISTS(TransomOffset) AND EXISTS(TransomThickness)) XOR
             (NOT(EXISTS(TransomOffset)) AND NOT(EXISTS(TransomThickness)));
	WR34 : (EXISTS(CasingDepth) AND EXISTS(CasingThickness)) XOR
             (NOT(EXISTS(CasingDepth)) AND NOT(EXISTS(CasingThickness)));
	WR35 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
             ('IFC2X3.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
END_ENTITY;

ENTITY IfcDoorPanelProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	PanelDepth : OPTIONAL IfcPositiveLengthMeasure;
	PanelOperation : IfcDoorPanelOperationEnum;
	PanelWidth : OPTIONAL IfcNormalisedRatioMeasure;
	PanelPosition : IfcDoorPanelPositionEnum;
	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
 WHERE
	WR31 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
             ('IFC2X3.IFCDOORSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
END_ENTITY;

ENTITY IfcDoorStyle
 SUBTYPE OF (IfcTypeProduct);
	OperationType : IfcDoorStyleOperationEnum;
	ConstructionType : IfcDoorStyleConstructionEnum;
	ParameterTakesPrecedence : BOOLEAN;
	Sizeable : BOOLEAN;
END_ENTITY;

ENTITY IfcDraughtingCallout
 SUPERTYPE OF (ONEOF
	(IfcDimensionCurveDirectedCallout
	,IfcStructuredDimensionCallout))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Contents : SET [1:?] OF IfcDraughtingCalloutElement;
 INVERSE
	IsRelatedFromCallout : SET [0:?] OF IfcDraughtingCalloutRelationship FOR RelatedDraughtingCallout;
	IsRelatedToCallout : SET [0:?] OF IfcDraughtingCalloutRelationship FOR RelatingDraughtingCallout;
END_ENTITY;

ENTITY IfcDraughtingCalloutRelationship
 SUPERTYPE OF (ONEOF
	(IfcDimensionCalloutRelationship
	,IfcDimensionPair));
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	RelatingDraughtingCallout : IfcDraughtingCallout;
	RelatedDraughtingCallout : IfcDraughtingCallout;
END_ENTITY;

ENTITY IfcDraughtingPreDefinedColour
 SUBTYPE OF (IfcPreDefinedColour);
 WHERE
	WR31 : SELF\IfcPreDefinedItem.Name IN ['black','red','green','blue','yellow',
                  'magenta','cyan','white','by layer'];
END_ENTITY;

ENTITY IfcDraughtingPreDefinedCurveFont
 SUBTYPE OF (IfcPreDefinedCurveFont);
 WHERE
	WR31 : SELF\IfcPredefinedItem.Name IN
                    ['continuous',
                     'chain',
                     'chain double dash',
                     'dashed',
                     'dotted',
                     'by layer'];
END_ENTITY;

ENTITY IfcDraughtingPreDefinedTextFont
 SUBTYPE OF (IfcPreDefinedTextFont);
 WHERE
	WR31 : SELF\IfcPreDefinedItem.Name IN ['ISO 3098-1 font A','ISO 3098-1 font B'];
END_ENTITY;

ENTITY IfcDuctFittingType
 SUBTYPE OF (IfcFlowFittingType);
	PredefinedType : IfcDuctFittingTypeEnum;
 WHERE
	WR2 : (PredefinedType <> IfcDuctFittingTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcDuctFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcDuctSegmentType
 SUBTYPE OF (IfcFlowSegmentType);
	PredefinedType : IfcDuctSegmentTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcDuctSegmentTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcDuctSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcDuctSilencerType
 SUBTYPE OF (IfcFlowTreatmentDeviceType);
	PredefinedType : IfcDuctSilencerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcDuctSilencerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcDuctSilencerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcEdge
 SUPERTYPE OF (ONEOF
	(IfcEdgeCurve
	,IfcOrientedEdge
	,IfcSubedge))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
	EdgeStart : IfcVertex;
	EdgeEnd : IfcVertex;
END_ENTITY;

ENTITY IfcEdgeCurve
 SUBTYPE OF (IfcEdge);
	EdgeGeometry : IfcCurve;
	SameSense : BOOLEAN;
END_ENTITY;

ENTITY IfcEdgeFeature
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcChamferEdgeFeature
	,IfcRoundedEdgeFeature))
 SUBTYPE OF (IfcFeatureElementSubtraction);
	FeatureLength : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcEdgeLoop
 SUBTYPE OF (IfcLoop);
	EdgeList : LIST [1:?] OF IfcOrientedEdge;
 DERIVE
	Ne : INTEGER := SIZEOF(EdgeList);
 WHERE
	WR1 : (EdgeList[1].EdgeStart) :=: (EdgeList[Ne].EdgeEnd);
	WR2 : IfcLoopHeadToTail(SELF);
END_ENTITY;

ENTITY IfcElectricApplianceType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcElectricApplianceTypeEnum;
END_ENTITY;

ENTITY IfcElectricDistributionPoint
 SUBTYPE OF (IfcFlowController);
	DistributionPointFunction : IfcElectricDistributionPointFunctionEnum;
	UserDefinedFunction : OPTIONAL IfcLabel;
 WHERE
	WR31 : (DistributionPointFunction <> IfcElectricDistributionPointFunctionEnum.USERDEFINED) OR
             ((DistributionPointFunction = IfcElectricDistributionPointFunctionEnum.USERDEFINED) AND EXISTS(SELF\IfcElectricDistributionPoint.UserDefinedFunction));
END_ENTITY;

ENTITY IfcElectricFlowStorageDeviceType
 SUBTYPE OF (IfcFlowStorageDeviceType);
	PredefinedType : IfcElectricFlowStorageDeviceTypeEnum;
END_ENTITY;

ENTITY IfcElectricGeneratorType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcElectricGeneratorTypeEnum;
END_ENTITY;

ENTITY IfcElectricHeaterType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcElectricHeaterTypeEnum;
END_ENTITY;

ENTITY IfcElectricMotorType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcElectricMotorTypeEnum;
END_ENTITY;

ENTITY IfcElectricTimeControlType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcElectricTimeControlTypeEnum;
END_ENTITY;

ENTITY IfcElectricalBaseProperties
 SUBTYPE OF (IfcEnergyProperties);
	ElectricCurrentType : OPTIONAL IfcElectricCurrentEnum;
	InputVoltage : IfcElectricVoltageMeasure;
	InputFrequency : IfcFrequencyMeasure;
	FullLoadCurrent : OPTIONAL IfcElectricCurrentMeasure;
	MinimumCircuitCurrent : OPTIONAL IfcElectricCurrentMeasure;
	MaximumPowerInput : OPTIONAL IfcPowerMeasure;
	RatedPowerInput : OPTIONAL IfcPowerMeasure;
	InputPhase : INTEGER;
END_ENTITY;

ENTITY IfcElectricalCircuit
 SUBTYPE OF (IfcSystem);
END_ENTITY;

ENTITY IfcElectricalElement
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcElement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBuildingElement
	,IfcDistributionElement
	,IfcElectricalElement
	,IfcElementAssembly
	,IfcElementComponent
	,IfcEquipmentElement
	,IfcFeatureElement
	,IfcFurnishingElement
	,IfcTransportElement
	,IfcVirtualElement))
 SUBTYPE OF (IfcProduct);
	Tag : OPTIONAL IfcIdentifier;
 INVERSE
	FillsVoids : SET [0:1] OF IfcRelFillsElement FOR RelatedBuildingElement;
	ConnectedTo : SET [0:?] OF IfcRelConnectsElements FOR RelatingElement;
	HasCoverings : SET [0:?] OF IfcRelCoversBldgElements FOR RelatingBuildingElement;
	HasProjections : SET [0:?] OF IfcRelProjectsElement FOR RelatingElement;
	HasStructuralMember : SET [0:?] OF IfcRelConnectsStructuralElement FOR RelatingElement;
	ReferencedInStructures : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatedElements;
	HasPorts : SET [0:?] OF IfcRelConnectsPortToElement FOR RelatedElement;
	HasOpenings : SET [0:?] OF IfcRelVoidsElement FOR RelatingBuildingElement;
	IsConnectionRealization : SET [0:?] OF IfcRelConnectsWithRealizingElements FOR RealizingElements;
	ProvidesBoundaries : SET [0:?] OF IfcRelSpaceBoundary FOR RelatedBuildingElement;
	ConnectedFrom : SET [0:?] OF IfcRelConnectsElements FOR RelatedElement;
	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
END_ENTITY;

ENTITY IfcElementAssembly
 SUBTYPE OF (IfcElement);
	AssemblyPlace : OPTIONAL IfcAssemblyPlaceEnum;
	PredefinedType : IfcElementAssemblyTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcElementComponent
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDiscreteAccessory
	,IfcFastener))
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcElementComponentType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDiscreteAccessoryType
	,IfcFastenerType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcElementQuantity
 SUBTYPE OF (IfcPropertySetDefinition);
	MethodOfMeasurement : OPTIONAL IfcLabel;
	Quantities : SET [1:?] OF IfcPhysicalQuantity;
END_ENTITY;

ENTITY IfcElementType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBuildingElementType
	,IfcDistributionElementType
	,IfcElementComponentType
	,IfcFurnishingElementType
	,IfcSpatialStructureElementType
	,IfcTransportElementType))
 SUBTYPE OF (IfcTypeProduct);
	ElementType : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcElementarySurface
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPlane))
 SUBTYPE OF (IfcSurface);
	Position : IfcAxis2Placement3D;
 DERIVE
	Dim : IfcDimensionCount := Position.Dim;
END_ENTITY;

ENTITY IfcEllipse
 SUBTYPE OF (IfcConic);
	SemiAxis1 : IfcPositiveLengthMeasure;
	SemiAxis2 : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcEllipseProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	SemiAxis1 : IfcPositiveLengthMeasure;
	SemiAxis2 : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcEnergyConversionDevice
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcEnergyConversionDeviceType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAirToAirHeatRecoveryType
	,IfcBoilerType
	,IfcChillerType
	,IfcCoilType
	,IfcCondenserType
	,IfcCooledBeamType
	,IfcCoolingTowerType
	,IfcElectricGeneratorType
	,IfcElectricMotorType
	,IfcEvaporativeCoolerType
	,IfcEvaporatorType
	,IfcHeatExchangerType
	,IfcHumidifierType
	,IfcMotorConnectionType
	,IfcSpaceHeaterType
	,IfcTransformerType
	,IfcTubeBundleType
	,IfcUnitaryEquipmentType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcEnergyProperties
 SUPERTYPE OF (ONEOF
	(IfcElectricalBaseProperties))
 SUBTYPE OF (IfcPropertySetDefinition);
	EnergySequence : OPTIONAL IfcEnergySequenceEnum;
	UserDefinedEnergySequence : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcEnvironmentalImpactValue
 SUBTYPE OF (IfcAppliedValue);
	ImpactType : IfcLabel;
	Category : IfcEnvironmentalImpactCategoryEnum;
	UserDefinedCategory : OPTIONAL IfcLabel;
 WHERE
	WR1 : (Category <> IfcEnvironmentalImpactCategoryEnum.USERDEFINED) OR
            ((Category = IfcEnvironmentalImpactCategoryEnum.USERDEFINED) AND EXISTS(SELF\IfcEnvironmentalImpactValue.UserDefinedCategory));
END_ENTITY;

ENTITY IfcEquipmentElement
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcEquipmentStandard
 SUBTYPE OF (IfcControl);
END_ENTITY;

ENTITY IfcEvaporativeCoolerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcEvaporativeCoolerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcEvaporativeCoolerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcEvaporativeCoolerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcEvaporatorType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcEvaporatorTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcEvaporatorTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcEvaporatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcExtendedMaterialProperties
 SUBTYPE OF (IfcMaterialProperties);
	ExtendedProperties : SET [1:?] OF IfcProperty;
	Description : OPTIONAL IfcText;
	Name : IfcLabel;
END_ENTITY;

ENTITY IfcExternalReference
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcClassificationReference
	,IfcDocumentReference
	,IfcExternallyDefinedHatchStyle
	,IfcExternallyDefinedSurfaceStyle
	,IfcExternallyDefinedSymbol
	,IfcExternallyDefinedTextFont
	,IfcLibraryReference));
	Location : OPTIONAL IfcLabel;
	ItemReference : OPTIONAL IfcIdentifier;
	Name : OPTIONAL IfcLabel;
 WHERE
	WR1 : EXISTS(ItemReference) OR EXISTS(Location) OR EXISTS(Name);
END_ENTITY;

ENTITY IfcExternallyDefinedHatchStyle
 SUBTYPE OF (IfcExternalReference);
END_ENTITY;

ENTITY IfcExternallyDefinedSurfaceStyle
 SUBTYPE OF (IfcExternalReference);
END_ENTITY;

ENTITY IfcExternallyDefinedSymbol
 SUBTYPE OF (IfcExternalReference);
END_ENTITY;

ENTITY IfcExternallyDefinedTextFont
 SUBTYPE OF (IfcExternalReference);
END_ENTITY;

ENTITY IfcExtrudedAreaSolid
 SUBTYPE OF (IfcSweptAreaSolid);
	ExtrudedDirection : IfcDirection;
	Depth : IfcPositiveLengthMeasure;
 WHERE
	WR31 : IfcDotProduct(IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcDirection([0.0,0.0,1.0]), SELF.ExtrudedDirection) <> 0.0;
END_ENTITY;

ENTITY IfcFace
 SUPERTYPE OF (ONEOF
	(IfcFaceSurface))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
	Bounds : SET [1:?] OF IfcFaceBound;
 WHERE
	WR1 : SIZEOF(QUERY(temp <* Bounds | 'IFC2X3.IFCFACEOUTERBOUND' IN TYPEOF(temp))) <= 1;
END_ENTITY;

ENTITY IfcFaceBasedSurfaceModel
 SUBTYPE OF (IfcGeometricRepresentationItem);
	FbsmFaces : SET [1:?] OF IfcConnectedFaceSet;
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcFaceBound
 SUPERTYPE OF (ONEOF
	(IfcFaceOuterBound))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
	Bound : IfcLoop;
	Orientation : BOOLEAN;
END_ENTITY;

ENTITY IfcFaceOuterBound
 SUBTYPE OF (IfcFaceBound);
END_ENTITY;

ENTITY IfcFaceSurface
 SUBTYPE OF (IfcFace);
	FaceSurface : IfcSurface;
	SameSense : BOOLEAN;
END_ENTITY;

ENTITY IfcFacetedBrep
 SUBTYPE OF (IfcManifoldSolidBrep);
END_ENTITY;

ENTITY IfcFacetedBrepWithVoids
 SUBTYPE OF (IfcManifoldSolidBrep);
	Voids : SET [1:?] OF IfcClosedShell;
END_ENTITY;

ENTITY IfcFailureConnectionCondition
 SUBTYPE OF (IfcStructuralConnectionCondition);
	TensionFailureX : OPTIONAL IfcForceMeasure;
	TensionFailureY : OPTIONAL IfcForceMeasure;
	TensionFailureZ : OPTIONAL IfcForceMeasure;
	CompressionFailureX : OPTIONAL IfcForceMeasure;
	CompressionFailureY : OPTIONAL IfcForceMeasure;
	CompressionFailureZ : OPTIONAL IfcForceMeasure;
END_ENTITY;

ENTITY IfcFanType
 SUBTYPE OF (IfcFlowMovingDeviceType);
	PredefinedType : IfcFanTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcFanTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcFanTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFastener
 SUPERTYPE OF (ONEOF
	(IfcMechanicalFastener))
 SUBTYPE OF (IfcElementComponent);
END_ENTITY;

ENTITY IfcFastenerType
 SUPERTYPE OF (ONEOF
	(IfcMechanicalFastenerType))
 SUBTYPE OF (IfcElementComponentType);
END_ENTITY;

ENTITY IfcFeatureElement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcFeatureElementAddition
	,IfcFeatureElementSubtraction))
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcFeatureElementAddition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcProjectionElement))
 SUBTYPE OF (IfcFeatureElement);
 INVERSE
	ProjectsElements : IfcRelProjectsElement FOR RelatedFeatureElement;
END_ENTITY;

ENTITY IfcFeatureElementSubtraction
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcEdgeFeature
	,IfcOpeningElement))
 SUBTYPE OF (IfcFeatureElement);
 INVERSE
	VoidsElements : IfcRelVoidsElement FOR RelatedOpeningElement;
END_ENTITY;

ENTITY IfcFillAreaStyle
 SUBTYPE OF (IfcPresentationStyle);
	FillStyles : SET [1:?] OF IfcFillStyleSelect;
 WHERE
	WR11 : SIZEOF(QUERY(Style <* SELF.FillStyles |
               'IFC2X3.IFCCOLOUR' IN
                TYPEOF(Style)
               )) <= 1;
	WR12 : SIZEOF(QUERY(Style <* SELF.FillStyles |
               'IFC2X3.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
                TYPEOF(Style)
               )) <= 1;
	WR13 : (SIZEOF(QUERY(Style <* SELF.FillStyles |
               'IFC2X3.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
                TYPEOF(Style)
               )) >= 1)
             XOR
             (SIZEOF(QUERY(Style <* SELF.FillStyles |
               'IFC2X3.IFCFILLAREASTYLEHATCHING' IN
                TYPEOF(Style)
               )) >= 1)
             XOR
             (SIZEOF(QUERY(Style <* SELF.FillStyles |
               'IFC2X3.IFCFILLAREASTYLETILES' IN
                TYPEOF(Style)
               )) >= 1);
END_ENTITY;

ENTITY IfcFillAreaStyleHatching
 SUBTYPE OF (IfcGeometricRepresentationItem);
	HatchLineAppearance : IfcCurveStyle;
	StartOfNextHatchLine : IfcHatchLineDistanceSelect;
	PointOfReferenceHatchLine : OPTIONAL IfcCartesianPoint;
	PatternStart : OPTIONAL IfcCartesianPoint;
	HatchLineAngle : IfcPlaneAngleMeasure;
 WHERE
	WR21 : NOT(
              'IFC2X3.IFCTWODIRECTIONREPEATFACTOR' 
              IN TYPEOF(StartOfNextHatchLine)
             );
	WR22 : NOT(EXISTS(PatternStart)) 
             OR (PatternStart.Dim = 2);
	WR23 : NOT(EXISTS(PointOfReferenceHatchLine)) 
             OR (PointOfReferenceHatchLine.Dim = 2);
END_ENTITY;

ENTITY IfcFillAreaStyleTileSymbolWithStyle
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Symbol : IfcAnnotationSymbolOccurrence;
END_ENTITY;

ENTITY IfcFillAreaStyleTiles
 SUBTYPE OF (IfcGeometricRepresentationItem);
	TilingPattern : IfcOneDirectionRepeatFactor;
	Tiles : SET [1:?] OF IfcFillAreaStyleTileShapeSelect;
	TilingScale : IfcPositiveRatioMeasure;
END_ENTITY;

ENTITY IfcFilterType
 SUBTYPE OF (IfcFlowTreatmentDeviceType);
	PredefinedType : IfcFilterTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcFilterTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcFilterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFireSuppressionTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcFireSuppressionTerminalTypeEnum;
END_ENTITY;

ENTITY IfcFlowController
 SUPERTYPE OF (ONEOF
	(IfcElectricDistributionPoint))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowControllerType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAirTerminalBoxType
	,IfcDamperType
	,IfcElectricTimeControlType
	,IfcFlowMeterType
	,IfcProtectiveDeviceType
	,IfcSwitchingDeviceType
	,IfcValveType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowFitting
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowFittingType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCableCarrierFittingType
	,IfcDuctFittingType
	,IfcJunctionBoxType
	,IfcPipeFittingType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowInstrumentType
 SUBTYPE OF (IfcDistributionControlElementType);
	PredefinedType : IfcFlowInstrumentTypeEnum;
END_ENTITY;

ENTITY IfcFlowMeterType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcFlowMeterTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcFlowMeterTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcFlowMeterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFlowMovingDevice
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowMovingDeviceType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCompressorType
	,IfcFanType
	,IfcPumpType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowSegment
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowSegmentType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCableCarrierSegmentType
	,IfcCableSegmentType
	,IfcDuctSegmentType
	,IfcPipeSegmentType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowStorageDevice
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowStorageDeviceType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcElectricFlowStorageDeviceType
	,IfcTankType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowTerminal
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowTerminalType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAirTerminalType
	,IfcElectricApplianceType
	,IfcElectricHeaterType
	,IfcFireSuppressionTerminalType
	,IfcGasTerminalType
	,IfcLampType
	,IfcLightFixtureType
	,IfcOutletType
	,IfcSanitaryTerminalType
	,IfcStackTerminalType
	,IfcWasteTerminalType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowTreatmentDevice
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowTreatmentDeviceType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDuctSilencerType
	,IfcFilterType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFluidFlowProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	PropertySource : IfcPropertySourceEnum;
	FlowConditionTimeSeries : OPTIONAL IfcTimeSeries;
	VelocityTimeSeries : OPTIONAL IfcTimeSeries;
	FlowrateTimeSeries : OPTIONAL IfcTimeSeries;
	Fluid : IfcMaterial;
	PressureTimeSeries : OPTIONAL IfcTimeSeries;
	UserDefinedPropertySource : OPTIONAL IfcLabel;
	TemperatureSingleValue : OPTIONAL IfcThermodynamicTemperatureMeasure;
	WetBulbTemperatureSingleValue : OPTIONAL IfcThermodynamicTemperatureMeasure;
	WetBulbTemperatureTimeSeries : OPTIONAL IfcTimeSeries;
	TemperatureTimeSeries : OPTIONAL IfcTimeSeries;
	FlowrateSingleValue : OPTIONAL IfcDerivedMeasureValue;
	FlowConditionSingleValue : OPTIONAL IfcPositiveRatioMeasure;
	VelocitySingleValue : OPTIONAL IfcLinearVelocityMeasure;
	PressureSingleValue : OPTIONAL IfcPressureMeasure;
END_ENTITY;

ENTITY IfcFooting
 SUBTYPE OF (IfcBuildingElement);
	PredefinedType : IfcFootingTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcFuelProperties
 SUBTYPE OF (IfcMaterialProperties);
	CombustionTemperature : OPTIONAL IfcThermodynamicTemperatureMeasure;
	CarbonContent : OPTIONAL IfcPositiveRatioMeasure;
	LowerHeatingValue : OPTIONAL IfcHeatingValueMeasure;
	HigherHeatingValue : OPTIONAL IfcHeatingValueMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcFurnishingElement
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcFurnishingElementType
 SUPERTYPE OF (ONEOF
	(IfcFurnitureType
	,IfcSystemFurnitureElementType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcFurnitureStandard
 SUBTYPE OF (IfcControl);
END_ENTITY;

ENTITY IfcFurnitureType
 SUBTYPE OF (IfcFurnishingElementType);
	AssemblyPlace : IfcAssemblyPlaceEnum;
END_ENTITY;

ENTITY IfcGasTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcGasTerminalTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcGasTerminalTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcGasTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcGeneralMaterialProperties
 SUBTYPE OF (IfcMaterialProperties);
	MolecularWeight : OPTIONAL IfcMolecularWeightMeasure;
	Porosity : OPTIONAL IfcNormalisedRatioMeasure;
	MassDensity : OPTIONAL IfcMassDensityMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcGeneralProfileProperties
 SUPERTYPE OF (ONEOF
	(IfcStructuralProfileProperties))
 SUBTYPE OF (IfcProfileProperties);
	PhysicalWeight : OPTIONAL IfcMassPerLengthMeasure;
	Perimeter : OPTIONAL IfcPositiveLengthMeasure;
	MinimumPlateThickness : OPTIONAL IfcPositiveLengthMeasure;
	MaximumPlateThickness : OPTIONAL IfcPositiveLengthMeasure;
	CrossSectionArea : OPTIONAL IfcAreaMeasure;
 WHERE
	WR1 : NOT(EXISTS(CrossSectionArea)) OR (CrossSectionArea > 0.);
END_ENTITY;

ENTITY IfcGeometricCurveSet
 SUBTYPE OF (IfcGeometricSet);
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcGeometricSet.Elements |
            'IFC2X3.IFCSURFACE' IN TYPEOF(Temp))) = 0;
END_ENTITY;

ENTITY IfcGeometricRepresentationContext
 SUPERTYPE OF (ONEOF
	(IfcGeometricRepresentationSubContext))
 SUBTYPE OF (IfcRepresentationContext);
	CoordinateSpaceDimension : IfcDimensionCount;
	Precision : OPTIONAL REAL;
	WorldCoordinateSystem : IfcAxis2Placement;
	TrueNorth : OPTIONAL IfcDirection;
 INVERSE
	HasSubContexts : SET [0:?] OF IfcGeometricRepresentationSubContext FOR ParentContext;
END_ENTITY;

ENTITY IfcGeometricRepresentationItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAnnotationFillArea
	,IfcAnnotationSurface
	,IfcBooleanResult
	,IfcBoundingBox
	,IfcCartesianTransformationOperator
	,IfcCompositeCurveSegment
	,IfcCsgPrimitive3D
	,IfcCurve
	,IfcDefinedSymbol
	,IfcDirection
	,IfcDraughtingCallout
	,IfcFaceBasedSurfaceModel
	,IfcFillAreaStyleHatching
	,IfcFillAreaStyleTileSymbolWithStyle
	,IfcFillAreaStyleTiles
	,IfcGeometricSet
	,IfcHalfSpaceSolid
	,IfcLightSource
	,IfcOneDirectionRepeatFactor
	,IfcPlacement
	,IfcPlanarExtent
	,IfcPoint
	,IfcSectionedSpine
	,IfcShellBasedSurfaceModel
	,IfcSolidModel
	,IfcSurface
	,IfcTextLiteral
	,IfcVector))
 SUBTYPE OF (IfcRepresentationItem);
END_ENTITY;

ENTITY IfcGeometricRepresentationSubContext
 SUBTYPE OF (IfcGeometricRepresentationContext);
	ParentContext : IfcGeometricRepresentationContext;
	TargetScale : OPTIONAL IfcPositiveRatioMeasure;
	TargetView : IfcGeometricProjectionEnum;
	UserDefinedTargetView : OPTIONAL IfcLabel;
 DERIVE
	SELF\IfcGeometricRepresentationContext.WorldCoordinateSystem : IfcAxis2Placement := ParentContext.WorldCoordinateSystem;
	SELF\IfcGeometricRepresentationContext.CoordinateSpaceDimension : IfcDimensionCount := ParentContext.CoordinateSpaceDimension;
	SELF\IfcGeometricRepresentationContext.TrueNorth : IfcDirection := NVL(ParentContext.TrueNorth,SELF.WorldCoordinateSystem.P[2]);
	SELF\IfcGeometricRepresentationContext.Precision : REAL := NVL(ParentContext.Precision,1.E-5);
 WHERE
	WR31 : NOT('IFC2X3.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(ParentContext));
	WR32 : (TargetView <> IfcGeometricProjectionEnum.USERDEFINED) OR 
             ((TargetView =  IfcGeometricProjectionEnum.USERDEFINED) AND 
              EXISTS(UserDefinedTargetView));
END_ENTITY;

ENTITY IfcGeometricSet
 SUPERTYPE OF (ONEOF
	(IfcGeometricCurveSet))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Elements : SET [1:?] OF IfcGeometricSetSelect;
 DERIVE
	Dim : IfcDimensionCount := Elements[1].Dim;
 WHERE
	WR21 : SIZEOF(QUERY(Temp <* Elements |
               Temp.Dim <> Elements[1].Dim))
             = 0;
END_ENTITY;

ENTITY IfcGrid
 SUBTYPE OF (IfcProduct);
	UAxes : LIST [1:?] OF UNIQUE IfcGridAxis;
	VAxes : LIST [1:?] OF UNIQUE IfcGridAxis;
	WAxes : OPTIONAL LIST [1:?] OF UNIQUE IfcGridAxis;
 INVERSE
	ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
 WHERE
	WR41 : EXISTS(SELF\IfcProduct.ObjectPlacement);
END_ENTITY;

ENTITY IfcGridAxis;
	AxisTag : OPTIONAL IfcLabel;
	AxisCurve : IfcCurve;
	SameSense : IfcBoolean;
 INVERSE
	PartOfW : SET [0:1] OF IfcGrid FOR WAxes;
	PartOfV : SET [0:1] OF IfcGrid FOR VAxes;
	PartOfU : SET [0:1] OF IfcGrid FOR UAxes;
	HasIntersections : SET [0:?] OF IfcVirtualGridIntersection FOR IntersectingAxes;
 WHERE
	WR1 : AxisCurve.Dim = 2;
	WR2 : (SIZEOF(PartOfU) = 1) XOR (SIZEOF(PartOfV) = 1) XOR (SIZEOF(PartOfW) = 1);
END_ENTITY;

ENTITY IfcGridPlacement
 SUBTYPE OF (IfcObjectPlacement);
	PlacementLocation : IfcVirtualGridIntersection;
	PlacementRefDirection : OPTIONAL IfcVirtualGridIntersection;
END_ENTITY;

ENTITY IfcGroup
 SUPERTYPE OF (ONEOF
	(IfcAsset
	,IfcCondition
	,IfcInventory
	,IfcStructuralLoadGroup
	,IfcStructuralResultGroup
	,IfcSystem
	,IfcZone))
 SUBTYPE OF (IfcObject);
 INVERSE
	IsGroupedBy : IfcRelAssignsToGroup FOR RelatingGroup;
END_ENTITY;

ENTITY IfcHalfSpaceSolid
 SUPERTYPE OF (ONEOF
	(IfcBoxedHalfSpace
	,IfcPolygonalBoundedHalfSpace))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	BaseSurface : IfcSurface;
	AgreementFlag : BOOLEAN;
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcHeatExchangerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcHeatExchangerTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcHeatExchangerTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcHeatExchangerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcHumidifierType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcHumidifierTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcHumidifierTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcHumidifierTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcHygroscopicMaterialProperties
 SUBTYPE OF (IfcMaterialProperties);
	UpperVaporResistanceFactor : OPTIONAL IfcPositiveRatioMeasure;
	LowerVaporResistanceFactor : OPTIONAL IfcPositiveRatioMeasure;
	IsothermalMoistureCapacity : OPTIONAL IfcIsothermalMoistureCapacityMeasure;
	VaporPermeability : OPTIONAL IfcVaporPermeabilityMeasure;
	MoistureDiffusivity : OPTIONAL IfcMoistureDiffusivityMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcIShapeProfileDef
 SUPERTYPE OF (ONEOF
	(IfcAsymmetricIShapeProfileDef))
 SUBTYPE OF (IfcParameterizedProfileDef);
	OverallWidth : IfcPositiveLengthMeasure;
	OverallDepth : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	FlangeThickness : IfcPositiveLengthMeasure;
	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR1 : FlangeThickness < (OverallDepth / 2.);
	WR2 : WebThickness < OverallWidth;
	WR3 : NOT(EXISTS(FilletRadius)) OR
            ((FilletRadius <= (OverallWidth - WebThickness)/2.) AND 
             (FilletRadius <= (OverallDepth - (2. * FlangeThickness))/2.));
END_ENTITY;

ENTITY IfcImageTexture
 SUBTYPE OF (IfcSurfaceTexture);
	UrlReference : IfcIdentifier;
END_ENTITY;

ENTITY IfcInventory
 SUBTYPE OF (IfcGroup);
	InventoryType : IfcInventoryTypeEnum;
	Jurisdiction : IfcActorSelect;
	ResponsiblePersons : SET [1:?] OF IfcPerson;
	LastUpdateDate : IfcCalendarDate;
	CurrentValue : OPTIONAL IfcCostValue;
	OriginalValue : OPTIONAL IfcCostValue;
 WHERE
	WR41 : SIZEOF(QUERY(temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects |
                 NOT( ('IFC2X3.IFCSPACE' IN TYPEOF (temp)) OR 
                      ('IFC2X3.IFCASSET' IN TYPEOF (temp)) OR
                      ('IFC2X3.IFCFURNISHINGELEMENT' IN TYPEOF (temp))
                 ))) = 0;
END_ENTITY;

ENTITY IfcIrregularTimeSeries
 SUBTYPE OF (IfcTimeSeries);
	Values : LIST [1:?] OF IfcIrregularTimeSeriesValue;
END_ENTITY;

ENTITY IfcIrregularTimeSeriesValue;
	TimeStamp : IfcDateTimeSelect;
	ListValues : LIST [1:?] OF IfcValue;
END_ENTITY;

ENTITY IfcJunctionBoxType
 SUBTYPE OF (IfcFlowFittingType);
	PredefinedType : IfcJunctionBoxTypeEnum;
END_ENTITY;

ENTITY IfcLShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	Depth : IfcPositiveLengthMeasure;
	Width : OPTIONAL IfcPositiveLengthMeasure;
	Thickness : IfcPositiveLengthMeasure;
	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
	LegSlope : OPTIONAL IfcPlaneAngleMeasure;
	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR21 : Thickness < Depth;
	WR22 : NOT(EXISTS(Width)) OR (Thickness < Width);
END_ENTITY;

ENTITY IfcLaborResource
 SUBTYPE OF (IfcConstructionResource);
	SkillSet : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcLampType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcLampTypeEnum;
END_ENTITY;

ENTITY IfcLibraryInformation;
	Name : IfcLabel;
	Version : OPTIONAL IfcLabel;
	Publisher : OPTIONAL IfcOrganization;
	VersionDate : OPTIONAL IfcCalendarDate;
	LibraryReference : OPTIONAL SET [1:?] OF IfcLibraryReference;
END_ENTITY;

ENTITY IfcLibraryReference
 SUBTYPE OF (IfcExternalReference);
 INVERSE
	ReferenceIntoLibrary : SET [0:1] OF IfcLibraryInformation FOR LibraryReference;
END_ENTITY;

ENTITY IfcLightDistributionData;
	MainPlaneAngle : IfcPlaneAngleMeasure;
	SecondaryPlaneAngle : LIST [1:?] OF IfcPlaneAngleMeasure;
	LuminousIntensity : LIST [1:?] OF IfcLuminousIntensityDistributionMeasure;
END_ENTITY;

ENTITY IfcLightFixtureType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcLightFixtureTypeEnum;
END_ENTITY;

ENTITY IfcLightIntensityDistribution;
	LightDistributionCurve : IfcLightDistributionCurveEnum;
	DistributionData : LIST [1:?] OF IfcLightDistributionData;
END_ENTITY;

ENTITY IfcLightSource
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcLightSourceAmbient
	,IfcLightSourceDirectional
	,IfcLightSourceGoniometric
	,IfcLightSourcePositional))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Name : OPTIONAL IfcLabel;
	LightColour : IfcColourRgb;
	AmbientIntensity : OPTIONAL IfcNormalisedRatioMeasure;
	Intensity : OPTIONAL IfcNormalisedRatioMeasure;
END_ENTITY;

ENTITY IfcLightSourceAmbient
 SUBTYPE OF (IfcLightSource);
END_ENTITY;

ENTITY IfcLightSourceDirectional
 SUBTYPE OF (IfcLightSource);
	Orientation : IfcDirection;
END_ENTITY;

ENTITY IfcLightSourceGoniometric
 SUBTYPE OF (IfcLightSource);
	Position : IfcAxis2Placement3D;
	ColourAppearance : OPTIONAL IfcColourRgb;
	ColourTemperature : IfcThermodynamicTemperatureMeasure;
	LuminousFlux : IfcLuminousFluxMeasure;
	LightEmissionSource : IfcLightEmissionSourceEnum;
	LightDistributionDataSource : IfcLightDistributionDataSourceSelect;
END_ENTITY;

ENTITY IfcLightSourcePositional
 SUPERTYPE OF (ONEOF
	(IfcLightSourceSpot))
 SUBTYPE OF (IfcLightSource);
	Position : IfcCartesianPoint;
	Radius : IfcPositiveLengthMeasure;
	ConstantAttenuation : IfcReal;
	DistanceAttenuation : IfcReal;
	QuadricAttenuation : IfcReal;
END_ENTITY;

ENTITY IfcLightSourceSpot
 SUBTYPE OF (IfcLightSourcePositional);
	Orientation : IfcDirection;
	ConcentrationExponent : OPTIONAL IfcReal;
	SpreadAngle : IfcPositivePlaneAngleMeasure;
	BeamWidthAngle : IfcPositivePlaneAngleMeasure;
END_ENTITY;

ENTITY IfcLine
 SUBTYPE OF (IfcCurve);
	Pnt : IfcCartesianPoint;
	Dir : IfcVector;
 WHERE
	WR1 : Dir.Dim = Pnt.Dim;
END_ENTITY;

ENTITY IfcLinearDimension
 SUBTYPE OF (IfcDimensionCurveDirectedCallout);
END_ENTITY;

ENTITY IfcLocalPlacement
 SUBTYPE OF (IfcObjectPlacement);
	PlacementRelTo : OPTIONAL IfcObjectPlacement;
	RelativePlacement : IfcAxis2Placement;
 WHERE
	WR21 : IfcCorrectLocalPlacement(RelativePlacement, PlacementRelTo);
END_ENTITY;

ENTITY IfcLocalTime;
	HourComponent : IfcHourInDay;
	MinuteComponent : OPTIONAL IfcMinuteInHour;
	SecondComponent : OPTIONAL IfcSecondInMinute;
	Zone : OPTIONAL IfcCoordinatedUniversalTimeOffset;
	DaylightSavingOffset : OPTIONAL IfcDaylightSavingHour;
 WHERE
	WR21 : IfcValidTime (SELF);
END_ENTITY;

ENTITY IfcLoop
 SUPERTYPE OF (ONEOF
	(IfcEdgeLoop
	,IfcPolyLoop
	,IfcVertexLoop))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
END_ENTITY;

ENTITY IfcManifoldSolidBrep
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcFacetedBrep
	,IfcFacetedBrepWithVoids))
 SUBTYPE OF (IfcSolidModel);
	Outer : IfcClosedShell;
END_ENTITY;

ENTITY IfcMappedItem
 SUBTYPE OF (IfcRepresentationItem);
	MappingSource : IfcRepresentationMap;
	MappingTarget : IfcCartesianTransformationOperator;
END_ENTITY;

ENTITY IfcMaterial;
	Name : IfcLabel;
 INVERSE
	HasRepresentation : SET [0:1] OF IfcMaterialDefinitionRepresentation FOR RepresentedMaterial;
	ClassifiedAs : SET [0:1] OF IfcMaterialClassificationRelationship FOR ClassifiedMaterial;
END_ENTITY;

ENTITY IfcMaterialClassificationRelationship;
	MaterialClassifications : SET [1:?] OF IfcClassificationNotationSelect;
	ClassifiedMaterial : IfcMaterial;
END_ENTITY;

ENTITY IfcMaterialDefinitionRepresentation
 SUBTYPE OF (IfcProductRepresentation);
	RepresentedMaterial : IfcMaterial;
 WHERE
	WR11 : SIZEOF(QUERY(temp <* Representations | 
               (NOT('IFC2X3.IFCSTYLEDREPRESENTATION' IN TYPEOF(temp)))
             )) = 0;
END_ENTITY;

ENTITY IfcMaterialLayer;
	Material : OPTIONAL IfcMaterial;
	LayerThickness : IfcPositiveLengthMeasure;
	IsVentilated : OPTIONAL IfcLogical;
 INVERSE
	ToMaterialLayerSet : IfcMaterialLayerSet FOR MaterialLayers;
END_ENTITY;

ENTITY IfcMaterialLayerSet;
	MaterialLayers : LIST [1:?] OF IfcMaterialLayer;
	LayerSetName : OPTIONAL IfcLabel;
 DERIVE
	TotalThickness : IfcLengthMeasure := IfcMlsTotalThickness(SELF);
END_ENTITY;

ENTITY IfcMaterialLayerSetUsage;
	ForLayerSet : IfcMaterialLayerSet;
	LayerSetDirection : IfcLayerSetDirectionEnum;
	DirectionSense : IfcDirectionSenseEnum;
	OffsetFromReferenceLine : IfcLengthMeasure;
END_ENTITY;

ENTITY IfcMaterialList;
	Materials : LIST [1:?] OF IfcMaterial;
END_ENTITY;

ENTITY IfcMaterialProperties
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcExtendedMaterialProperties
	,IfcFuelProperties
	,IfcGeneralMaterialProperties
	,IfcHygroscopicMaterialProperties
	,IfcMechanicalMaterialProperties
	,IfcOpticalMaterialProperties
	,IfcProductsOfCombustionProperties
	,IfcThermalMaterialProperties
	,IfcWaterProperties));
	Material : IfcMaterial;
END_ENTITY;

ENTITY IfcMeasureWithUnit;
	ValueComponent : IfcValue;
	UnitComponent : IfcUnit;
END_ENTITY;

ENTITY IfcMechanicalConcreteMaterialProperties
 SUBTYPE OF (IfcMechanicalMaterialProperties);
	CompressiveStrength : OPTIONAL IfcPressureMeasure;
	MaxAggregateSize : OPTIONAL IfcPositiveLengthMeasure;
	AdmixturesDescription : OPTIONAL IfcText;
	Workability : OPTIONAL IfcText;
	ProtectivePoreRatio : OPTIONAL IfcNormalisedRatioMeasure;
	WaterImpermeability : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcMechanicalFastener
 SUBTYPE OF (IfcFastener);
	NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
	NominalLength : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcMechanicalFastenerType
 SUBTYPE OF (IfcFastenerType);
END_ENTITY;

ENTITY IfcMechanicalMaterialProperties
 SUPERTYPE OF (ONEOF
	(IfcMechanicalConcreteMaterialProperties
	,IfcMechanicalSteelMaterialProperties))
 SUBTYPE OF (IfcMaterialProperties);
	DynamicViscosity : OPTIONAL IfcDynamicViscosityMeasure;
	YoungModulus : OPTIONAL IfcModulusOfElasticityMeasure;
	ShearModulus : OPTIONAL IfcModulusOfElasticityMeasure;
	PoissonRatio : OPTIONAL IfcPositiveRatioMeasure;
	ThermalExpansionCoefficient : OPTIONAL IfcThermalExpansionCoefficientMeasure;
 UNIQUE
	UR11 : Material;
 WHERE
	WR21 : NOT(EXISTS(YoungModulus)) OR (YoungModulus >= 0.0);
	WR22 : NOT(EXISTS(ShearModulus)) OR (ShearModulus >= 0.0);
END_ENTITY;

ENTITY IfcMechanicalSteelMaterialProperties
 SUBTYPE OF (IfcMechanicalMaterialProperties);
	YieldStress : OPTIONAL IfcPressureMeasure;
	UltimateStress : OPTIONAL IfcPressureMeasure;
	UltimateStrain : OPTIONAL IfcPositiveRatioMeasure;
	HardeningModule : OPTIONAL IfcModulusOfElasticityMeasure;
	ProportionalStress : OPTIONAL IfcPressureMeasure;
	PlasticStrain : OPTIONAL IfcPositiveRatioMeasure;
	Relaxations : OPTIONAL SET [1:?] OF IfcRelaxation;
 WHERE
	WR31 : NOT(EXISTS(YieldStress)) OR (YieldStress >= 0.);
	WR32 : NOT(EXISTS(UltimateStress)) OR (UltimateStress >= 0.);
	WR33 : NOT(EXISTS(HardeningModule)) OR (HardeningModule >= 0.);
	WR34 : NOT(EXISTS(ProportionalStress)) OR (ProportionalStress >= 0.);
END_ENTITY;

ENTITY IfcMember
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcMemberType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcMemberTypeEnum;
END_ENTITY;

ENTITY IfcMetric
 SUBTYPE OF (IfcConstraint);
	Benchmark : IfcBenchmarkEnum;
	ValueSource : OPTIONAL IfcLabel;
	DataValue : IfcMetricValueSelect;
END_ENTITY;

ENTITY IfcMonetaryUnit;
	Currency : IfcCurrencyEnum;
END_ENTITY;

ENTITY IfcMotorConnectionType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcMotorConnectionTypeEnum;
END_ENTITY;

ENTITY IfcMove
 SUBTYPE OF (IfcTask);
	MoveFrom : IfcSpatialStructureElement;
	MoveTo : IfcSpatialStructureElement;
	PunchList : OPTIONAL LIST [1:?] OF UNIQUE IfcText;
 WHERE
	WR1 : SIZEOF(SELF\IfcProcess.OperatesOn) >= 1;
	WR2 : SIZEOF(QUERY(temp <* OperatesOn |
              SIZEOF(QUERY(temp2 <* temp.RelatedObjects |
                ('IFC2X3.IFCACTOR' IN TYPEOF (temp2)) OR
                ('IFC2X3.IFCEQUIPMENTELEMENT' IN TYPEOF (temp2)) OR
                ('IFC2X3.IFCFURNISHINGELEMENT' IN TYPEOF (temp2)) )) >=1
              )) >= 1;
	WR3 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcNamedUnit
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcContextDependentUnit
	,IfcConversionBasedUnit
	,IfcSIUnit));
	Dimensions : IfcDimensionalExponents;
	UnitType : IfcUnitEnum;
 WHERE
	WR1 : IfcCorrectDimensions (SELF.UnitType, SELF.Dimensions);
END_ENTITY;

ENTITY IfcObject
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcActor
	,IfcControl
	,IfcGroup
	,IfcProcess
	,IfcProduct
	,IfcProject
	,IfcResource))
 SUBTYPE OF (IfcObjectDefinition);
	ObjectType : OPTIONAL IfcLabel;
 INVERSE
	IsDefinedBy : SET [0:?] OF IfcRelDefines FOR RelatedObjects;
 WHERE
	WR1 : SIZEOF(QUERY(temp <* IsDefinedBy | 'IFC2X3.IFCRELDEFINESBYTYPE' IN TYPEOF(temp))) <= 1;
END_ENTITY;

ENTITY IfcObjectDefinition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcObject
	,IfcTypeObject))
 SUBTYPE OF (IfcRoot);
 INVERSE
	HasAssignments : SET [0:?] OF IfcRelAssigns FOR RelatedObjects;
	IsDecomposedBy : SET [0:?] OF IfcRelDecomposes FOR RelatingObject;
	Decomposes : SET [0:1] OF IfcRelDecomposes FOR RelatedObjects;
	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
END_ENTITY;

ENTITY IfcObjectPlacement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcGridPlacement
	,IfcLocalPlacement));
 INVERSE
	PlacesObject : SET [1:1] OF IfcProduct FOR ObjectPlacement;
	ReferencedByPlacements : SET [0:?] OF IfcLocalPlacement FOR PlacementRelTo;
END_ENTITY;

ENTITY IfcObjective
 SUBTYPE OF (IfcConstraint);
	BenchmarkValues : OPTIONAL IfcMetric;
	ResultValues : OPTIONAL IfcMetric;
	ObjectiveQualifier : IfcObjectiveEnum;
	UserDefinedQualifier : OPTIONAL IfcLabel;
 WHERE
	WR21 : (ObjectiveQualifier <> IfcObjectiveEnum.USERDEFINED) OR
             ((ObjectiveQualifier = IfcObjectiveEnum.USERDEFINED) AND EXISTS(SELF\IfcObjective.UserDefinedQualifier));
END_ENTITY;

ENTITY IfcOccupant
 SUBTYPE OF (IfcActor);
	PredefinedType : IfcOccupantTypeEnum;
 WHERE
	WR31 : NOT(PredefinedType = IfcOccupantTypeEnum.USERDEFINED) 
             OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcOffsetCurve2D
 SUBTYPE OF (IfcCurve);
	BasisCurve : IfcCurve;
	Distance : IfcLengthMeasure;
	SelfIntersect : LOGICAL;
 WHERE
	WR1 : BasisCurve.Dim = 2;
END_ENTITY;

ENTITY IfcOffsetCurve3D
 SUBTYPE OF (IfcCurve);
	BasisCurve : IfcCurve;
	Distance : IfcLengthMeasure;
	SelfIntersect : LOGICAL;
	RefDirection : IfcDirection;
 WHERE
	WR1 : BasisCurve.Dim = 3;
END_ENTITY;

ENTITY IfcOneDirectionRepeatFactor
 SUPERTYPE OF (ONEOF
	(IfcTwoDirectionRepeatFactor))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	RepeatFactor : IfcVector;
END_ENTITY;

ENTITY IfcOpenShell
 SUBTYPE OF (IfcConnectedFaceSet);
END_ENTITY;

ENTITY IfcOpeningElement
 SUBTYPE OF (IfcFeatureElementSubtraction);
 INVERSE
	HasFillings : SET [0:?] OF IfcRelFillsElement FOR RelatingOpeningElement;
END_ENTITY;

ENTITY IfcOpticalMaterialProperties
 SUBTYPE OF (IfcMaterialProperties);
	VisibleTransmittance : OPTIONAL IfcPositiveRatioMeasure;
	SolarTransmittance : OPTIONAL IfcPositiveRatioMeasure;
	ThermalIrTransmittance : OPTIONAL IfcPositiveRatioMeasure;
	ThermalIrEmissivityBack : OPTIONAL IfcPositiveRatioMeasure;
	ThermalIrEmissivityFront : OPTIONAL IfcPositiveRatioMeasure;
	VisibleReflectanceBack : OPTIONAL IfcPositiveRatioMeasure;
	VisibleReflectanceFront : OPTIONAL IfcPositiveRatioMeasure;
	SolarReflectanceFront : OPTIONAL IfcPositiveRatioMeasure;
	SolarReflectanceBack : OPTIONAL IfcPositiveRatioMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcOrderAction
 SUBTYPE OF (IfcTask);
	ActionID : IfcIdentifier;
 UNIQUE
	UR2 : ActionID;
END_ENTITY;

ENTITY IfcOrganization;
	Id : OPTIONAL IfcIdentifier;
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
	Addresses : OPTIONAL LIST [1:?] OF IfcAddress;
 INVERSE
	IsRelatedBy : SET [0:?] OF IfcOrganizationRelationship FOR RelatedOrganizations;
	Relates : SET [0:?] OF IfcOrganizationRelationship FOR RelatingOrganization;
	Engages : SET [0:?] OF IfcPersonAndOrganization FOR TheOrganization;
END_ENTITY;

ENTITY IfcOrganizationRelationship;
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	RelatingOrganization : IfcOrganization;
	RelatedOrganizations : SET [1:?] OF IfcOrganization;
END_ENTITY;

ENTITY IfcOrientedEdge
 SUBTYPE OF (IfcEdge);
	EdgeElement : IfcEdge;
	Orientation : BOOLEAN;
 DERIVE
	SELF\IfcEdge.EdgeStart : IfcVertex := IfcBooleanChoose 
                               (Orientation, EdgeElement.EdgeStart, EdgeElement.EdgeEnd);
	SELF\IfcEdge.EdgeEnd : IfcVertex := IfcBooleanChoose 
                               (Orientation, EdgeElement.EdgeEnd, EdgeElement.EdgeStart);
 WHERE
	WR1 : NOT('IFC2X3.IFCORIENTEDEDGE' IN TYPEOF(EdgeElement));
END_ENTITY;

ENTITY IfcOutletType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcOutletTypeEnum;
END_ENTITY;

ENTITY IfcOwnerHistory;
	OwningUser : IfcPersonAndOrganization;
	OwningApplication : IfcApplication;
	State : OPTIONAL IfcStateEnum;
	ChangeAction : IfcChangeActionEnum;
	LastModifiedDate : OPTIONAL IfcTimeStamp;
	LastModifyingUser : OPTIONAL IfcPersonAndOrganization;
	LastModifyingApplication : OPTIONAL IfcApplication;
	CreationDate : IfcTimeStamp;
END_ENTITY;

ENTITY IfcParameterizedProfileDef
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCShapeProfileDef
	,IfcCircleProfileDef
	,IfcCraneRailAShapeProfileDef
	,IfcCraneRailFShapeProfileDef
	,IfcEllipseProfileDef
	,IfcIShapeProfileDef
	,IfcLShapeProfileDef
	,IfcRectangleProfileDef
	,IfcTShapeProfileDef
	,IfcTrapeziumProfileDef
	,IfcUShapeProfileDef
	,IfcZShapeProfileDef))
 SUBTYPE OF (IfcProfileDef);
	Position : IfcAxis2Placement2D;
END_ENTITY;

ENTITY IfcPath
 SUBTYPE OF (IfcTopologicalRepresentationItem);
	EdgeList : LIST [1:?] OF UNIQUE IfcOrientedEdge;
 WHERE
	WR1 : IfcPathHeadToTail(SELF);
END_ENTITY;

ENTITY IfcPerformanceHistory
 SUBTYPE OF (IfcControl);
	LifeCyclePhase : IfcLabel;
END_ENTITY;

ENTITY IfcPermeableCoveringProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	OperationType : IfcPermeableCoveringOperationEnum;
	PanelPosition : IfcWindowPanelPositionEnum;
	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
END_ENTITY;

ENTITY IfcPermit
 SUBTYPE OF (IfcControl);
	PermitID : IfcIdentifier;
 UNIQUE
	UR2 : PermitID;
END_ENTITY;

ENTITY IfcPerson;
	Id : OPTIONAL IfcIdentifier;
	FamilyName : OPTIONAL IfcLabel;
	GivenName : OPTIONAL IfcLabel;
	MiddleNames : OPTIONAL LIST [1:?] OF IfcLabel;
	PrefixTitles : OPTIONAL LIST [1:?] OF IfcLabel;
	SuffixTitles : OPTIONAL LIST [1:?] OF IfcLabel;
	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
	Addresses : OPTIONAL LIST [1:?] OF IfcAddress;
 INVERSE
	EngagedIn : SET [0:?] OF IfcPersonAndOrganization FOR ThePerson;
 WHERE
	WR1 : EXISTS(FamilyName) OR 
            EXISTS(GivenName);
END_ENTITY;

ENTITY IfcPersonAndOrganization;
	ThePerson : IfcPerson;
	TheOrganization : IfcOrganization;
	Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
END_ENTITY;

ENTITY IfcPhysicalComplexQuantity
 SUBTYPE OF (IfcPhysicalQuantity);
	HasQuantities : SET [1:?] OF IfcPhysicalQuantity;
	Discrimination : IfcLabel;
	Quality : OPTIONAL IfcLabel;
	Usage : OPTIONAL IfcLabel;
 WHERE
	WR21 : SIZEOF(QUERY(temp <* HasQuantities | SELF :=: temp)) = 0;
END_ENTITY;

ENTITY IfcPhysicalQuantity
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPhysicalComplexQuantity
	,IfcPhysicalSimpleQuantity));
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
 INVERSE
	PartOfComplex : SET [0:1] OF IfcPhysicalComplexQuantity FOR HasQuantities;
END_ENTITY;

ENTITY IfcPhysicalSimpleQuantity
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcQuantityArea
	,IfcQuantityCount
	,IfcQuantityLength
	,IfcQuantityTime
	,IfcQuantityVolume
	,IfcQuantityWeight))
 SUBTYPE OF (IfcPhysicalQuantity);
	Unit : OPTIONAL IfcNamedUnit;
END_ENTITY;

ENTITY IfcPile
 SUBTYPE OF (IfcBuildingElement);
	PredefinedType : IfcPileTypeEnum;
	ConstructionType : OPTIONAL IfcPileConstructionEnum;
 WHERE
	WR1 : (PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcPipeFittingType
 SUBTYPE OF (IfcFlowFittingType);
	PredefinedType : IfcPipeFittingTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcPipeFittingTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcPipeFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcPipeSegmentType
 SUBTYPE OF (IfcFlowSegmentType);
	PredefinedType : IfcPipeSegmentTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcPipeSegmentTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcPipeSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcPixelTexture
 SUBTYPE OF (IfcSurfaceTexture);
	Width : IfcInteger;
	Height : IfcInteger;
	ColourComponents : IfcInteger;
	Pixel : LIST [1:?] OF BINARY(32);
 WHERE
	WR21 : Width >= 1;
	WR22 : Height >= 1;
	WR23 : {1 <= ColourComponents <= 4};
	WR24 : SIZEOF(Pixel) = (Width * Height);
END_ENTITY;

ENTITY IfcPlacement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAxis1Placement
	,IfcAxis2Placement2D
	,IfcAxis2Placement3D))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Location : IfcCartesianPoint;
 DERIVE
	Dim : IfcDimensionCount := Location.Dim;
END_ENTITY;

ENTITY IfcPlanarBox
 SUBTYPE OF (IfcPlanarExtent);
	Placement : IfcAxis2Placement;
END_ENTITY;

ENTITY IfcPlanarExtent
 SUPERTYPE OF (ONEOF
	(IfcPlanarBox))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	SizeInX : IfcLengthMeasure;
	SizeInY : IfcLengthMeasure;
END_ENTITY;

ENTITY IfcPlane
 SUBTYPE OF (IfcElementarySurface);
END_ENTITY;

ENTITY IfcPlate
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcPlateType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcPlateTypeEnum;
 WHERE
	WR1 : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations | 'IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp) )) = 1;
END_ENTITY;

ENTITY IfcPoint
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCartesianPoint
	,IfcPointOnCurve
	,IfcPointOnSurface))
 SUBTYPE OF (IfcGeometricRepresentationItem);
END_ENTITY;

ENTITY IfcPointOnCurve
 SUBTYPE OF (IfcPoint);
	BasisCurve : IfcCurve;
	PointParameter : IfcParameterValue;
 DERIVE
	Dim : IfcDimensionCount := BasisCurve.Dim;
END_ENTITY;

ENTITY IfcPointOnSurface
 SUBTYPE OF (IfcPoint);
	BasisSurface : IfcSurface;
	PointParameterU : IfcParameterValue;
	PointParameterV : IfcParameterValue;
 DERIVE
	Dim : IfcDimensionCount := BasisSurface.Dim;
END_ENTITY;

ENTITY IfcPolyLoop
 SUBTYPE OF (IfcLoop);
	Polygon : LIST [3:?] OF UNIQUE IfcCartesianPoint;
 WHERE
	WR21 : SIZEOF(QUERY(Temp <* Polygon | Temp.Dim <> Polygon[1].Dim)) = 0;
END_ENTITY;

ENTITY IfcPolygonalBoundedHalfSpace
 SUBTYPE OF (IfcHalfSpaceSolid);
	Position : IfcAxis2Placement3D;
	PolygonalBoundary : IfcBoundedCurve;
 WHERE
	WR41 : PolygonalBoundary.Dim = 2;
	WR42 : SIZEOF(TYPEOF(PolygonalBoundary) * [
               'IFC2X3.IFCPOLYLINE', 
               'IFC2X3.IFCCOMPOSITECURVE']
             ) = 1;
END_ENTITY;

ENTITY IfcPolyline
 SUBTYPE OF (IfcBoundedCurve);
	Points : LIST [2:?] OF IfcCartesianPoint;
 WHERE
	WR41 : SIZEOF(QUERY(Temp <* Points | Temp.Dim <> Points[1].Dim)) = 0;
END_ENTITY;

ENTITY IfcPort
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDistributionPort))
 SUBTYPE OF (IfcProduct);
 INVERSE
	ContainedIn : IfcRelConnectsPortToElement FOR RelatingPort;
	ConnectedFrom : SET [0:1] OF IfcRelConnectsPorts FOR RelatedPort;
	ConnectedTo : SET [0:1] OF IfcRelConnectsPorts FOR RelatingPort;
END_ENTITY;

ENTITY IfcPostalAddress
 SUBTYPE OF (IfcAddress);
	InternalLocation : OPTIONAL IfcLabel;
	AddressLines : OPTIONAL LIST [1:?] OF IfcLabel;
	PostalBox : OPTIONAL IfcLabel;
	Town : OPTIONAL IfcLabel;
	Region : OPTIONAL IfcLabel;
	PostalCode : OPTIONAL IfcLabel;
	Country : OPTIONAL IfcLabel;
 WHERE
	WR1 : EXISTS (InternalLocation) OR 
            EXISTS (AddressLines) OR
            EXISTS (PostalBox) OR
            EXISTS (PostalCode) OR
            EXISTS (Town) OR 
            EXISTS (Region) OR  
            EXISTS (Country);
END_ENTITY;

ENTITY IfcPreDefinedColour
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDraughtingPreDefinedColour))
 SUBTYPE OF (IfcPreDefinedItem);
END_ENTITY;

ENTITY IfcPreDefinedCurveFont
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDraughtingPreDefinedCurveFont))
 SUBTYPE OF (IfcPreDefinedItem);
END_ENTITY;

ENTITY IfcPreDefinedDimensionSymbol
 SUBTYPE OF (IfcPreDefinedSymbol);
 WHERE
	WR31 : SELF\IfcPreDefinedItem.Name IN ['arc length','conical taper','counterbore',
                  'countersink','depth','diameter','plus minus','radius',
                  'slope','spherical diameter','spherical radius','square'];
END_ENTITY;

ENTITY IfcPreDefinedItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPreDefinedColour
	,IfcPreDefinedCurveFont
	,IfcPreDefinedSymbol
	,IfcPreDefinedTextFont));
	Name : IfcLabel;
END_ENTITY;

ENTITY IfcPreDefinedPointMarkerSymbol
 SUBTYPE OF (IfcPreDefinedSymbol);
 WHERE
	WR31 : SELF\IfcPreDefinedItem.Name IN ['asterisk','circle','dot','plus','square','triangle','x'];
END_ENTITY;

ENTITY IfcPreDefinedSymbol
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPreDefinedDimensionSymbol
	,IfcPreDefinedPointMarkerSymbol
	,IfcPreDefinedTerminatorSymbol))
 SUBTYPE OF (IfcPreDefinedItem);
END_ENTITY;

ENTITY IfcPreDefinedTerminatorSymbol
 SUBTYPE OF (IfcPreDefinedSymbol);
 WHERE
	WR31 : SELF\IfcPreDefinedItem.Name IN ['blanked arrow','blanked box',
                 'blanked dot','dimension origin','filled arrow','filled box',
                 'filled dot','integral symbol','open arrow','slash','unfilled arrow'];
END_ENTITY;

ENTITY IfcPreDefinedTextFont
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDraughtingPreDefinedTextFont
	,IfcTextStyleFontModel))
 SUBTYPE OF (IfcPreDefinedItem);
END_ENTITY;

ENTITY IfcPresentationLayerAssignment
 SUPERTYPE OF (ONEOF
	(IfcPresentationLayerWithStyle));
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	AssignedItems : SET [1:?] OF IfcLayeredItem;
	Identifier : OPTIONAL IfcIdentifier;
END_ENTITY;

ENTITY IfcPresentationLayerWithStyle
 SUBTYPE OF (IfcPresentationLayerAssignment);
	LayerOn : LOGICAL;
	LayerFrozen : LOGICAL;
	LayerBlocked : LOGICAL;
	LayerStyles : SET [0:?] OF IfcPresentationStyleSelect;
END_ENTITY;

ENTITY IfcPresentationStyle
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCurveStyle
	,IfcFillAreaStyle
	,IfcSurfaceStyle
	,IfcSymbolStyle
	,IfcTextStyle));
	Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcPresentationStyleAssignment;
	Styles : SET [1:?] OF IfcPresentationStyleSelect;
END_ENTITY;

ENTITY IfcProcedure
 SUBTYPE OF (IfcProcess);
	ProcedureID : IfcIdentifier;
	ProcedureType : IfcProcedureTypeEnum;
	UserDefinedProcedureType : OPTIONAL IfcLabel;
 WHERE
	WR1 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.Decomposes | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
	WR2 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.IsDecomposedBy | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
	WR3 : EXISTS(SELF\IfcRoot.Name);
	WR4 : (ProcedureType <> IfcProcedureTypeEnum.USERDEFINED) OR
            ((ProcedureType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcProcedure.UserDefinedProcedureType));
END_ENTITY;

ENTITY IfcProcess
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcProcedure
	,IfcTask))
 SUBTYPE OF (IfcObject);
 INVERSE
	OperatesOn : SET [0:?] OF IfcRelAssignsToProcess FOR RelatingProcess;
	IsSuccessorFrom : SET [0:?] OF IfcRelSequence FOR RelatedProcess;
	IsPredecessorTo : SET [0:?] OF IfcRelSequence FOR RelatingProcess;
END_ENTITY;

ENTITY IfcProduct
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcAnnotation
	,IfcElement
	,IfcGrid
	,IfcPort
	,IfcProxy
	,IfcSpatialStructureElement
	,IfcStructuralActivity
	,IfcStructuralItem))
 SUBTYPE OF (IfcObject);
	ObjectPlacement : OPTIONAL IfcObjectPlacement;
	Representation : OPTIONAL IfcProductRepresentation;
 INVERSE
	ReferencedBy : SET [0:?] OF IfcRelAssignsToProduct FOR RelatingProduct;
 WHERE
	WR1 : (EXISTS(Representation) AND EXISTS(ObjectPlacement))
                        OR (EXISTS(Representation) AND 
                           (NOT('IFC2X3.IFCPRODUCTDEFINITIONSHAPE' IN TYPEOF(Representation))))
                        OR (NOT(EXISTS(Representation)));
END_ENTITY;

ENTITY IfcProductDefinitionShape
 SUBTYPE OF (IfcProductRepresentation);
 INVERSE
	ShapeOfProduct : SET [1:1] OF IfcProduct FOR Representation;
	HasShapeAspects : SET [0:?] OF IfcShapeAspect FOR PartOfProductDefinitionShape;
 WHERE
	WR11 : SIZEOF(QUERY(temp <* Representations | 
               (NOT('IFC2X3.IFCSHAPEMODEL' IN TYPEOF(temp)))
             )) = 0;
END_ENTITY;

ENTITY IfcProductRepresentation
 SUPERTYPE OF (ONEOF
	(IfcMaterialDefinitionRepresentation
	,IfcProductDefinitionShape));
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	Representations : LIST [1:?] OF IfcRepresentation;
END_ENTITY;

ENTITY IfcProductsOfCombustionProperties
 SUBTYPE OF (IfcMaterialProperties);
	SpecificHeatCapacity : OPTIONAL IfcSpecificHeatCapacityMeasure;
	N20Content : OPTIONAL IfcPositiveRatioMeasure;
	COContent : OPTIONAL IfcPositiveRatioMeasure;
	CO2Content : OPTIONAL IfcPositiveRatioMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcProfileDef
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcArbitraryClosedProfileDef
	,IfcArbitraryOpenProfileDef
	,IfcCompositeProfileDef
	,IfcDerivedProfileDef
	,IfcParameterizedProfileDef));
	ProfileType : IfcProfileTypeEnum;
	ProfileName : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcProfileProperties
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcGeneralProfileProperties
	,IfcRibPlateProfileProperties));
	ProfileName : OPTIONAL IfcLabel;
	ProfileDefinition : OPTIONAL IfcProfileDef;
END_ENTITY;

ENTITY IfcProject
 SUBTYPE OF (IfcObject);
	LongName : OPTIONAL IfcLabel;
	Phase : OPTIONAL IfcLabel;
	RepresentationContexts : SET [1:?] OF IfcRepresentationContext;
	UnitsInContext : IfcUnitAssignment;
 WHERE
	WR31 : EXISTS(SELF\IfcRoot.Name);
	WR32 : SIZEOF(QUERY(Temp <* RepresentationContexts |
              'IFC2X3.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(Temp)
             )) = 0;
	WR33 : SIZEOF(SELF\IfcObjectDefinition.Decomposes) = 0;
END_ENTITY;

ENTITY IfcProjectOrder
 SUBTYPE OF (IfcControl);
	ID : IfcIdentifier;
	PredefinedType : IfcProjectOrderTypeEnum;
	Status : OPTIONAL IfcLabel;
 UNIQUE
	UR2 : ID;
END_ENTITY;

ENTITY IfcProjectOrderRecord
 SUBTYPE OF (IfcControl);
	Records : LIST [1:?] OF UNIQUE IfcRelAssignsToProjectOrder;
	PredefinedType : IfcProjectOrderRecordTypeEnum;
END_ENTITY;

ENTITY IfcProjectionCurve
 SUBTYPE OF (IfcAnnotationCurveOccurrence);
END_ENTITY;

ENTITY IfcProjectionElement
 SUBTYPE OF (IfcFeatureElementAddition);
END_ENTITY;

ENTITY IfcProperty
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcComplexProperty
	,IfcSimpleProperty));
	Name : IfcIdentifier;
	Description : OPTIONAL IfcText;
 INVERSE
	PropertyForDependance : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependingProperty;
	PropertyDependsOn : SET [0:?] OF IfcPropertyDependencyRelationship FOR DependantProperty;
	PartOfComplex : SET [0:1] OF IfcComplexProperty FOR HasProperties;
END_ENTITY;

ENTITY IfcPropertyBoundedValue
 SUBTYPE OF (IfcSimpleProperty);
	UpperBoundValue : OPTIONAL IfcValue;
	LowerBoundValue : OPTIONAL IfcValue;
	Unit : OPTIONAL IfcUnit;
 WHERE
	WR21 : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(LowerBoundValue)) OR
             (TYPEOF(UpperBoundValue) = TYPEOF(LowerBoundValue));
	WR22 : EXISTS(UpperBoundValue) OR EXISTS(LowerBoundValue);
END_ENTITY;

ENTITY IfcPropertyConstraintRelationship;
	RelatingConstraint : IfcConstraint;
	RelatedProperties : SET [1:?] OF IfcProperty;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcPropertyDefinition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcPropertySetDefinition))
 SUBTYPE OF (IfcRoot);
 INVERSE
	HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
END_ENTITY;

ENTITY IfcPropertyDependencyRelationship;
	DependingProperty : IfcProperty;
	DependantProperty : IfcProperty;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	Expression : OPTIONAL IfcText;
 WHERE
	WR1 : DependingProperty :<>: DependantProperty;
END_ENTITY;

ENTITY IfcPropertyEnumeratedValue
 SUBTYPE OF (IfcSimpleProperty);
	EnumerationValues : LIST [1:?] OF IfcValue;
	EnumerationReference : OPTIONAL IfcPropertyEnumeration;
 WHERE
	WR1 : NOT(EXISTS(EnumerationReference)) OR 
               (SIZEOF(QUERY(temp <* EnumerationValues |
                temp IN EnumerationReference.EnumerationValues))
                = SIZEOF(EnumerationValues));
END_ENTITY;

ENTITY IfcPropertyEnumeration;
	Name : IfcLabel;
	EnumerationValues : LIST [1:?] OF UNIQUE IfcValue;
	Unit : OPTIONAL IfcUnit;
 UNIQUE
	UR1 : Name;
 WHERE
	WR01 : SIZEOF(QUERY(temp <* SELF.EnumerationValues | 
               NOT(TYPEOF(SELF.EnumerationValues[1]) = TYPEOF(temp))
               )) = 0;
END_ENTITY;

ENTITY IfcPropertyListValue
 SUBTYPE OF (IfcSimpleProperty);
	ListValues : LIST [1:?] OF IfcValue;
	Unit : OPTIONAL IfcUnit;
 WHERE
	WR31 : SIZEOF(QUERY(temp <* SELF.ListValues | 
               NOT(TYPEOF(SELF.ListValues[1]) = TYPEOF(temp))
               )) = 0;
END_ENTITY;

ENTITY IfcPropertyReferenceValue
 SUBTYPE OF (IfcSimpleProperty);
	UsageName : OPTIONAL IfcLabel;
	PropertyReference : IfcObjectReferenceSelect;
END_ENTITY;

ENTITY IfcPropertySet
 SUBTYPE OF (IfcPropertySetDefinition);
	HasProperties : SET [1:?] OF IfcProperty;
 WHERE
	WR31 : EXISTS(SELF\IfcRoot.Name);
	WR32 : IfcUniquePropertyName(HasProperties);
END_ENTITY;

ENTITY IfcPropertySetDefinition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcDoorLiningProperties
	,IfcDoorPanelProperties
	,IfcElementQuantity
	,IfcEnergyProperties
	,IfcFluidFlowProperties
	,IfcPermeableCoveringProperties
	,IfcPropertySet
	,IfcReinforcementDefinitionProperties
	,IfcServiceLifeFactor
	,IfcSoundProperties
	,IfcSoundValue
	,IfcSpaceThermalLoadProperties
	,IfcWindowLiningProperties
	,IfcWindowPanelProperties))
 SUBTYPE OF (IfcPropertyDefinition);
 INVERSE
	PropertyDefinitionOf : SET [0:1] OF IfcRelDefinesByProperties FOR RelatingPropertyDefinition;
	DefinesType : SET [0:1] OF IfcTypeObject FOR HasPropertySets;
END_ENTITY;

ENTITY IfcPropertySingleValue
 SUBTYPE OF (IfcSimpleProperty);
	NominalValue : OPTIONAL IfcValue;
	Unit : OPTIONAL IfcUnit;
END_ENTITY;

ENTITY IfcPropertyTableValue
 SUBTYPE OF (IfcSimpleProperty);
	DefiningValues : LIST [1:?] OF UNIQUE IfcValue;
	DefinedValues : LIST [1:?] OF IfcValue;
	Expression : OPTIONAL IfcText;
	DefiningUnit : OPTIONAL IfcUnit;
	DefinedUnit : OPTIONAL IfcUnit;
 WHERE
	WR1 : SIZEOF(DefiningValues) = SIZEOF(DefinedValues);
	WR2 : SIZEOF(QUERY(temp <* SELF.DefiningValues | TYPEOF(temp) <> TYPEOF(SELF.DefiningValues[1])))=0;
	WR3 : SIZEOF(QUERY(temp <* SELF.DefinedValues | TYPEOF(temp) <> TYPEOF(SELF.DefinedValues[1])))=0;
END_ENTITY;

ENTITY IfcProtectiveDeviceType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcProtectiveDeviceTypeEnum;
END_ENTITY;

ENTITY IfcProxy
 SUBTYPE OF (IfcProduct);
	ProxyType : IfcObjectTypeEnum;
	Tag : OPTIONAL IfcLabel;
 WHERE
	WR1 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcPumpType
 SUBTYPE OF (IfcFlowMovingDeviceType);
	PredefinedType : IfcPumpTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcPumpTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcPumpTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcQuantityArea
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	AreaValue : IfcAreaMeasure;
 WHERE
	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.AREAUNIT);
	WR22 : AreaValue >= 0.;
END_ENTITY;

ENTITY IfcQuantityCount
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	CountValue : IfcCountMeasure;
 WHERE
	WR21 : CountValue >= 0.;
END_ENTITY;

ENTITY IfcQuantityLength
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	LengthValue : IfcLengthMeasure;
 WHERE
	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.LENGTHUNIT);
	WR22 : LengthValue >= 0.;
END_ENTITY;

ENTITY IfcQuantityTime
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	TimeValue : IfcTimeMeasure;
 WHERE
	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.TIMEUNIT);
	WR22 : TimeValue >= 0.;
END_ENTITY;

ENTITY IfcQuantityVolume
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	VolumeValue : IfcVolumeMeasure;
 WHERE
	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.VOLUMEUNIT);
	WR22 : VolumeValue >= 0.;
END_ENTITY;

ENTITY IfcQuantityWeight
 SUBTYPE OF (IfcPhysicalSimpleQuantity);
	WeightValue : IfcMassMeasure;
 WHERE
	WR21 : NOT(EXISTS(SELF\IfcPhysicalSimpleQuantity.Unit)) OR
                (SELF\IfcPhysicalSimpleQuantity.Unit.UnitType = IfcUnitEnum.MASSUNIT);
	WR22 : WeightValue >= 0.;
END_ENTITY;

ENTITY IfcRadiusDimension
 SUBTYPE OF (IfcDimensionCurveDirectedCallout);
END_ENTITY;

ENTITY IfcRailing
 SUBTYPE OF (IfcBuildingElement);
	PredefinedType : OPTIONAL IfcRailingTypeEnum;
END_ENTITY;

ENTITY IfcRailingType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcRailingTypeEnum;
END_ENTITY;

ENTITY IfcRamp
 SUBTYPE OF (IfcBuildingElement);
	ShapeType : IfcRampTypeEnum;
 WHERE
	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
END_ENTITY;

ENTITY IfcRampFlight
 SUBTYPE OF (IfcBuildingElement);
END_ENTITY;

ENTITY IfcRampFlightType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcRampFlightTypeEnum;
END_ENTITY;

ENTITY IfcRationalBezierCurve
 SUBTYPE OF (IfcBezierCurve);
	WeightsData : LIST [2:?] OF REAL;
 DERIVE
	Weights : ARRAY [0:255] OF REAL := IfcListToArray(WeightsData,0,SELF\IfcBSplineCurve.UpperIndexOnControlPoints);
 WHERE
	WR1 : SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineCurve.ControlPointsList);
	WR2 : IfcCurveWeightsPositive(SELF);
END_ENTITY;

ENTITY IfcRectangleHollowProfileDef
 SUBTYPE OF (IfcRectangleProfileDef);
	WallThickness : IfcPositiveLengthMeasure;
	InnerFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	OuterFilletRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR31 : (WallThickness < (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
             (WallThickness < (SELF\IfcRectangleProfileDef.YDim/2.));
	WR32 : NOT(EXISTS(OuterFilletRadius)) OR 
             ((OuterFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
              (OuterFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2.)));
	WR33 : NOT(EXISTS(InnerFilletRadius)) OR 
             ((InnerFilletRadius <= (SELF\IfcRectangleProfileDef.XDim/2. - WallThickness)) AND 
              (InnerFilletRadius <= (SELF\IfcRectangleProfileDef.YDim/2. - WallThickness)));
END_ENTITY;

ENTITY IfcRectangleProfileDef
 SUPERTYPE OF (ONEOF
	(IfcRectangleHollowProfileDef
	,IfcRoundedRectangleProfileDef))
 SUBTYPE OF (IfcParameterizedProfileDef);
	XDim : IfcPositiveLengthMeasure;
	YDim : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRectangularPyramid
 SUBTYPE OF (IfcCsgPrimitive3D);
	XLength : IfcPositiveLengthMeasure;
	YLength : IfcPositiveLengthMeasure;
	Height : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRectangularTrimmedSurface
 SUBTYPE OF (IfcBoundedSurface);
	BasisSurface : IfcSurface;
	U1 : IfcParameterValue;
	V1 : IfcParameterValue;
	U2 : IfcParameterValue;
	V2 : IfcParameterValue;
	Usense : BOOLEAN;
	Vsense : BOOLEAN;
 DERIVE
	Dim : IfcDimensionCount := BasisSurface.Dim;
 WHERE
	WR1 : U1 <> U2;
	WR2 : V1 <> V2;
	WR3 : (('IFC2X3.IFCELEMENTARYSURFACE' IN TYPEOF(BasisSurface)) AND
                     (NOT ('IFC2X3.IFCPLANE' IN TYPEOF(BasisSurface)))) OR
                     ('IFC2X3.IFCSURFACEOFREVOLUTION' IN TYPEOF(BasisSurface)) OR
                     (Usense = (U2 > U1));
	WR4 : Vsense = (V2 > V1);
END_ENTITY;

ENTITY IfcReferencesValueDocument;
	ReferencedDocument : IfcDocumentSelect;
	ReferencingValues : SET [1:?] OF IfcAppliedValue;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcRegularTimeSeries
 SUBTYPE OF (IfcTimeSeries);
	TimeStep : IfcTimeMeasure;
	Values : LIST [1:?] OF IfcTimeSeriesValue;
END_ENTITY;

ENTITY IfcReinforcementBarProperties;
	TotalCrossSectionArea : IfcAreaMeasure;
	SteelGrade : IfcLabel;
	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
	EffectiveDepth : OPTIONAL IfcLengthMeasure;
	NominalBarDiameter : OPTIONAL IfcPositiveLengthMeasure;
	BarCount : OPTIONAL IfcCountMeasure;
END_ENTITY;

ENTITY IfcReinforcementDefinitionProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	DefinitionType : OPTIONAL IfcLabel;
	ReinforcementSectionDefinitions : LIST [1:?] OF IfcSectionReinforcementProperties;
END_ENTITY;

ENTITY IfcReinforcingBar
 SUBTYPE OF (IfcReinforcingElement);
	NominalDiameter : IfcPositiveLengthMeasure;
	CrossSectionArea : IfcAreaMeasure;
	BarLength : OPTIONAL IfcPositiveLengthMeasure;
	BarRole : IfcReinforcingBarRoleEnum;
	BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
 WHERE
	WR1 : (BarRole <> IfcReinforcingBarRoleEnum.USERDEFINED) OR ((BarRole = IfcReinforcingBarRoleEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcReinforcingElement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcReinforcingBar
	,IfcReinforcingMesh
	,IfcTendon
	,IfcTendonAnchor))
 SUBTYPE OF (IfcBuildingElementComponent);
	SteelGrade : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcReinforcingMesh
 SUBTYPE OF (IfcReinforcingElement);
	MeshLength : OPTIONAL IfcPositiveLengthMeasure;
	MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
	LongitudinalBarNominalDiameter : IfcPositiveLengthMeasure;
	TransverseBarNominalDiameter : IfcPositiveLengthMeasure;
	LongitudinalBarCrossSectionArea : IfcAreaMeasure;
	TransverseBarCrossSectionArea : IfcAreaMeasure;
	LongitudinalBarSpacing : IfcPositiveLengthMeasure;
	TransverseBarSpacing : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRelAggregates
 SUBTYPE OF (IfcRelDecomposes);
END_ENTITY;

ENTITY IfcRelAssigns
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcRelAssignsToActor
	,IfcRelAssignsToControl
	,IfcRelAssignsToGroup
	,IfcRelAssignsToProcess
	,IfcRelAssignsToProduct
	,IfcRelAssignsToResource))
 SUBTYPE OF (IfcRelationship);
	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
	RelatedObjectsType : OPTIONAL IfcObjectTypeEnum;
 WHERE
	WR1 : IfcCorrectObjectAssignment(RelatedObjectsType, RelatedObjects);
END_ENTITY;

ENTITY IfcRelAssignsTasks
 SUBTYPE OF (IfcRelAssignsToControl);
	TimeForTask : OPTIONAL IfcScheduleTimeControl;
 WHERE
	WR1 : HIINDEX(SELF\IfcRelAssigns.RelatedObjects) = 1;
	WR2 : 'IFC2X3.IFCTASK' IN TYPEOF(SELF\IfcRelAssigns.RelatedObjects[1]);
	WR3 : 'IFC2X3.IFCWORKCONTROL' IN TYPEOF(SELF\IfcRelAssignsToControl.RelatingControl);
END_ENTITY;

ENTITY IfcRelAssignsToActor
 SUPERTYPE OF (ONEOF
	(IfcRelOccupiesSpaces))
 SUBTYPE OF (IfcRelAssigns);
	RelatingActor : IfcActor;
	ActingRole : OPTIONAL IfcActorRole;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingActor :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssignsToControl
 SUPERTYPE OF (ONEOF
	(IfcRelAssignsTasks
	,IfcRelAssignsToProjectOrder
	,IfcRelSchedulesCostItems))
 SUBTYPE OF (IfcRelAssigns);
	RelatingControl : IfcControl;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingControl :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssignsToGroup
 SUBTYPE OF (IfcRelAssigns);
	RelatingGroup : IfcGroup;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingGroup :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssignsToProcess
 SUBTYPE OF (IfcRelAssigns);
	RelatingProcess : IfcProcess;
	QuantityInProcess : OPTIONAL IfcMeasureWithUnit;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProcess :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssignsToProduct
 SUBTYPE OF (IfcRelAssigns);
	RelatingProduct : IfcProduct;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingProduct :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssignsToProjectOrder
 SUBTYPE OF (IfcRelAssignsToControl);
END_ENTITY;

ENTITY IfcRelAssignsToResource
 SUBTYPE OF (IfcRelAssigns);
	RelatingResource : IfcResource;
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingResource :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelAssociates
 SUPERTYPE OF (ONEOF
	(IfcRelAssociatesAppliedValue
	,IfcRelAssociatesApproval
	,IfcRelAssociatesClassification
	,IfcRelAssociatesConstraint
	,IfcRelAssociatesDocument
	,IfcRelAssociatesLibrary
	,IfcRelAssociatesMaterial
	,IfcRelAssociatesProfileProperties))
 SUBTYPE OF (IfcRelationship);
	RelatedObjects : SET [1:?] OF IfcRoot;
 WHERE
	WR21 : SIZEOF(QUERY(temp <* RelatedObjects |
              NOT(('IFC2X3.IFCOBJECTDEFINITION' IN TYPEOF(temp)) 
               OR ('IFC2X3.IFCPROPERTYDEFINITION' IN TYPEOF(temp)))
              )) = 0;
END_ENTITY;

ENTITY IfcRelAssociatesAppliedValue
 SUBTYPE OF (IfcRelAssociates);
	RelatingAppliedValue : IfcAppliedValue;
END_ENTITY;

ENTITY IfcRelAssociatesApproval
 SUBTYPE OF (IfcRelAssociates);
	RelatingApproval : IfcApproval;
END_ENTITY;

ENTITY IfcRelAssociatesClassification
 SUBTYPE OF (IfcRelAssociates);
	RelatingClassification : IfcClassificationNotationSelect;
END_ENTITY;

ENTITY IfcRelAssociatesConstraint
 SUBTYPE OF (IfcRelAssociates);
	Intent : IfcLabel;
	RelatingConstraint : IfcConstraint;
END_ENTITY;

ENTITY IfcRelAssociatesDocument
 SUBTYPE OF (IfcRelAssociates);
	RelatingDocument : IfcDocumentSelect;
END_ENTITY;

ENTITY IfcRelAssociatesLibrary
 SUBTYPE OF (IfcRelAssociates);
	RelatingLibrary : IfcLibrarySelect;
END_ENTITY;

ENTITY IfcRelAssociatesMaterial
 SUBTYPE OF (IfcRelAssociates);
	RelatingMaterial : IfcMaterialSelect;
 WHERE
	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | 
             ('IFC2X3.IFCFEATUREELEMENTSUBTRACTION' IN TYPEOF(temp))
               OR ('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(temp))
             )) = 0;
	WR22 : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | 
             (NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp)) AND NOT('IFC2X3.IFCTYPEPRODUCT' IN TYPEOF(temp)))
             )) = 0;
END_ENTITY;

ENTITY IfcRelAssociatesProfileProperties
 SUBTYPE OF (IfcRelAssociates);
	RelatingProfileProperties : IfcProfileProperties;
	ProfileSectionLocation : OPTIONAL IfcShapeAspect;
	ProfileOrientation : OPTIONAL IfcOrientationSelect;
END_ENTITY;

ENTITY IfcRelConnects
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcRelConnectsElements
	,IfcRelConnectsPortToElement
	,IfcRelConnectsPorts
	,IfcRelConnectsStructuralActivity
	,IfcRelConnectsStructuralElement
	,IfcRelConnectsStructuralMember
	,IfcRelContainedInSpatialStructure
	,IfcRelCoversBldgElements
	,IfcRelCoversSpaces
	,IfcRelFillsElement
	,IfcRelFlowControlElements
	,IfcRelInteractionRequirements
	,IfcRelProjectsElement
	,IfcRelReferencedInSpatialStructure
	,IfcRelSequence
	,IfcRelServicesBuildings
	,IfcRelSpaceBoundary
	,IfcRelVoidsElement))
 SUBTYPE OF (IfcRelationship);
END_ENTITY;

ENTITY IfcRelConnectsElements
 SUPERTYPE OF (ONEOF
	(IfcRelConnectsPathElements
	,IfcRelConnectsWithRealizingElements))
 SUBTYPE OF (IfcRelConnects);
	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
	RelatingElement : IfcElement;
	RelatedElement : IfcElement;
 WHERE
	WR31 : RelatingElement :<>: RelatedElement;
END_ENTITY;

ENTITY IfcRelConnectsPathElements
 SUBTYPE OF (IfcRelConnectsElements);
	RelatingPriorities : LIST [0:?] OF INTEGER;
	RelatedPriorities : LIST [0:?] OF INTEGER;
	RelatedConnectionType : IfcConnectionTypeEnum;
	RelatingConnectionType : IfcConnectionTypeEnum;
 DERIVE
	RelatedLayerCount : INTEGER := IfcNoOfLayers(SELF\IfcRelConnectsElements.RelatedElement);
	RelatingLayerCount : INTEGER := IfcNoOfLayers(SELF\IfcRelConnectsElements.RelatingElement);
END_ENTITY;

ENTITY IfcRelConnectsPortToElement
 SUBTYPE OF (IfcRelConnects);
	RelatingPort : IfcPort;
	RelatedElement : IfcElement;
END_ENTITY;

ENTITY IfcRelConnectsPorts
 SUBTYPE OF (IfcRelConnects);
	RelatingPort : IfcPort;
	RelatedPort : IfcPort;
	RealizingElement : OPTIONAL IfcElement;
END_ENTITY;

ENTITY IfcRelConnectsStructuralActivity
 SUBTYPE OF (IfcRelConnects);
	RelatingElement : IfcStructuralActivityAssignmentSelect;
	RelatedStructuralActivity : IfcStructuralActivity;
END_ENTITY;

ENTITY IfcRelConnectsStructuralElement
 SUBTYPE OF (IfcRelConnects);
	RelatingElement : IfcElement;
	RelatedStructuralMember : IfcStructuralMember;
END_ENTITY;

ENTITY IfcRelConnectsStructuralMember
 SUPERTYPE OF (ONEOF
	(IfcRelConnectsWithEccentricity))
 SUBTYPE OF (IfcRelConnects);
	RelatingStructuralMember : IfcStructuralMember;
	RelatedStructuralConnection : IfcStructuralConnection;
	AppliedCondition : OPTIONAL IfcBoundaryCondition;
	AdditionalConditions : OPTIONAL IfcStructuralConnectionCondition;
	SupportedLength : OPTIONAL IfcLengthMeasure;
	ConditionCoordinateSystem : OPTIONAL IfcAxis2Placement3D;
END_ENTITY;

ENTITY IfcRelConnectsWithEccentricity
 SUBTYPE OF (IfcRelConnectsStructuralMember);
	ConnectionConstraint : IfcConnectionGeometry;
END_ENTITY;

ENTITY IfcRelConnectsWithRealizingElements
 SUBTYPE OF (IfcRelConnectsElements);
	RealizingElements : SET [1:?] OF IfcElement;
	ConnectionType : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcRelContainedInSpatialStructure
 SUBTYPE OF (IfcRelConnects);
	RelatedElements : SET [1:?] OF IfcProduct;
	RelatingStructure : IfcSpatialStructureElement;
 WHERE
	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF(temp))) = 0;
END_ENTITY;

ENTITY IfcRelCoversBldgElements
 SUBTYPE OF (IfcRelConnects);
	RelatingBuildingElement : IfcElement;
	RelatedCoverings : SET [1:?] OF IfcCovering;
END_ENTITY;

ENTITY IfcRelCoversSpaces
 SUBTYPE OF (IfcRelConnects);
	RelatedSpace : IfcSpace;
	RelatedCoverings : SET [1:?] OF IfcCovering;
END_ENTITY;

ENTITY IfcRelDecomposes
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcRelAggregates
	,IfcRelNests))
 SUBTYPE OF (IfcRelationship);
	RelatingObject : IfcObjectDefinition;
	RelatedObjects : SET [1:?] OF IfcObjectDefinition;
 WHERE
	WR31 : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
	WR32 : SIZEOF(QUERY(Temp <* RelatedObjects | 'IFC2X3.IFCTYPEOBJECT' IN TYPEOF(temp))) = 0;
	WR33 : NOT('IFC2X3.IFCTYPEOBJECT' IN TYPEOF(RelatingObject));
END_ENTITY;

ENTITY IfcRelDefines
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcRelDefinesByProperties
	,IfcRelDefinesByType))
 SUBTYPE OF (IfcRelationship);
	RelatedObjects : SET [1:?] OF IfcObject;
END_ENTITY;

ENTITY IfcRelDefinesByProperties
 SUPERTYPE OF (ONEOF
	(IfcRelOverridesProperties))
 SUBTYPE OF (IfcRelDefines);
	RelatingPropertyDefinition : IfcPropertySetDefinition;
END_ENTITY;

ENTITY IfcRelDefinesByType
 SUBTYPE OF (IfcRelDefines);
	RelatingType : IfcTypeObject;
END_ENTITY;

ENTITY IfcRelFillsElement
 SUBTYPE OF (IfcRelConnects);
	RelatingOpeningElement : IfcOpeningElement;
	RelatedBuildingElement : IfcElement;
END_ENTITY;

ENTITY IfcRelFlowControlElements
 SUBTYPE OF (IfcRelConnects);
	RelatedControlElements : SET [1:?] OF IfcDistributionControlElement;
	RelatingFlowElement : IfcDistributionFlowElement;
END_ENTITY;

ENTITY IfcRelInteractionRequirements
 SUBTYPE OF (IfcRelConnects);
	DailyInteraction : OPTIONAL IfcCountMeasure;
	ImportanceRating : OPTIONAL IfcNormalisedRatioMeasure;
	LocationOfInteraction : OPTIONAL IfcSpatialStructureElement;
	RelatedSpaceProgram : IfcSpaceProgram;
	RelatingSpaceProgram : IfcSpaceProgram;
END_ENTITY;

ENTITY IfcRelNests
 SUBTYPE OF (IfcRelDecomposes);
 WHERE
	WR1 : SIZEOF(QUERY(Temp <* SELF\IfcRelDecomposes.RelatedObjects | 
              NOT(TYPEOF(SELF\IfcRelDecomposes.RelatingObject) = TYPEOF(Temp)))) = 0;
END_ENTITY;

ENTITY IfcRelOccupiesSpaces
 SUBTYPE OF (IfcRelAssignsToActor);
END_ENTITY;

ENTITY IfcRelOverridesProperties
 SUBTYPE OF (IfcRelDefinesByProperties);
	OverridingProperties : SET [1:?] OF IfcProperty;
 WHERE
	WR1 : SIZEOF(SELF\IfcRelDefines.RelatedObjects) = 1;
END_ENTITY;

ENTITY IfcRelProjectsElement
 SUBTYPE OF (IfcRelConnects);
	RelatingElement : IfcElement;
	RelatedFeatureElement : IfcFeatureElementAddition;
END_ENTITY;

ENTITY IfcRelReferencedInSpatialStructure
 SUBTYPE OF (IfcRelConnects);
	RelatedElements : SET [1:?] OF IfcProduct;
	RelatingStructure : IfcSpatialStructureElement;
 WHERE
	WR31 : SIZEOF(QUERY(temp <* RelatedElements | 'IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF(temp))) = 0;
END_ENTITY;

ENTITY IfcRelSchedulesCostItems
 SUBTYPE OF (IfcRelAssignsToControl);
 WHERE
	WR11 : SIZEOF(QUERY(temp <* SELF\IfcRelAssigns.RelatedObjects |
               NOT('IFC2X3.IFCCOSTITEM' IN TYPEOF(temp))
               )) = 0;
	WR12 : 'IFC2X3.IFCCOSTSCHEDULE' IN TYPEOF (SELF\IfcRelAssignsToControl.RelatingControl);
END_ENTITY;

ENTITY IfcRelSequence
 SUBTYPE OF (IfcRelConnects);
	RelatingProcess : IfcProcess;
	RelatedProcess : IfcProcess;
	TimeLag : IfcTimeMeasure;
	SequenceType : IfcSequenceEnum;
 WHERE
	WR1 : RelatingProcess :<>: RelatedProcess;
END_ENTITY;

ENTITY IfcRelServicesBuildings
 SUBTYPE OF (IfcRelConnects);
	RelatingSystem : IfcSystem;
	RelatedBuildings : SET [1:?] OF IfcSpatialStructureElement;
END_ENTITY;

ENTITY IfcRelSpaceBoundary
 SUBTYPE OF (IfcRelConnects);
	RelatingSpace : IfcSpace;
	RelatedBuildingElement : OPTIONAL IfcElement;
	ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
	PhysicalOrVirtualBoundary : IfcPhysicalOrVirtualEnum;
	InternalOrExternalBoundary : IfcInternalOrExternalEnum;
 WHERE
	WR1 : ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Physical) AND 
              (EXISTS(RelatedBuildingElement) AND NOT('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
            OR 
            ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Virtual) AND 
              (NOT(EXISTS(RelatedBuildingElement)) OR ('IFC2X3.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) 
            OR 
             (PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.NotDefined);
END_ENTITY;

ENTITY IfcRelVoidsElement
 SUBTYPE OF (IfcRelConnects);
	RelatingBuildingElement : IfcElement;
	RelatedOpeningElement : IfcFeatureElementSubtraction;
END_ENTITY;

ENTITY IfcRelationship
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcRelAssigns
	,IfcRelAssociates
	,IfcRelConnects
	,IfcRelDecomposes
	,IfcRelDefines))
 SUBTYPE OF (IfcRoot);
END_ENTITY;

ENTITY IfcRelaxation;
	RelaxationValue : IfcNormalisedRatioMeasure;
	InitialStress : IfcNormalisedRatioMeasure;
END_ENTITY;

ENTITY IfcRepresentation
 SUPERTYPE OF (ONEOF
	(IfcShapeModel
	,IfcStyleModel));
	ContextOfItems : IfcRepresentationContext;
	RepresentationIdentifier : OPTIONAL IfcLabel;
	RepresentationType : OPTIONAL IfcLabel;
	Items : SET [1:?] OF IfcRepresentationItem;
 INVERSE
	RepresentationMap : SET [0:1] OF IfcRepresentationMap FOR MappedRepresentation;
	LayerAssignments : SET [0:?] OF IfcPresentationLayerAssignment FOR Assigneditems;
	OfProductRepresentation : SET [0:1] OF IfcProductRepresentation FOR Representations;
END_ENTITY;

ENTITY IfcRepresentationContext
 SUPERTYPE OF (ONEOF
	(IfcGeometricRepresentationContext));
	ContextIdentifier : OPTIONAL IfcLabel;
	ContextType : OPTIONAL IfcLabel;
 INVERSE
	RepresentationsInContext : SET [0:?] OF IfcRepresentation FOR ContextOfItems;
END_ENTITY;

ENTITY IfcRepresentationItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcGeometricRepresentationItem
	,IfcMappedItem
	,IfcStyledItem
	,IfcTopologicalRepresentationItem));
 INVERSE
	LayerAssignments : SET [0:?] OF IfcPresentationLayerAssignment FOR AssignedItems;
	StyledByItem : SET [0:1] OF IfcStyledItem FOR Item;
END_ENTITY;

ENTITY IfcRepresentationMap;
	MappingOrigin : IfcAxis2Placement;
	MappedRepresentation : IfcRepresentation;
 INVERSE
	MapUsage : SET [0:?] OF IfcMappedItem FOR MappingSource;
END_ENTITY;

ENTITY IfcResource
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcConstructionResource))
 SUBTYPE OF (IfcObject);
 INVERSE
	ResourceOf : SET [0:?] OF IfcRelAssignsToResource FOR RelatingResource;
END_ENTITY;

ENTITY IfcRevolvedAreaSolid
 SUBTYPE OF (IfcSweptAreaSolid);
	Axis : IfcAxis1Placement;
	Angle : IfcPlaneAngleMeasure;
 DERIVE
	AxisLine : IfcLine := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcCurve() || IfcLine(Axis.Location, 
                   IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Axis.Z,1.0));
 WHERE
	WR31 : Axis.Location.Coordinates[3] = 0.0;
	WR32 : Axis.Z.DirectionRatios[3] = 0.0;
END_ENTITY;

ENTITY IfcRibPlateProfileProperties
 SUBTYPE OF (IfcProfileProperties);
	Thickness : OPTIONAL IfcPositiveLengthMeasure;
	RibHeight : OPTIONAL IfcPositiveLengthMeasure;
	RibWidth : OPTIONAL IfcPositiveLengthMeasure;
	RibSpacing : OPTIONAL IfcPositiveLengthMeasure;
	Direction : IfcRibPlateDirectionEnum;
END_ENTITY;

ENTITY IfcRightCircularCone
 SUBTYPE OF (IfcCsgPrimitive3D);
	Height : IfcPositiveLengthMeasure;
	BottomRadius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRightCircularCylinder
 SUBTYPE OF (IfcCsgPrimitive3D);
	Height : IfcPositiveLengthMeasure;
	Radius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRoof
 SUBTYPE OF (IfcBuildingElement);
	ShapeType : IfcRoofTypeEnum;
 WHERE
	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
END_ENTITY;

ENTITY IfcRoot
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcObjectDefinition
	,IfcPropertyDefinition
	,IfcRelationship));
	GlobalId : IfcGloballyUniqueId;
	OwnerHistory : IfcOwnerHistory;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
 UNIQUE
	UR1 : GlobalId;
END_ENTITY;

ENTITY IfcRoundedEdgeFeature
 SUBTYPE OF (IfcEdgeFeature);
	Radius : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcRoundedRectangleProfileDef
 SUBTYPE OF (IfcRectangleProfileDef);
	RoundingRadius : IfcPositiveLengthMeasure;
 WHERE
	WR31 : ((RoundingRadius <= (SELF\IfcRectangleProfileDef.XDim/2.)) AND 
              (RoundingRadius <= (SELF\IfcRectangleProfileDef.YDim/2.)));
END_ENTITY;

ENTITY IfcSIUnit
 SUBTYPE OF (IfcNamedUnit);
	Prefix : OPTIONAL IfcSIPrefix;
	Name : IfcSIUnitName;
 DERIVE
	SELF\IfcNamedUnit.Dimensions : IfcDimensionalExponents := IfcDimensionsForSiUnit (SELF.Name);
END_ENTITY;

ENTITY IfcSanitaryTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcSanitaryTerminalTypeEnum;
END_ENTITY;

ENTITY IfcScheduleTimeControl
 SUBTYPE OF (IfcControl);
	ActualStart : OPTIONAL IfcDateTimeSelect;
	EarlyStart : OPTIONAL IfcDateTimeSelect;
	LateStart : OPTIONAL IfcDateTimeSelect;
	ScheduleStart : OPTIONAL IfcDateTimeSelect;
	ActualFinish : OPTIONAL IfcDateTimeSelect;
	EarlyFinish : OPTIONAL IfcDateTimeSelect;
	LateFinish : OPTIONAL IfcDateTimeSelect;
	ScheduleFinish : OPTIONAL IfcDateTimeSelect;
	ScheduleDuration : OPTIONAL IfcTimeMeasure;
	ActualDuration : OPTIONAL IfcTimeMeasure;
	RemainingTime : OPTIONAL IfcTimeMeasure;
	FreeFloat : OPTIONAL IfcTimeMeasure;
	TotalFloat : OPTIONAL IfcTimeMeasure;
	IsCritical : OPTIONAL BOOLEAN;
	StatusTime : OPTIONAL IfcDateTimeSelect;
	StartFloat : OPTIONAL IfcTimeMeasure;
	FinishFloat : OPTIONAL IfcTimeMeasure;
	Completion : OPTIONAL IfcPositiveRatioMeasure;
 INVERSE
	ScheduleTimeControlAssigned : IfcRelAssignsTasks FOR TimeForTask;
END_ENTITY;

ENTITY IfcSectionProperties;
	SectionType : IfcSectionTypeEnum;
	StartProfile : IfcProfileDef;
	EndProfile : OPTIONAL IfcProfileDef;
END_ENTITY;

ENTITY IfcSectionReinforcementProperties;
	LongitudinalStartPosition : IfcLengthMeasure;
	LongitudinalEndPosition : IfcLengthMeasure;
	TransversePosition : OPTIONAL IfcLengthMeasure;
	ReinforcementRole : IfcReinforcingBarRoleEnum;
	SectionDefinition : IfcSectionProperties;
	CrossSectionReinforcementDefinitions : SET [1:?] OF IfcReinforcementBarProperties;
END_ENTITY;

ENTITY IfcSectionedSpine
 SUBTYPE OF (IfcGeometricRepresentationItem);
	SpineCurve : IfcCompositeCurve;
	CrossSections : LIST [2:?] OF IfcProfileDef;
	CrossSectionPositions : LIST [2:?] OF IfcAxis2Placement3D;
 DERIVE
	Dim : IfcDimensionCount := 3;
 WHERE
	WR1 : SIZEOF(CrossSections) = SIZEOF(CrossSectionPositions);
	WR2 : SIZEOF(QUERY(temp <* CrossSections | CrossSections[1].ProfileType <> temp.ProfileType)) = 0;
	WR3 : SpineCurve.Dim = 3;
END_ENTITY;

ENTITY IfcSensorType
 SUBTYPE OF (IfcDistributionControlElementType);
	PredefinedType : IfcSensorTypeEnum;
END_ENTITY;

ENTITY IfcServiceLife
 SUBTYPE OF (IfcControl);
	ServiceLifeType : IfcServiceLifeTypeEnum;
	ServiceLifeDuration : IfcTimeMeasure;
END_ENTITY;

ENTITY IfcServiceLifeFactor
 SUBTYPE OF (IfcPropertySetDefinition);
	PredefinedType : IfcServiceLifeFactorTypeEnum;
	UpperValue : OPTIONAL IfcMeasureValue;
	MostUsedValue : IfcMeasureValue;
	LowerValue : OPTIONAL IfcMeasureValue;
 WHERE
	WR31 : NOT(PredefinedType = IfcServiceLifeFactorTypeEnum.USERDEFINED)
             OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcShapeAspect;
	ShapeRepresentations : LIST [1:?] OF IfcShapeModel;
	Name : OPTIONAL IfcLabel;
	Description : OPTIONAL IfcText;
	ProductDefinitional : LOGICAL;
	PartOfProductDefinitionShape : IfcProductDefinitionShape;
END_ENTITY;

ENTITY IfcShapeModel
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcShapeRepresentation
	,IfcTopologyRepresentation))
 SUBTYPE OF (IfcRepresentation);
 INVERSE
	OfShapeAspect : SET [0:1] OF IfcShapeAspect FOR ShapeRepresentations;
 WHERE
	WR11 : (SIZEOF(SELF\IfcRepresentation.OfProductRepresentation) = 1) XOR 
             (SIZEOF(SELF\IfcRepresentation.RepresentationMap) = 1) XOR
             (SIZEOF(OfShapeAspect) = 1);
END_ENTITY;

ENTITY IfcShapeRepresentation
 SUBTYPE OF (IfcShapeModel);
 WHERE
	WR21 : 'IFC2X3.IFCGEOMETRICREPRESENTATIONCONTEXT' 
             IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
	WR22 : SIZEOF(QUERY(temp <* Items | 
               ('IFC2X3.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
                 AND (NOT(SIZEOF(
                   ['IFC2X3.IFCVERTEXPOINT',
                    'IFC2X3.IFCEDGECURVE',
                    'IFC2X3.IFCFACESURFACE'] * TYPEOF(temp)) = 1))
             )) = 0;
	WR23 : EXISTS(SELF\IfcRepresentation.RepresentationType);
	WR24 : IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
END_ENTITY;

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

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

ENTITY IfcSite
 SUBTYPE OF (IfcSpatialStructureElement);
	RefLatitude : OPTIONAL IfcCompoundPlaneAngleMeasure;
	RefLongitude : OPTIONAL IfcCompoundPlaneAngleMeasure;
	RefElevation : OPTIONAL IfcLengthMeasure;
	LandTitleNumber : OPTIONAL IfcLabel;
	SiteAddress : OPTIONAL IfcPostalAddress;
END_ENTITY;

ENTITY IfcSlab
 SUBTYPE OF (IfcBuildingElement);
	PredefinedType : OPTIONAL IfcSlabTypeEnum;
 WHERE
	WR2 : (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcSlabType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcSlabTypeEnum;
END_ENTITY;

ENTITY IfcSlippageConnectionCondition
 SUBTYPE OF (IfcStructuralConnectionCondition);
	SlippageX : OPTIONAL IfcLengthMeasure;
	SlippageY : OPTIONAL IfcLengthMeasure;
	SlippageZ : OPTIONAL IfcLengthMeasure;
END_ENTITY;

ENTITY IfcSolidModel
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcCsgSolid
	,IfcManifoldSolidBrep
	,IfcSweptAreaSolid
	,IfcSweptDiskSolid))
 SUBTYPE OF (IfcGeometricRepresentationItem);
 DERIVE
	Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcSoundProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	IsAttenuating : IfcBoolean;
	SoundScale : OPTIONAL IfcSoundScaleEnum;
	SoundValues : LIST [1:8] OF IfcSoundValue;
END_ENTITY;

ENTITY IfcSoundValue
 SUBTYPE OF (IfcPropertySetDefinition);
	SoundLevelTimeSeries : OPTIONAL IfcTimeSeries;
	Frequency : IfcFrequencyMeasure;
	SoundLevelSingleValue : OPTIONAL IfcDerivedMeasureValue;
END_ENTITY;

ENTITY IfcSpace
 SUBTYPE OF (IfcSpatialStructureElement);
	InteriorOrExteriorSpace : IfcInternalOrExternalEnum;
	ElevationWithFlooring : OPTIONAL IfcLengthMeasure;
 INVERSE
	HasCoverings : SET [0:?] OF IfcRelCoversSpaces FOR RelatedSpace;
	BoundedBy : SET [0:?] OF IfcRelSpaceBoundary FOR RelatingSpace;
END_ENTITY;

ENTITY IfcSpaceHeaterType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcSpaceHeaterTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcSpaceHeaterTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcSpaceHeaterTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcSpaceProgram
 SUBTYPE OF (IfcControl);
	SpaceProgramIdentifier : IfcIdentifier;
	MaxRequiredArea : OPTIONAL IfcAreaMeasure;
	MinRequiredArea : OPTIONAL IfcAreaMeasure;
	RequestedLocation : OPTIONAL IfcSpatialStructureElement;
	StandardRequiredArea : IfcAreaMeasure;
 INVERSE
	HasInteractionReqsFrom : SET [0:?] OF IfcRelInteractionRequirements FOR RelatedSpaceProgram;
	HasInteractionReqsTo : SET [0:?] OF IfcRelInteractionRequirements FOR RelatingSpaceProgram;
END_ENTITY;

ENTITY IfcSpaceThermalLoadProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	ApplicableValueRatio : OPTIONAL IfcPositiveRatioMeasure;
	ThermalLoadSource : IfcThermalLoadSourceEnum;
	PropertySource : IfcPropertySourceEnum;
	SourceDescription : OPTIONAL IfcText;
	MaximumValue : IfcPowerMeasure;
	MinimumValue : OPTIONAL IfcPowerMeasure;
	ThermalLoadTimeSeriesValues : OPTIONAL IfcTimeSeries;
	UserDefinedThermalLoadSource : OPTIONAL IfcLabel;
	UserDefinedPropertySource : OPTIONAL IfcLabel;
	ThermalLoadType : IfcThermalLoadTypeEnum;
END_ENTITY;

ENTITY IfcSpaceType
 SUBTYPE OF (IfcSpatialStructureElementType);
	PredefinedType : IfcSpaceTypeEnum;
END_ENTITY;

ENTITY IfcSpatialStructureElement
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBuilding
	,IfcBuildingStorey
	,IfcSite
	,IfcSpace))
 SUBTYPE OF (IfcProduct);
	LongName : OPTIONAL IfcLabel;
	CompositionType : IfcElementCompositionEnum;
 INVERSE
	ReferencesElements : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatingStructure;
	ServicedBySystems : SET [0:?] OF IfcRelServicesBuildings FOR RelatedBuildings;
	ContainsElements : SET [0:?] OF IfcRelContainedInSpatialStructure FOR RelatingStructure;
 WHERE
	WR41 : (HIINDEX(SELF\IfcObjectDefinition.Decomposes) = 1) 
             AND
             ('IFC2X3.IFCRELAGGREGATES' IN TYPEOF(SELF\IfcObjectDefinition.Decomposes[1])) 
             AND
             (('IFC2X3.IFCPROJECT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject)) OR
              ('IFC2X3.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject))
             );
END_ENTITY;

ENTITY IfcSpatialStructureElementType
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcSpaceType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcSphere
 SUBTYPE OF (IfcCsgPrimitive3D);
	Radius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcStackTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcStackTerminalTypeEnum;
END_ENTITY;

ENTITY IfcStair
 SUBTYPE OF (IfcBuildingElement);
	ShapeType : IfcStairTypeEnum;
 WHERE
	WR1 : (HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 0) OR 
            ((HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) = 1) AND (NOT(EXISTS(SELF\IfcProduct.Representation))));
END_ENTITY;

ENTITY IfcStairFlight
 SUBTYPE OF (IfcBuildingElement);
	NumberOfRiser : OPTIONAL INTEGER;
	NumberOfTreads : OPTIONAL INTEGER;
	RiserHeight : OPTIONAL IfcPositiveLengthMeasure;
	TreadLength : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcStairFlightType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcStairFlightTypeEnum;
END_ENTITY;

ENTITY IfcStructuralAction
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralLinearAction
	,IfcStructuralPlanarAction
	,IfcStructuralPointAction))
 SUBTYPE OF (IfcStructuralActivity);
	DestabilizingLoad : BOOLEAN;
	CausedBy : OPTIONAL IfcStructuralReaction;
END_ENTITY;

ENTITY IfcStructuralActivity
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralAction
	,IfcStructuralReaction))
 SUBTYPE OF (IfcProduct);
	AppliedLoad : IfcStructuralLoad;
	GlobalOrLocal : IfcGlobalOrLocalEnum;
 INVERSE
	AssignedToStructuralItem : IfcRelConnectsStructuralActivity FOR RelatedStructuralActivity;
END_ENTITY;

ENTITY IfcStructuralAnalysisModel
 SUBTYPE OF (IfcSystem);
	PredefinedType : IfcAnalysisModelTypeEnum;
	OrientationOf2DPlane : OPTIONAL IfcAxis2Placement3D;
	LoadedBy : OPTIONAL SET [1:?] OF IfcStructuralLoadGroup;
	HasResults : OPTIONAL SET [1:?] OF IfcStructuralResultGroup;
END_ENTITY;

ENTITY IfcStructuralConnection
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralCurveConnection
	,IfcStructuralPointConnection
	,IfcStructuralSurfaceConnection))
 SUBTYPE OF (IfcStructuralItem);
	AppliedCondition : OPTIONAL IfcBoundaryCondition;
 INVERSE
	ConnectsStructuralMembers : SET [1:?] OF IfcRelConnectsStructuralMember FOR RelatedStructuralConnection;
END_ENTITY;

ENTITY IfcStructuralConnectionCondition
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcFailureConnectionCondition
	,IfcSlippageConnectionCondition));
	Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcStructuralCurveConnection
 SUBTYPE OF (IfcStructuralConnection);
END_ENTITY;

ENTITY IfcStructuralCurveMember
 SUPERTYPE OF (ONEOF
	(IfcStructuralCurveMemberVarying))
 SUBTYPE OF (IfcStructuralMember);
	PredefinedType : IfcStructuralCurveTypeEnum;
END_ENTITY;

ENTITY IfcStructuralCurveMemberVarying
 SUBTYPE OF (IfcStructuralCurveMember);
END_ENTITY;

ENTITY IfcStructuralItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralConnection
	,IfcStructuralMember))
 SUBTYPE OF (IfcProduct);
 INVERSE
	AssignedStructuralActivity : SET [0:?] OF IfcRelConnectsStructuralActivity FOR RelatingElement;
END_ENTITY;

ENTITY IfcStructuralLinearAction
 SUPERTYPE OF (ONEOF
	(IfcStructuralLinearActionVarying))
 SUBTYPE OF (IfcStructuralAction);
	ProjectedOrTrue : IfcProjectedOrTrueLengthEnum;
 WHERE
	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADLINEARFORCE',
                     'IFC2X3.IFCSTRUCTURALLOADTEMPERATURE']
             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
END_ENTITY;

ENTITY IfcStructuralLinearActionVarying
 SUBTYPE OF (IfcStructuralLinearAction);
	VaryingAppliedLoadLocation : IfcShapeAspect;
	SubsequentAppliedLoads : LIST [1:?] OF IfcStructuralLoad;
 DERIVE
	VaryingAppliedLoads : LIST [2:?] OF IfcStructuralLoad := IfcAddToBeginOfList(SELF\IfcStructuralActivity.AppliedLoad, SubsequentAppliedLoads);
END_ENTITY;

ENTITY IfcStructuralLoad
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralLoadStatic));
	Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcStructuralLoadGroup
 SUBTYPE OF (IfcGroup);
	PredefinedType : IfcLoadGroupTypeEnum;
	ActionType : IfcActionTypeEnum;
	ActionSource : IfcActionSourceTypeEnum;
	Coefficient : OPTIONAL IfcPositiveRatioMeasure;
	Purpose : OPTIONAL IfcLabel;
 INVERSE
	SourceOfResultGroup : SET [0:1] OF IfcStructuralResultGroup FOR ResultForLoadGroup;
	LoadGroupFor : SET [0:?] OF IfcStructuralAnalysisModel FOR LoadedBy;
END_ENTITY;

ENTITY IfcStructuralLoadLinearForce
 SUBTYPE OF (IfcStructuralLoadStatic);
	LinearForceX : OPTIONAL IfcLinearForceMeasure;
	LinearForceY : OPTIONAL IfcLinearForceMeasure;
	LinearForceZ : OPTIONAL IfcLinearForceMeasure;
	LinearMomentX : OPTIONAL IfcLinearMomentMeasure;
	LinearMomentY : OPTIONAL IfcLinearMomentMeasure;
	LinearMomentZ : OPTIONAL IfcLinearMomentMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadPlanarForce
 SUBTYPE OF (IfcStructuralLoadStatic);
	PlanarForceX : OPTIONAL IfcPlanarForceMeasure;
	PlanarForceY : OPTIONAL IfcPlanarForceMeasure;
	PlanarForceZ : OPTIONAL IfcPlanarForceMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadSingleDisplacement
 SUPERTYPE OF (ONEOF
	(IfcStructuralLoadSingleDisplacementDistortion))
 SUBTYPE OF (IfcStructuralLoadStatic);
	DisplacementX : OPTIONAL IfcLengthMeasure;
	DisplacementY : OPTIONAL IfcLengthMeasure;
	DisplacementZ : OPTIONAL IfcLengthMeasure;
	RotationalDisplacementRX : OPTIONAL IfcPlaneAngleMeasure;
	RotationalDisplacementRY : OPTIONAL IfcPlaneAngleMeasure;
	RotationalDisplacementRZ : OPTIONAL IfcPlaneAngleMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadSingleDisplacementDistortion
 SUBTYPE OF (IfcStructuralLoadSingleDisplacement);
	Distortion : OPTIONAL IfcCurvatureMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadSingleForce
 SUPERTYPE OF (ONEOF
	(IfcStructuralLoadSingleForceWarping))
 SUBTYPE OF (IfcStructuralLoadStatic);
	ForceX : OPTIONAL IfcForceMeasure;
	ForceY : OPTIONAL IfcForceMeasure;
	ForceZ : OPTIONAL IfcForceMeasure;
	MomentX : OPTIONAL IfcTorqueMeasure;
	MomentY : OPTIONAL IfcTorqueMeasure;
	MomentZ : OPTIONAL IfcTorqueMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadSingleForceWarping
 SUBTYPE OF (IfcStructuralLoadSingleForce);
	WarpingMoment : OPTIONAL IfcWarpingMomentMeasure;
END_ENTITY;

ENTITY IfcStructuralLoadStatic
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralLoadLinearForce
	,IfcStructuralLoadPlanarForce
	,IfcStructuralLoadSingleDisplacement
	,IfcStructuralLoadSingleForce
	,IfcStructuralLoadTemperature))
 SUBTYPE OF (IfcStructuralLoad);
END_ENTITY;

ENTITY IfcStructuralLoadTemperature
 SUBTYPE OF (IfcStructuralLoadStatic);
	DeltaT_Constant : OPTIONAL IfcThermodynamicTemperatureMeasure;
	DeltaT_Y : OPTIONAL IfcThermodynamicTemperatureMeasure;
	DeltaT_Z : OPTIONAL IfcThermodynamicTemperatureMeasure;
END_ENTITY;

ENTITY IfcStructuralMember
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralCurveMember
	,IfcStructuralSurfaceMember))
 SUBTYPE OF (IfcStructuralItem);
 INVERSE
	ReferencesElement : SET [0:?] OF IfcRelConnectsStructuralElement FOR RelatedStructuralMember;
	ConnectedBy : SET [0:?] OF IfcRelConnectsStructuralMember FOR RelatingStructuralMember;
END_ENTITY;

ENTITY IfcStructuralPlanarAction
 SUPERTYPE OF (ONEOF
	(IfcStructuralPlanarActionVarying))
 SUBTYPE OF (IfcStructuralAction);
	ProjectedOrTrue : IfcProjectedOrTrueLengthEnum;
 WHERE
	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADPLANARFORCE',
                     'IFC2X3.IFCSTRUCTURALLOADTEMPERATURE']
             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
END_ENTITY;

ENTITY IfcStructuralPlanarActionVarying
 SUBTYPE OF (IfcStructuralPlanarAction);
	VaryingAppliedLoadLocation : IfcShapeAspect;
	SubsequentAppliedLoads : LIST [2:?] OF IfcStructuralLoad;
 DERIVE
	VaryingAppliedLoads : LIST [3:?] OF IfcStructuralLoad := IfcAddToBeginOfList(SELF\IfcStructuralActivity.AppliedLoad, SubsequentAppliedLoads);
END_ENTITY;

ENTITY IfcStructuralPointAction
 SUBTYPE OF (IfcStructuralAction);
 WHERE
	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADSINGLEFORCE',
                     'IFC2X3.IFCSTRUCTURALLOADSINGLEDISPLACEMENT']
             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
END_ENTITY;

ENTITY IfcStructuralPointConnection
 SUBTYPE OF (IfcStructuralConnection);
END_ENTITY;

ENTITY IfcStructuralPointReaction
 SUBTYPE OF (IfcStructuralReaction);
 WHERE
	WR61 : SIZEOF(['IFC2X3.IFCSTRUCTURALLOADSINGLEFORCE',
                     'IFC2X3.IFCSTRUCTURALLOADSINGLEDISPLACEMENT']
             * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
END_ENTITY;

ENTITY IfcStructuralProfileProperties
 SUPERTYPE OF (ONEOF
	(IfcStructuralSteelProfileProperties))
 SUBTYPE OF (IfcGeneralProfileProperties);
	TorsionalConstantX : OPTIONAL IfcMomentOfInertiaMeasure;
	MomentOfInertiaYZ : OPTIONAL IfcMomentOfInertiaMeasure;
	MomentOfInertiaY : OPTIONAL IfcMomentOfInertiaMeasure;
	MomentOfInertiaZ : OPTIONAL IfcMomentOfInertiaMeasure;
	WarpingConstant : OPTIONAL IfcWarpingConstantMeasure;
	ShearCentreZ : OPTIONAL IfcLengthMeasure;
	ShearCentreY : OPTIONAL IfcLengthMeasure;
	ShearDeformationAreaZ : OPTIONAL IfcAreaMeasure;
	ShearDeformationAreaY : OPTIONAL IfcAreaMeasure;
	MaximumSectionModulusY : OPTIONAL IfcSectionModulusMeasure;
	MinimumSectionModulusY : OPTIONAL IfcSectionModulusMeasure;
	MaximumSectionModulusZ : OPTIONAL IfcSectionModulusMeasure;
	MinimumSectionModulusZ : OPTIONAL IfcSectionModulusMeasure;
	TorsionalSectionModulus : OPTIONAL IfcSectionModulusMeasure;
	CentreOfGravityInX : OPTIONAL IfcLengthMeasure;
	CentreOfGravityInY : OPTIONAL IfcLengthMeasure;
 WHERE
	WR21 : NOT(EXISTS(ShearDeformationAreaY)) OR (ShearDeformationAreaY >= 0.);
	WR22 : NOT(EXISTS(ShearDeformationAreaZ)) OR (ShearDeformationAreaZ >= 0.);
END_ENTITY;

ENTITY IfcStructuralReaction
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStructuralPointReaction))
 SUBTYPE OF (IfcStructuralActivity);
 INVERSE
	Causes : SET [0:?] OF IfcStructuralAction FOR CausedBy;
END_ENTITY;

ENTITY IfcStructuralResultGroup
 SUBTYPE OF (IfcGroup);
	TheoryType : IfcAnalysisTheoryTypeEnum;
	ResultForLoadGroup : OPTIONAL IfcStructuralLoadGroup;
	IsLinear : BOOLEAN;
 INVERSE
	ResultGroupFor : SET [0:1] OF IfcStructuralAnalysisModel FOR HasResults;
END_ENTITY;

ENTITY IfcStructuralSteelProfileProperties
 SUBTYPE OF (IfcStructuralProfileProperties);
	ShearAreaZ : OPTIONAL IfcAreaMeasure;
	ShearAreaY : OPTIONAL IfcAreaMeasure;
	PlasticShapeFactorY : OPTIONAL IfcPositiveRatioMeasure;
	PlasticShapeFactorZ : OPTIONAL IfcPositiveRatioMeasure;
 WHERE
	WR31 : NOT(EXISTS(ShearAreaY)) OR (ShearAreaY >= 0.);
	WR32 : NOT(EXISTS(ShearAreaZ)) OR (ShearAreaZ >= 0.);
END_ENTITY;

ENTITY IfcStructuralSurfaceConnection
 SUBTYPE OF (IfcStructuralConnection);
END_ENTITY;

ENTITY IfcStructuralSurfaceMember
 SUPERTYPE OF (ONEOF
	(IfcStructuralSurfaceMemberVarying))
 SUBTYPE OF (IfcStructuralMember);
	PredefinedType : IfcStructuralSurfaceTypeEnum;
	Thickness : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcStructuralSurfaceMemberVarying
 SUBTYPE OF (IfcStructuralSurfaceMember);
	SubsequentThickness : LIST [2:?] OF IfcPositiveLengthMeasure;
	VaryingThicknessLocation : IfcShapeAspect;
 DERIVE
	VaryingThickness : LIST [3:?] OF IfcPositiveLengthMeasure := IfcAddToBeginOfList(SELF\IfcStructuralSurfaceMember.Thickness, SubsequentThickness);
 WHERE
	WR61 : EXISTS(SELF\IfcStructuralSurfaceMember.Thickness);
	WR62 : SIZEOF(QUERY(temp <* SELF.VaryingThicknessLocation.ShapeRepresentations |
               NOT(SIZEOF(temp\IfcRepresentation.Items) = 1)
               )) = 0;
	WR63 : SIZEOF(QUERY(temp <* SELF.VaryingThicknessLocation.ShapeRepresentations |
               NOT(('IFC2X3.IFCCARTESIANPOINT' IN TYPEOF(temp\IfcRepresentation.Items[1]))
                     OR
                   ('IFC2X3.IFCPOINTONSURFACE' IN TYPEOF(temp\IfcRepresentation.Items[1])))
               )) = 0;
END_ENTITY;

ENTITY IfcStructuredDimensionCallout
 SUBTYPE OF (IfcDraughtingCallout);
 WHERE
	WR31 : SIZEOF(QUERY ( Ato <* QUERY ( Con <* SELF.contents | (
                   'IFC2X3.IFCANNOTATIONTEXTOCCURRENCE' IN 
                    TYPEOF(Con)) ) | (NOT (Ato.Name IN ['dimension value',
                   'tolerance value','unit text','prefix text','suffix text']))))
                  = 0;
END_ENTITY;

ENTITY IfcStyleModel
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcStyledRepresentation))
 SUBTYPE OF (IfcRepresentation);
END_ENTITY;

ENTITY IfcStyledItem
 SUPERTYPE OF (ONEOF
	(IfcAnnotationOccurrence))
 SUBTYPE OF (IfcRepresentationItem);
	Item : OPTIONAL IfcRepresentationItem;
	Styles : SET [1:?] OF IfcPresentationStyleAssignment;
	Name : OPTIONAL IfcLabel;
 WHERE
	WR11 : SIZEOF(Styles) = 1;
	WR12 : NOT('IFC2X3.IFCSTYLEDITEM' IN TYPEOF(Item));
END_ENTITY;

ENTITY IfcStyledRepresentation
 SUBTYPE OF (IfcStyleModel);
 WHERE
	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRepresentation.Items | 
               (NOT('IFC2X3.IFCSTYLEDITEM' IN TYPEOF(temp)))
             )) = 0;
END_ENTITY;

ENTITY IfcSubContractResource
 SUBTYPE OF (IfcConstructionResource);
	SubContractor : OPTIONAL IfcActorSelect;
	JobDescription : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcSubedge
 SUBTYPE OF (IfcEdge);
	ParentEdge : IfcEdge;
END_ENTITY;

ENTITY IfcSurface
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBoundedSurface
	,IfcElementarySurface
	,IfcSweptSurface))
 SUBTYPE OF (IfcGeometricRepresentationItem);
END_ENTITY;

ENTITY IfcSurfaceCurveSweptAreaSolid
 SUBTYPE OF (IfcSweptAreaSolid);
	Directrix : IfcCurve;
	StartParam : IfcParameterValue;
	EndParam : IfcParameterValue;
	ReferenceSurface : IfcSurface;
END_ENTITY;

ENTITY IfcSurfaceOfLinearExtrusion
 SUBTYPE OF (IfcSweptSurface);
	ExtrudedDirection : IfcDirection;
	Depth : IfcLengthMeasure;
 DERIVE
	ExtrusionAxis : IfcVector := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (ExtrudedDirection, Depth);
 WHERE
	WR41 : Depth > 0.;
END_ENTITY;

ENTITY IfcSurfaceOfRevolution
 SUBTYPE OF (IfcSweptSurface);
	AxisPosition : IfcAxis1Placement;
 DERIVE
	AxisLine : IfcLine := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcCurve() || IfcLine(AxisPosition.Location, 
                       IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(AxisPosition.Z,1.0));
END_ENTITY;

ENTITY IfcSurfaceStyle
 SUBTYPE OF (IfcPresentationStyle);
	Side : IfcSurfaceSide;
	Styles : SET [1:5] OF IfcSurfaceStyleElementSelect;
 WHERE
	WR11 : SIZEOF(QUERY(Style <* SELF.Styles |
               'IFC2X3.IFCSURFACESTYLESHADING' IN
                TYPEOF(Style)
               )) <= 1;
	WR12 : SIZEOF(QUERY(Style <* SELF.Styles |
               'IFC2X3.IFCSURFACESTYLELIGHTING' IN
                TYPEOF(Style)
               )) <= 1;
	WR13 : SIZEOF(QUERY(Style <* SELF.Styles |
               'IFC2X3.IFCSURFACESTYLEREFRACTION' IN
                TYPEOF(Style)
               )) <= 1;
	WR14 : SIZEOF(QUERY(Style <* SELF.Styles |
               'IFC2X3.IFCSURFACESTYLEWITHTEXTURES' IN
                TYPEOF(Style)
               )) <= 1;
	WR15 : SIZEOF(QUERY(Style <* SELF.Styles |
               'IFC2X3.IFCEXTERNALLYDEFINEDSURFACESTYLE' IN
                TYPEOF(Style)
               )) <= 1;
END_ENTITY;

ENTITY IfcSurfaceStyleLighting;
	DiffuseTransmissionColour : IfcColourRgb;
	DiffuseReflectionColour : IfcColourRgb;
	TransmissionColour : IfcColourRgb;
	ReflectanceColour : IfcColourRgb;
END_ENTITY;

ENTITY IfcSurfaceStyleRefraction;
	RefractionIndex : OPTIONAL IfcReal;
	DispersionFactor : OPTIONAL IfcReal;
END_ENTITY;

ENTITY IfcSurfaceStyleRendering
 SUBTYPE OF (IfcSurfaceStyleShading);
	Transparency : OPTIONAL IfcNormalisedRatioMeasure;
	DiffuseColour : OPTIONAL IfcColourOrFactor;
	TransmissionColour : OPTIONAL IfcColourOrFactor;
	DiffuseTransmissionColour : OPTIONAL IfcColourOrFactor;
	ReflectionColour : OPTIONAL IfcColourOrFactor;
	SpecularColour : OPTIONAL IfcColourOrFactor;
	SpecularHighlight : OPTIONAL IfcSpecularHighlightSelect;
	ReflectanceMethod : IfcReflectanceMethodEnum;
END_ENTITY;

ENTITY IfcSurfaceStyleShading
 SUPERTYPE OF (ONEOF
	(IfcSurfaceStyleRendering));
	SurfaceColour : IfcColourRgb;
END_ENTITY;

ENTITY IfcSurfaceStyleWithTextures;
	Textures : LIST [1:?] OF IfcSurfaceTexture;
END_ENTITY;

ENTITY IfcSurfaceTexture
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcBlobTexture
	,IfcImageTexture
	,IfcPixelTexture));
	RepeatS : BOOLEAN;
	RepeatT : BOOLEAN;
	TextureType : IfcSurfaceTextureEnum;
	TextureTransform : OPTIONAL IfcCartesianTransformationOperator2D;
END_ENTITY;

ENTITY IfcSweptAreaSolid
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcExtrudedAreaSolid
	,IfcRevolvedAreaSolid
	,IfcSurfaceCurveSweptAreaSolid))
 SUBTYPE OF (IfcSolidModel);
	SweptArea : IfcProfileDef;
	Position : IfcAxis2Placement3D;
 WHERE
	WR22 : SweptArea.ProfileType = IfcProfileTypeEnum.Area;
END_ENTITY;

ENTITY IfcSweptDiskSolid
 SUBTYPE OF (IfcSolidModel);
	Directrix : IfcCurve;
	Radius : IfcPositiveLengthMeasure;
	InnerRadius : OPTIONAL IfcPositiveLengthMeasure;
	StartParam : IfcParameterValue;
	EndParam : IfcParameterValue;
 WHERE
	WR1 : Directrix.Dim = 3;
	WR2 : (NOT EXISTS(InnerRadius)) OR (Radius > InnerRadius);
END_ENTITY;

ENTITY IfcSweptSurface
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcSurfaceOfLinearExtrusion
	,IfcSurfaceOfRevolution))
 SUBTYPE OF (IfcSurface);
	SweptCurve : IfcProfileDef;
	Position : IfcAxis2Placement3D;
 DERIVE
	Dim : IfcDimensionCount := Position.Dim;
 WHERE
	WR1 : NOT('IFC2X3.IFCDERIVEDPROFILEDEF' IN TYPEOF(SweptCurve));
	WR2 : SweptCurve.ProfileType = IfcProfileTypeEnum.Curve;
END_ENTITY;

ENTITY IfcSwitchingDeviceType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcSwitchingDeviceTypeEnum;
END_ENTITY;

ENTITY IfcSymbolStyle
 SUBTYPE OF (IfcPresentationStyle);
	StyleOfSymbol : IfcSymbolStyleSelect;
END_ENTITY;

ENTITY IfcSystem
 SUPERTYPE OF (ONEOF
	(IfcElectricalCircuit
	,IfcStructuralAnalysisModel))
 SUBTYPE OF (IfcGroup);
 INVERSE
	ServicesBuildings : SET [0:1] OF IfcRelServicesBuildings FOR RelatingSystem;
END_ENTITY;

ENTITY IfcSystemFurnitureElementType
 SUBTYPE OF (IfcFurnishingElementType);
END_ENTITY;

ENTITY IfcTShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	Depth : IfcPositiveLengthMeasure;
	FlangeWidth : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	FlangeThickness : IfcPositiveLengthMeasure;
	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	FlangeEdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
	WebEdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
	WebSlope : OPTIONAL IfcPlaneAngleMeasure;
	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
	CentreOfGravityInY : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR1 : FlangeThickness < Depth;
	WR2 : WebThickness < FlangeWidth;
END_ENTITY;

ENTITY IfcTable;
	Name : STRING;
	Rows : LIST [1:?] OF IfcTableRow;
 DERIVE
	NumberOfCellsInRow : INTEGER := HIINDEX(Rows[1].RowCells);
	NumberOfHeadings : INTEGER := SIZEOF(QUERY( Temp <* Rows | Temp.IsHeading));
	NumberOfDataRows : INTEGER := SIZEOF(QUERY( Temp <* Rows | NOT(Temp.IsHeading)));
 WHERE
	WR1 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
	WR2 : SIZEOF(QUERY( Temp <* Rows | HIINDEX(Temp.RowCells) <> HIINDEX(Rows[1].RowCells))) = 0;
	WR3 : { 0 <= NumberOfHeadings <= 1 };
END_ENTITY;

ENTITY IfcTableRow;
	RowCells : LIST [1:?] OF IfcValue;
	IsHeading : BOOLEAN;
 INVERSE
	OfTable : IfcTable FOR Rows;
END_ENTITY;

ENTITY IfcTankType
 SUBTYPE OF (IfcFlowStorageDeviceType);
	PredefinedType : IfcTankTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcTankTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcTankTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTask
 SUPERTYPE OF (ONEOF
	(IfcMove
	,IfcOrderAction))
 SUBTYPE OF (IfcProcess);
	TaskId : IfcIdentifier;
	Status : OPTIONAL IfcLabel;
	WorkMethod : OPTIONAL IfcLabel;
	IsMilestone : BOOLEAN;
	Priority : OPTIONAL INTEGER;
 WHERE
	WR1 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.Decomposes | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
	WR2 : SIZEOF(QUERY(temp <* SELF\IfcObjectDefinition.IsDecomposedBy | NOT('IFC2X3.IFCRELNESTS' IN TYPEOF(temp)))) = 0;
	WR3 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcTelecomAddress
 SUBTYPE OF (IfcAddress);
	TelephoneNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
	FacsimileNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
	PagerNumber : OPTIONAL IfcLabel;
	ElectronicMailAddresses : OPTIONAL LIST [1:?] OF IfcLabel;
	WWWHomePageURL : OPTIONAL IfcLabel;
 WHERE
	WR1 : EXISTS (TelephoneNumbers) OR
            EXISTS (PagerNumber) OR
            EXISTS (FacsimileNumbers) OR 
            EXISTS (ElectronicMailAddresses) OR 
            EXISTS (WWWHomePageURL);
END_ENTITY;

ENTITY IfcTendon
 SUBTYPE OF (IfcReinforcingElement);
	PredefinedType : IfcTendonTypeEnum;
	NominalDiameter : IfcPositiveLengthMeasure;
	CrossSectionArea : IfcAreaMeasure;
	TensionForce : OPTIONAL IfcForceMeasure;
	PreStress : OPTIONAL IfcPressureMeasure;
	FrictionCoefficient : OPTIONAL IfcNormalisedRatioMeasure;
	AnchorageSlip : OPTIONAL IfcPositiveLengthMeasure;
	MinCurvatureRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR1 : (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcTendonAnchor
 SUBTYPE OF (IfcReinforcingElement);
END_ENTITY;

ENTITY IfcTerminatorSymbol
 SUPERTYPE OF (ONEOF
	(IfcDimensionCurveTerminator))
 SUBTYPE OF (IfcAnnotationSymbolOccurrence);
	AnnotatedCurve : IfcAnnotationCurveOccurrence;
END_ENTITY;

ENTITY IfcTextLiteral
 SUPERTYPE OF (ONEOF
	(IfcTextLiteralWithExtent))
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Literal : IfcPresentableText;
	Placement : IfcAxis2Placement;
	Path : IfcTextPath;
END_ENTITY;

ENTITY IfcTextLiteralWithExtent
 SUBTYPE OF (IfcTextLiteral);
	Extent : IfcPlanarExtent;
	BoxAlignment : IfcBoxAlignment;
 WHERE
	WR31 : NOT('IFC2X3.IFCPLANARBOX' IN TYPEOF(Extent));
END_ENTITY;

ENTITY IfcTextStyle
 SUBTYPE OF (IfcPresentationStyle);
	TextCharacterAppearance : OPTIONAL IfcCharacterStyleSelect;
	TextStyle : OPTIONAL IfcTextStyleSelect;
	TextFontStyle : IfcTextFontSelect;
END_ENTITY;

ENTITY IfcTextStyleFontModel
 SUBTYPE OF (IfcPreDefinedTextFont);
	FontFamily : OPTIONAL LIST [1:?] OF IfcTextFontName;
	FontStyle : OPTIONAL IfcFontStyle;
	FontVariant : OPTIONAL IfcFontVariant;
	FontWeight : OPTIONAL IfcFontWeight;
	FontSize : IfcSizeSelect;
 WHERE
	WR31 : ('IFC2X3.IFCLENGTHMEASURE' IN TYPEOF(SELF.FontSize)) AND
             (SELF.FontSize > 0.);
END_ENTITY;

ENTITY IfcTextStyleForDefinedFont;
	Colour : IfcColour;
	BackgroundColour : OPTIONAL IfcColour;
END_ENTITY;

ENTITY IfcTextStyleTextModel;
	TextIndent : OPTIONAL IfcSizeSelect;
	TextAlign : OPTIONAL IfcTextAlignment;
	TextDecoration : OPTIONAL IfcTextDecoration;
	LetterSpacing : OPTIONAL IfcSizeSelect;
	WordSpacing : OPTIONAL IfcSizeSelect;
	TextTransform : OPTIONAL IfcTextTransformation;
	LineHeight : OPTIONAL IfcSizeSelect;
END_ENTITY;

ENTITY IfcTextStyleWithBoxCharacteristics;
	BoxHeight : OPTIONAL IfcPositiveLengthMeasure;
	BoxWidth : OPTIONAL IfcPositiveLengthMeasure;
	BoxSlantAngle : OPTIONAL IfcPlaneAngleMeasure;
	BoxRotateAngle : OPTIONAL IfcPlaneAngleMeasure;
	CharacterSpacing : OPTIONAL IfcSizeSelect;
END_ENTITY;

ENTITY IfcTextureCoordinate
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcTextureCoordinateGenerator
	,IfcTextureMap));
 INVERSE
	AnnotatedSurface : SET [1:1] OF IfcAnnotationSurface FOR TextureCoordinates;
END_ENTITY;

ENTITY IfcTextureCoordinateGenerator
 SUBTYPE OF (IfcTextureCoordinate);
	Mode : IfcLabel;
	Parameter : LIST [1:?] OF IfcSimpleValue;
END_ENTITY;

ENTITY IfcTextureMap
 SUBTYPE OF (IfcTextureCoordinate);
	TextureMaps : SET [1:?] OF IfcVertexBasedTextureMap;
 WHERE
	WR11 : SIZEOF([
               'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
               'IFC2X3.IFCFACEBASEDSURFACEMODEL',
               'IFC2X3.IFCFACETEDBREP',
               'IFC2X3.IFCFACETEDBREPWITHVOIDS'] 
              * TYPEOF(SELF\IfcTextureCoordinate.AnnotatedSurface[1].Item)
               ) >= 1;
END_ENTITY;

ENTITY IfcTextureVertex;
	Coordinates : LIST [2:2] OF IfcParameterValue;
END_ENTITY;

ENTITY IfcThermalMaterialProperties
 SUBTYPE OF (IfcMaterialProperties);
	SpecificHeatCapacity : OPTIONAL IfcSpecificHeatCapacityMeasure;
	BoilingPoint : OPTIONAL IfcThermodynamicTemperatureMeasure;
	FreezingPoint : OPTIONAL IfcThermodynamicTemperatureMeasure;
	ThermalConductivity : OPTIONAL IfcThermalConductivityMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcTimeSeries
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcIrregularTimeSeries
	,IfcRegularTimeSeries));
	Name : IfcLabel;
	Description : OPTIONAL IfcText;
	StartTime : IfcDateTimeSelect;
	EndTime : IfcDateTimeSelect;
	TimeSeriesDataType : IfcTimeSeriesDataTypeEnum;
	DataOrigin : IfcDataOriginEnum;
	UserDefinedDataOrigin : OPTIONAL IfcLabel;
	Unit : OPTIONAL IfcUnit;
 INVERSE
	DocumentedBy : SET [0:1] OF IfcTimeSeriesReferenceRelationship FOR ReferencedTimeSeries;
END_ENTITY;

ENTITY IfcTimeSeriesReferenceRelationship;
	ReferencedTimeSeries : IfcTimeSeries;
	TimeSeriesReferences : SET [1:?] OF IfcDocumentSelect;
END_ENTITY;

ENTITY IfcTimeSeriesSchedule
 SUBTYPE OF (IfcControl);
	ApplicableDates : OPTIONAL LIST [1:?] OF IfcDateTimeSelect;
	TimeSeriesScheduleType : IfcTimeSeriesScheduleTypeEnum;
	TimeSeries : IfcTimeSeries;
 WHERE
	WR41 : NOT(TimeSeriesScheduleType=IfcTimeSeriesScheduleTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcTimeSeriesValue;
	ListValues : LIST [1:?] OF IfcValue;
END_ENTITY;

ENTITY IfcTopologicalRepresentationItem
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcConnectedFaceSet
	,IfcEdge
	,IfcFace
	,IfcFaceBound
	,IfcLoop
	,IfcPath
	,IfcVertex))
 SUBTYPE OF (IfcRepresentationItem);
END_ENTITY;

ENTITY IfcTopologyRepresentation
 SUBTYPE OF (IfcShapeModel);
 WHERE
	WR21 : SIZEOF(QUERY(temp <* SELF\IfcRepresentation.Items | 
               NOT('IFC2X3.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp))
             )) = 0;
	WR22 : EXISTS(SELF\IfcRepresentation.RepresentationType);
	WR23 : IfcTopologyRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
END_ENTITY;

ENTITY IfcTransformerType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcTransformerTypeEnum;
END_ENTITY;

ENTITY IfcTransportElement
 SUBTYPE OF (IfcElement);
	OperationType : OPTIONAL IfcTransportElementTypeEnum;
	CapacityByWeight : OPTIONAL IfcMassMeasure;
	CapacityByNumber : OPTIONAL IfcCountMeasure;
END_ENTITY;

ENTITY IfcTransportElementType
 SUBTYPE OF (IfcElementType);
	PredefinedType : IfcTransportElementTypeEnum;
END_ENTITY;

ENTITY IfcTrapeziumProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	BottomXDim : IfcPositiveLengthMeasure;
	TopXDim : IfcPositiveLengthMeasure;
	YDim : IfcPositiveLengthMeasure;
	TopXOffset : IfcLengthMeasure;
END_ENTITY;

ENTITY IfcTrimmedCurve
 SUBTYPE OF (IfcBoundedCurve);
	BasisCurve : IfcCurve;
	Trim1 : SET [1:2] OF IfcTrimmingSelect;
	Trim2 : SET [1:2] OF IfcTrimmingSelect;
	SenseAgreement : BOOLEAN;
	MasterRepresentation : IfcTrimmingPreference;
 WHERE
	WR41 : (HIINDEX(Trim1) = 1) OR (TYPEOF(Trim1[1]) <> TYPEOF(Trim1[2]));
	WR42 : (HIINDEX(Trim2) = 1) OR (TYPEOF(Trim2[1]) <> TYPEOF(Trim2[2]));
	WR43 : NOT('IFC2X3.IFCBOUNDEDCURVE' IN TYPEOF(BasisCurve));
END_ENTITY;

ENTITY IfcTubeBundleType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcTubeBundleTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTwoDirectionRepeatFactor
 SUBTYPE OF (IfcOneDirectionRepeatFactor);
	SecondRepeatFactor : IfcVector;
END_ENTITY;

ENTITY IfcTypeObject
 SUPERTYPE OF (ONEOF
	(IfcTypeProduct))
 SUBTYPE OF (IfcObjectDefinition);
	ApplicableOccurrence : OPTIONAL IfcLabel;
	HasPropertySets : OPTIONAL SET [1:?] OF IfcPropertySetDefinition;
 INVERSE
	ObjectTypeOf : SET [0:1] OF IfcRelDefinesByType FOR RelatingType;
 WHERE
	WR1 : EXISTS(SELF\IfcRoot.Name);
END_ENTITY;

ENTITY IfcTypeProduct
 SUPERTYPE OF (ONEOF
	(IfcDoorStyle
	,IfcElementType
	,IfcWindowStyle))
 SUBTYPE OF (IfcTypeObject);
	RepresentationMaps : OPTIONAL LIST [1:?] OF UNIQUE IfcRepresentationMap;
	Tag : OPTIONAL IfcLabel;
 WHERE
	WR41 : NOT(EXISTS(SELF\IfcTypeObject.ObjectTypeOf[1])) OR
             (SIZEOF(QUERY(temp <* SELF\IfcTypeObject.ObjectTypeOf[1].RelatedObjects |
               NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp)))
             ) = 0);
END_ENTITY;

ENTITY IfcUShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	Depth : IfcPositiveLengthMeasure;
	FlangeWidth : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	FlangeThickness : IfcPositiveLengthMeasure;
	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
	FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
	CentreOfGravityInX : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR21 : FlangeThickness < (Depth / 2.);
	WR22 : WebThickness < FlangeWidth;
END_ENTITY;

ENTITY IfcUnitAssignment;
	Units : SET [1:?] OF IfcUnit;
 WHERE
	WR01 : IfcCorrectUnitAssignment(Units);
END_ENTITY;

ENTITY IfcUnitaryEquipmentType
 SUBTYPE OF (IfcEnergyConversionDeviceType);
	PredefinedType : IfcUnitaryEquipmentTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcValveType
 SUBTYPE OF (IfcFlowControllerType);
	PredefinedType : IfcValveTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcValveTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcValveTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcVector
 SUBTYPE OF (IfcGeometricRepresentationItem);
	Orientation : IfcDirection;
	Magnitude : IfcLengthMeasure;
 DERIVE
	Dim : IfcDimensionCount := Orientation.Dim;
 WHERE
	WR1 : Magnitude >= 0.0;
END_ENTITY;

ENTITY IfcVertex
 SUPERTYPE OF (ONEOF
	(IfcVertexPoint))
 SUBTYPE OF (IfcTopologicalRepresentationItem);
END_ENTITY;

ENTITY IfcVertexBasedTextureMap;
	TextureVertices : LIST [3:?] OF IfcTextureVertex;
	TexturePoints : LIST [3:?] OF IfcCartesianPoint;
END_ENTITY;

ENTITY IfcVertexLoop
 SUBTYPE OF (IfcLoop);
	LoopVertex : IfcVertex;
END_ENTITY;

ENTITY IfcVertexPoint
 SUBTYPE OF (IfcVertex);
	VertexGeometry : IfcPoint;
END_ENTITY;

ENTITY IfcVibrationIsolatorType
 SUBTYPE OF (IfcDiscreteAccessoryType);
	PredefinedType : IfcVibrationIsolatorTypeEnum;
 WHERE
	WR1 : (PredefinedType <> IfcVibrationIsolatorTypeEnum.USERDEFINED) OR
            ((PredefinedType = IfcVibrationIsolatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcVirtualElement
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcVirtualGridIntersection;
	IntersectingAxes : LIST [2:2] OF UNIQUE IfcGridAxis;
	OffsetDistances : LIST [2:3] OF IfcLengthMeasure;
END_ENTITY;

ENTITY IfcWall
 SUPERTYPE OF (ONEOF
	(IfcWallStandardCase))
 SUBTYPE OF (IfcBuildingElement);
 WHERE
	WR1 : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations |
              'IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)
              )) <= 1;
END_ENTITY;

ENTITY IfcWallStandardCase
 SUBTYPE OF (IfcWall);
 WHERE
	WR1 : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFC2X3.IFCRELASSOCIATES.RELATEDOBJECTS') |
                          ('IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND
                          ('IFC2X3.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial))
                          )) = 1;
END_ENTITY;

ENTITY IfcWallType
 SUBTYPE OF (IfcBuildingElementType);
	PredefinedType : IfcWallTypeEnum;
END_ENTITY;

ENTITY IfcWasteTerminalType
 SUBTYPE OF (IfcFlowTerminalType);
	PredefinedType : IfcWasteTerminalTypeEnum;
END_ENTITY;

ENTITY IfcWaterProperties
 SUBTYPE OF (IfcMaterialProperties);
	IsPotable : OPTIONAL BOOLEAN;
	Hardness : OPTIONAL IfcIonConcentrationMeasure;
	AlkalinityConcentration : OPTIONAL IfcIonConcentrationMeasure;
	AcidityConcentration : OPTIONAL IfcIonConcentrationMeasure;
	ImpuritiesContent : OPTIONAL IfcNormalisedRatioMeasure;
	PHLevel : OPTIONAL IfcPHMeasure;
	DissolvedSolidsContent : OPTIONAL IfcNormalisedRatioMeasure;
 UNIQUE
	UR11 : Material;
END_ENTITY;

ENTITY IfcWindow
 SUBTYPE OF (IfcBuildingElement);
	OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
	OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcWindowLiningProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
	LiningThickness : OPTIONAL IfcPositiveLengthMeasure;
	TransomThickness : OPTIONAL IfcPositiveLengthMeasure;
	MullionThickness : OPTIONAL IfcPositiveLengthMeasure;
	FirstTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
	SecondTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
	FirstMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
	SecondMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
 WHERE
	WR31 : NOT(NOT(EXISTS(LiningDepth)) AND EXISTS(LiningThickness));
	WR32 : NOT(NOT(EXISTS(FirstTransomOffset)) AND EXISTS(SecondTransomOffset));
	WR33 : NOT(NOT(EXISTS(FirstMullionOffset)) AND EXISTS(SecondMullionOffset));
	WR34 : EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1]) AND 
             ('IFC2X3.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1]));
END_ENTITY;

ENTITY IfcWindowPanelProperties
 SUBTYPE OF (IfcPropertySetDefinition);
	OperationType : IfcWindowPanelOperationEnum;
	PanelPosition : IfcWindowPanelPositionEnum;
	FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
	FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
	ShapeAspectStyle : OPTIONAL IfcShapeAspect;
END_ENTITY;

ENTITY IfcWindowStyle
 SUBTYPE OF (IfcTypeProduct);
	ConstructionType : IfcWindowStyleConstructionEnum;
	OperationType : IfcWindowStyleOperationEnum;
	ParameterTakesPrecedence : BOOLEAN;
	Sizeable : BOOLEAN;
END_ENTITY;

ENTITY IfcWorkControl
 ABSTRACT SUPERTYPE OF (ONEOF
	(IfcWorkPlan
	,IfcWorkSchedule))
 SUBTYPE OF (IfcControl);
	Identifier : IfcIdentifier;
	CreationDate : IfcDateTimeSelect;
	Creators : OPTIONAL SET [1:?] OF IfcPerson;
	Purpose : OPTIONAL IfcLabel;
	Duration : OPTIONAL IfcTimeMeasure;
	TotalFloat : OPTIONAL IfcTimeMeasure;
	StartTime : IfcDateTimeSelect;
	FinishTime : OPTIONAL IfcDateTimeSelect;
	WorkControlType : OPTIONAL IfcWorkControlTypeEnum;
	UserDefinedControlType : OPTIONAL IfcLabel;
 WHERE
	WR1 : (WorkControlType <> IfcWorkControlTypeEnum.USERDEFINED) OR
            ((WorkControlType = IfcWorkControlTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcWorkControl.UserDefinedControlType));
END_ENTITY;

ENTITY IfcWorkPlan
 SUBTYPE OF (IfcWorkControl);
END_ENTITY;

ENTITY IfcWorkSchedule
 SUBTYPE OF (IfcWorkControl);
END_ENTITY;

ENTITY IfcZShapeProfileDef
 SUBTYPE OF (IfcParameterizedProfileDef);
	Depth : IfcPositiveLengthMeasure;
	FlangeWidth : IfcPositiveLengthMeasure;
	WebThickness : IfcPositiveLengthMeasure;
	FlangeThickness : IfcPositiveLengthMeasure;
	FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
	EdgeRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
	WR21 : FlangeThickness < (Depth / 2.);
END_ENTITY;

ENTITY IfcZone
 SUBTYPE OF (IfcGroup);
 WHERE
	WR1 : SIZEOF (QUERY (temp <* SELF\IfcGroup.IsGroupedBy.RelatedObjects |  NOT(('IFC2X3.IFCZONE' IN TYPEOF(temp)) OR ('IFC2X3.IFCSPACE' IN TYPEOF(temp))) )) = 0;
END_ENTITY;

FUNCTION IfcAddToBeginOfList
	(AScalar : GENERIC;
       AList   : LIST OF GENERIC:AL)
	: LIST[1:?] OF GENERIC:AL;
    
      LOCAL
        Result : LIST OF GENERIC:AL := [];
      END_LOCAL;
  
    IF NOT(EXISTS(AScalar)) THEN
      Result := AList;
    ELSE
      Result := Result + AScalar;
      IF (HIINDEX(AList) >= 1) THEN
        REPEAT i:=1 TO HIINDEX(AList);
          Result[i+1] := AList[i];
        END_REPEAT;
      END_IF;
    END_IF;
    RETURN(Result);
END_FUNCTION;

FUNCTION IfcBaseAxis
	(Dim : INTEGER; 
     Axis1, Axis2, Axis3 : IfcDirection)
	: LIST [2:3] OF IfcDirection;
  
  LOCAL
    U : LIST [2:3] OF IfcDirection;
    Factor : REAL;
    D1, D2 : IfcDirection;
  END_LOCAL;
  
    IF (Dim = 3) THEN 
      D1 := NVL(IfcNormalise(Axis3), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
      D2 := IfcFirstProjAxis(D1, Axis1);
      U  := [D2, IfcSecondProjAxis(D1, D2, Axis2), D1];
    ELSE
      IF EXISTS(Axis1) THEN
        D1 := IfcNormalise(Axis1);
        U  := [D1, IfcOrthogonalComplement(D1)];
        IF EXISTS(Axis2) THEN
          Factor := IfcDotProduct(Axis2, U[2]);
          IF (Factor < 0.0) THEN
            U[2].DirectionRatios[1] := -U[2].DirectionRatios[1];
            U[2].DirectionRatios[2] := -U[2].DirectionRatios[2];
          END_IF;
        END_IF;
      ELSE
        IF EXISTS(Axis2) THEN
          D1 := IfcNormalise(Axis2);
          U  := [IfcOrthogonalComplement(D1), D1];
          U[1].DirectionRatios[1] := -U[1].DirectionRatios[1];
          U[1].DirectionRatios[2] := -U[1].DirectionRatios[2];
          ELSE
            U := [IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0, 0.0]), 
                  IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0, 1.0])];
        END_IF;
      END_IF;
    END_IF;
    RETURN(U);
END_FUNCTION;

FUNCTION IfcBooleanChoose
	(B : BOOLEAN ;
       Choice1, Choice2 : Generic : Item)
	: Generic : Item;
    IF B THEN
       RETURN (Choice1);
    ELSE
       RETURN (Choice2);
    END_IF;
END_FUNCTION;

FUNCTION IfcBuild2Axes
	(RefDirection : IfcDirection)
	: LIST [2:2] OF IfcDirection;
  LOCAL
    D : IfcDirection := NVL(IfcNormalise(RefDirection),
        IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0]));
  END_LOCAL;
    RETURN([D, IfcOrthogonalComplement(D)]);
END_FUNCTION;

FUNCTION IfcBuildAxes
	(Axis, RefDirection : IfcDirection)
	: LIST [3:3] OF IfcDirection;
  LOCAL
    D1, D2 : IfcDirection;
  END_LOCAL;
    D1 := NVL(IfcNormalise(Axis), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
    D2 := IfcFirstProjAxis(D1, RefDirection);
    RETURN ([D2, IfcNormalise(IfcCrossProduct(D1,D2)).Orientation, D1]);
END_FUNCTION;

FUNCTION IfcCorrectDimensions
	(m   : IfcUnitEnum; Dim : IfcDimensionalExponents)
	: LOGICAL;  
  CASE m OF
    LENGTHUNIT : IF
      Dim = (IfcDimensionalExponents (1, 0, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    MASSUNIT : IF
      Dim = (IfcDimensionalExponents (0, 1, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    TIMEUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 1, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICCURRENTUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    THERMODYNAMICTEMPERATUREUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 1, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    AMOUNTOFSUBSTANCEUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 1, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    LUMINOUSINTENSITYUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    PLANEANGLEUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    SOLIDANGLEUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    AREAUNIT : IF
      Dim = (IfcDimensionalExponents (2, 0, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    VOLUMEUNIT : IF
      Dim = (IfcDimensionalExponents (3, 0, 0, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
  
    ABSORBEDDOSEUNIT : IF
      Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    RADIOACTIVITYUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICCAPACITANCEUNIT : IF
      Dim = (IfcDimensionalExponents (-2, 1, 4, 1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    DOSEEQUIVALENTUNIT : IF
      Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICCHARGEUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 1, 1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICCONDUCTANCEUNIT : IF
      Dim = (IfcDimensionalExponents (-2, -1, 3, 2, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICVOLTAGEUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -3, -1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ELECTRICRESISTANCEUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -3, -2, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ENERGYUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -2, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    FORCEUNIT : IF
      Dim = (IfcDimensionalExponents (1, 1, -2, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    FREQUENCYUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    INDUCTANCEUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -2, -2, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    ILLUMINANCEUNIT : IF
      Dim = (IfcDimensionalExponents (-2, 0, 0, 0, 0, 0, 1))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    LUMINOUSFLUXUNIT : IF
      Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    MAGNETICFLUXUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -2, -1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    MAGNETICFLUXDENSITYUNIT : IF
      Dim = (IfcDimensionalExponents (0, 1, -2, -1, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    POWERUNIT : IF
      Dim = (IfcDimensionalExponents (2, 1, -3, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
    PRESSUREUNIT : IF
      Dim = (IfcDimensionalExponents (-1, 1, -2, 0, 0, 0, 0))
        THEN RETURN(TRUE);
        ELSE RETURN(FALSE);
      END_IF;
  
    OTHERWISE :
      RETURN (UNKNOWN);
  END_CASE;
END_FUNCTION;

FUNCTION IfcCorrectLocalPlacement
	(AxisPlacement:IfcAxis2Placement; 
     RelPlacement : IfcObjectPlacement)
	: LOGICAL;
  
    IF (EXISTS(RelPlacement)) THEN
      IF ('IFC2X3.IFCGRIDPLACEMENT' IN TYPEOF(RelPlacement)) THEN
        RETURN(?);
      END_IF;
      IF ('IFC2X3.IFCLOCALPLACEMENT' IN TYPEOF(RelPlacement)) THEN
        IF ('IFC2X3.IFCAXIS2PLACEMENT2D' IN TYPEOF(AxisPlacement)) THEN
          RETURN(TRUE);
        END_IF;
        IF ('IFC2X3.IFCAXIS2PLACEMENT3D' IN TYPEOF(AxisPlacement)) THEN
          IF (RelPlacement.RelativePlacement.Dim = 3) THEN
            RETURN(TRUE);
          ELSE
            RETURN(FALSE);
          END_IF;
        END_IF;
      END_IF;
    ELSE
      RETURN(TRUE);  
    END_IF;
    RETURN(?);
END_FUNCTION;

FUNCTION IfcCorrectObjectAssignment
	(Constraint: IfcObjectTypeEnum; Objects : SET[1:?] OF IfcObjectDefinition)
	: LOGICAL;
    
  LOCAL
    Count : INTEGER := 0;
  END_LOCAL;
  
      IF NOT(EXISTS(Constraint)) THEN 
        RETURN(TRUE);
      END_IF;
    
      CASE Constraint OF
        IfcObjectTypeEnum.NOTDEFINED : RETURN(TRUE);
        IfcObjectTypeEnum.PRODUCT :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPRODUCT' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.PROCESS :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPROCESS' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.CONTROL :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCCONTROL' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.RESOURCE :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCRESOURCE' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.ACTOR :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCACTOR' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.GROUP :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCGROUP' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        IfcObjectTypeEnum.PROJECT :
          BEGIN
            Count := SIZEOF(QUERY(temp <* Objects | NOT('IFC2X3.IFCPROJECT' IN TYPEOF(temp))));
            RETURN(Count = 0);
          END;
        OTHERWISE : RETURN(?);
      END_CASE;
END_FUNCTION;

FUNCTION IfcCorrectUnitAssignment
	(Units : SET [1:?] OF IfcUnit)
	: LOGICAL;
  
    LOCAL
      NamedUnitNumber    : INTEGER := 0;
      DerivedUnitNumber  : INTEGER := 0;
      MonetaryUnitNumber : INTEGER := 0;
      NamedUnitNames     : SET OF IfcUnitEnum := [];
      DerivedUnitNames   : SET OF IfcDerivedUnitEnum := [];
    END_LOCAL;
  
    NamedUnitNumber    := SIZEOF(QUERY(temp <* Units | ('IFC2X3.IFCNAMEDUNIT' IN TYPEOF(temp)) AND NOT(temp.UnitType = IfcUnitEnum.USERDEFINED)));
    DerivedUnitNumber  := SIZEOF(QUERY(temp <* Units | ('IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(temp)) AND NOT(temp.UnitType = IfcDerivedUnitEnum.USERDEFINED)));
    MonetaryUnitNumber := SIZEOF(QUERY(temp <* Units |  'IFC2X3.IFCMONETARYUNIT' IN TYPEOF(temp)));
  
    REPEAT i := 1 TO SIZEOF(Units);
      IF (('IFC2X3.IFCNAMEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i].UnitType = IfcUnitEnum.USERDEFINED)) THEN
          NamedUnitNames := NamedUnitNames + Units[i].UnitType;
      END_IF;
      IF (('IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i].UnitType = IfcDerivedUnitEnum.USERDEFINED)) THEN
          DerivedUnitNames := DerivedUnitNames + Units[i].UnitType;
      END_IF;
    END_REPEAT;
  
    RETURN((SIZEOF(NamedUnitNames) = NamedUnitNumber) AND (SIZEOF(DerivedUnitNames) = DerivedUnitNumber) AND (MonetaryUnitNumber <= 1));
END_FUNCTION;

FUNCTION IfcCrossProduct
	(Arg1, Arg2 : IfcDirection)
	: IfcVector;
  LOCAL
    Mag : REAL;
    Res : IfcDirection;
    V1,V2  : LIST[3:3] OF REAL;
    Result : IfcVector;
  END_LOCAL;
  
    IF (NOT EXISTS (Arg1) OR (Arg1.Dim = 2)) OR (NOT EXISTS (Arg2) OR (Arg2.Dim = 2)) THEN
      RETURN(?);
    ELSE
      BEGIN
        V1  := IfcNormalise(Arg1).DirectionRatios;
        V2  := IfcNormalise(Arg2).DirectionRatios;
        Res := IfcRepresentationItem() || IfcGeometricRepresentationItem () 
               || IfcDirection([(V1[2]*V2[3] - V1[3]*V2[2]), (V1[3]*V2[1] - V1[1]*V2[3]), (V1[1]*V2[2] - V1[2]*V2[1])]);
        Mag := 0.0;
        REPEAT i := 1 TO 3;
          Mag := Mag + Res.DirectionRatios[i]*Res.DirectionRatios[i];
        END_REPEAT;
        IF (Mag > 0.0) THEN
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Res, SQRT(Mag));
        ELSE
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Arg1, 0.0);
        END_IF;
        RETURN(Result);
      END;
    END_IF;
END_FUNCTION;

FUNCTION IfcCurveDim
	(Curve : IfcCurve)
	: IfcDimensionCount;
  
    IF ('IFC2X3.IFCLINE' IN TYPEOF(Curve))
      THEN RETURN(Curve.Pnt.Dim);
    END_IF;
    IF ('IFC2X3.IFCCONIC' IN TYPEOF(Curve))
      THEN RETURN(Curve.Position.Dim);
    END_IF;
    IF ('IFC2X3.IFCPOLYLINE' IN TYPEOF(Curve))
      THEN RETURN(Curve.Points[1].Dim);
    END_IF;
    IF ('IFC2X3.IFCTRIMMEDCURVE' IN TYPEOF(Curve))
      THEN RETURN(IfcCurveDim(Curve.BasisCurve));
    END_IF;
    IF ('IFC2X3.IFCCOMPOSITECURVE' IN TYPEOF(Curve))
      THEN RETURN(Curve.Segments[1].Dim);
    END_IF;
    IF ('IFC2X3.IFCBSPLINECURVE' IN TYPEOF(Curve))
      THEN RETURN(Curve.ControlPointsList[1].Dim);
    END_IF;
    IF ('IFC2X3.IFCOFFSETCURVE2D' IN TYPEOF(Curve))
      THEN RETURN(2); 
    END_IF;
    IF ('IFC2X3.IFCOFFSETCURVE3D' IN TYPEOF(Curve))
      THEN RETURN(3);
    END_IF;
  RETURN (?);
END_FUNCTION;

FUNCTION IfcCurveWeightsPositive
	(B: IfcRationalBezierCurve)
	: BOOLEAN;
     LOCAL
       Result : BOOLEAN := TRUE;
     END_LOCAL;
  
     REPEAT i := 0 TO B.UpperIndexOnControlPoints;
       IF B.Weights[i] <= 0.0  THEN
         Result := FALSE;
         RETURN(Result);
       END_IF;
     END_REPEAT;
     RETURN(Result);
END_FUNCTION;

FUNCTION IfcDeriveDimensionalExponents
	(x : IfcUnit)
	: IfcDimensionalExponents;  
    LOCAL
      Result : IfcDimensionalExponents :=
               IfcDimensionalExponents(0, 0, 0, 0, 0, 0, 0);  
    END_LOCAL;
    IF 'IFC2X3.IFCDERIVEDUNIT' IN TYPEOF(x) THEN
      REPEAT i := LOINDEX(x.Elements) TO HIINDEX(x.Elements);
        Result.LengthExponent :=        Result.LengthExponent +
          (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.LengthExponent);
        Result.MassExponent :=        Result.MassExponent  +
          (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.MassExponent);
        Result.TimeExponent :=        Result.TimeExponent +
          (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.TimeExponent);
        Result.ElectricCurrentExponent :=        Result.ElectricCurrentExponent +
          (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.ElectricCurrentExponent);
        Result.ThermodynamicTemperatureExponent :=
          Result.ThermodynamicTemperatureExponent +
          (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.ThermodynamicTemperatureExponent);
        Result.AmountOfSubstanceExponent :=
          Result.AmountOfSubstanceExponent +        (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.AmountOfSubstanceExponent);
        Result.LuminousIntensityExponent :=
          Result.LuminousIntensityExponent +        (x.Elements[i].Exponent *
           x.Elements[i].Unit.Dimensions.LuminousIntensityExponent);
      END_REPEAT;  
    ELSE 
      Result := x.Dimensions;  
    END_IF;  
  RETURN (Result);
END_FUNCTION;

FUNCTION IfcDimensionsForSiUnit
	(n : IfcSiUnitName )
	: IfcDimensionalExponents;
    CASE n OF
      METRE          : RETURN (IfcDimensionalExponents
                               (1, 0, 0, 0, 0, 0, 0));
      SQUARE_METRE   : RETURN (IfcDimensionalExponents
                               (2, 0, 0, 0, 0, 0, 0));
      CUBIC_METRE    : RETURN (IfcDimensionalExponents
                               (3, 0, 0, 0, 0, 0, 0));
      GRAM           : RETURN (IfcDimensionalExponents
                               (0, 1, 0, 0, 0, 0, 0));
      SECOND         : RETURN (IfcDimensionalExponents
                               (0, 0, 1, 0, 0, 0, 0));
      AMPERE         : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 1, 0, 0, 0));
      KELVIN         : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 1, 0, 0));
      MOLE           : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 1, 0));
      CANDELA        : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 0, 1));
      RADIAN         : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 0, 0));
      STERADIAN      : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 0, 0));
      HERTZ          : RETURN (IfcDimensionalExponents
                               (0, 0, -1, 0, 0, 0, 0));
      NEWTON         : RETURN (IfcDimensionalExponents
                               (1, 1, -2, 0, 0, 0, 0));
      PASCAL         : RETURN (IfcDimensionalExponents
                               (-1, 1, -2, 0, 0, 0, 0));
      JOULE          : RETURN (IfcDimensionalExponents
                               (2, 1, -2, 0, 0, 0, 0));
      WATT           : RETURN (IfcDimensionalExponents
                               (2, 1, -3, 0, 0, 0, 0));
      COULOMB        : RETURN (IfcDimensionalExponents
                               (0, 0, 1, 1, 0, 0, 0));
      VOLT           : RETURN (IfcDimensionalExponents
                               (2, 1, -3, -1, 0, 0, 0));
      FARAD          : RETURN (IfcDimensionalExponents
                               (-2, -1, 4, 1, 0, 0, 0));
      OHM            : RETURN (IfcDimensionalExponents
                               (2, 1, -3, -2, 0, 0, 0));
      SIEMENS        : RETURN (IfcDimensionalExponents
                               (-2, -1, 3, 2, 0, 0, 0));
      WEBER          : RETURN (IfcDimensionalExponents
                               (2, 1, -2, -1, 0, 0, 0));
      TESLA          : RETURN (IfcDimensionalExponents
                               (0, 1, -2, -1, 0, 0, 0));
      HENRY          : RETURN (IfcDimensionalExponents
                               (2, 1, -2, -2, 0, 0, 0));
      DEGREE_CELSIUS : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 1, 0, 0));
      LUMEN          : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 0, 1));
      LUX            : RETURN (IfcDimensionalExponents
                               (-2, 0, 0, 0, 0, 0, 1));
      BECQUEREL      : RETURN (IfcDimensionalExponents
                               (0, 0, -1, 0, 0, 0, 0));
      GRAY           : RETURN (IfcDimensionalExponents
                               (2, 0, -2, 0, 0, 0, 0));
      SIEVERT        : RETURN (IfcDimensionalExponents
                               (2, 0, -2, 0, 0, 0, 0));
      OTHERWISE      : RETURN (IfcDimensionalExponents
                               (0, 0, 0, 0, 0, 0, 0));
    END_CASE;
END_FUNCTION;

FUNCTION IfcDotProduct
	(Arg1, Arg2 : IfcDirection)
	: REAL;
  LOCAL
    Scalar : REAL;
    Vec1, Vec2 : IfcDirection;
    Ndim   : INTEGER;
  END_LOCAL;
  
    IF NOT EXISTS (Arg1) OR NOT EXISTS (Arg2) THEN
      Scalar := ?;
    ELSE
      IF (Arg1.Dim <> Arg2.Dim) THEN
        Scalar := ?;
      ELSE
        BEGIN
          Vec1 := IfcNormalise(Arg1);
          Vec2 := IfcNormalise(Arg2);
          Ndim := Arg1.Dim;
          Scalar := 0.0;
          REPEAT i := 1 TO Ndim;
            Scalar := Scalar + Vec1.DirectionRatios[i]*Vec2.DirectionRatios[i];
          END_REPEAT;
        END;
      END_IF;
    END_IF;
    RETURN (Scalar);
END_FUNCTION;

FUNCTION IfcFirstProjAxis
	(ZAxis, Arg : IfcDirection)
	: IfcDirection;
  LOCAL
    XAxis : IfcDirection;
    V     : IfcDirection;
    Z     : IfcDirection;
    XVec  : IfcVector;
  END_LOCAL;
  
    IF (NOT EXISTS(ZAxis)) THEN
      RETURN (?) ;
    ELSE
      Z := IfcNormalise(ZAxis);
      IF NOT EXISTS(Arg) THEN
        IF (Z.DirectionRatios <> [1.0,0.0,0.0]) THEN
          V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0,0.0]);
        ELSE
          V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
        END_IF;
      ELSE
        IF (Arg.Dim <> 3) THEN
          RETURN (?) ;
        END_IF;
        IF ((IfcCrossProduct(Arg,Z).Magnitude) = 0.0) THEN
          RETURN (?);
        ELSE
          V := IfcNormalise(Arg);
        END_IF;
      END_IF;
      XVec  := IfcScalarTimesVector(IfcDotProduct(V, Z), Z);
      XAxis := IfcVectorDifference(V, XVec).Orientation;
      XAxis := IfcNormalise(XAxis);
    END_IF;
    RETURN(XAxis);
END_FUNCTION;

FUNCTION IfcLeapYear
	(Year : IfcYearNumber)
	: BOOLEAN;
  
  IF ((((Year MOD 4) = 0) AND ((Year MOD 100) <> 0)) OR
              ((Year MOD 400) = 0)) THEN
    RETURN(TRUE);
  ELSE
    RETURN(FALSE);
  END_IF;
END_FUNCTION;

FUNCTION IfcListToArray
	(Lis : LIST [0:?] OF GENERIC : T;
         Low,U : INTEGER)
	: ARRAY OF GENERIC : T;
     LOCAL
       N   : INTEGER;
       Res : ARRAY [Low:U] OF GENERIC : T;
     END_LOCAL;
        
     N := SIZEOF(Lis);
     IF (N <> (U-Low +1)) THEN
       RETURN(?);
     ELSE
       Res := [Lis[1] : N];
       REPEAT i := 2 TO N;
         Res[Low+i-1] := Lis[i];
       END_REPEAT;
       RETURN(Res);
     END_IF;
END_FUNCTION;

FUNCTION IfcLoopHeadToTail
	(ALoop : IfcEdgeLoop)
	: LOGICAL;
     LOCAL
       N : INTEGER;
       P : LOGICAL := TRUE;
     END_LOCAL;
       
       N := SIZEOF (ALoop.EdgeList);
       REPEAT i := 2 TO N;
         P := P AND (ALoop.EdgeList[i-1].EdgeEnd :=:
                     ALoop.EdgeList[i].EdgeStart);
       END_REPEAT;     
       RETURN (P);
END_FUNCTION;

FUNCTION IfcMlsTotalThickness
	(LayerSet : IfcMaterialLayerSet)
	: IfcLengthMeasure;
    LOCAL
      Max : IfcLengthMeasure := LayerSet.MaterialLayers[1].LayerThickness;    
    END_LOCAL;
  
    IF SIZEOF(LayerSet.MaterialLayers) > 1 THEN
      REPEAT i := 2 TO HIINDEX(LayerSet.MaterialLayers);
         Max := Max + LayerSet.MaterialLayers[i].LayerThickness;
      END_REPEAT;
    END_IF;
    RETURN (Max);
END_FUNCTION;

FUNCTION IfcNoOfLayers
	(Element : IfcElement )
	: INTEGER;
      
      LOCAL
        Association : BAG OF IfcRelAssociates := [];
        MaterialAssociation : SET OF IfcRelAssociatesMaterial := [];
      END_LOCAL;
      
      Association := USEDIN(Element, 'IFC2X3.IFCRELASSOCIATES.RELATEDOBJECTS');
   
      IF SIZEOF (Association) > 0 THEN
        REPEAT i := 1 TO HIINDEX(Association);
          IF ('IFC2X3.IFCRELASSOCIATESMATERIAL' IN TYPEOF(Association[i])) THEN 
            MaterialAssociation := MaterialAssociation + Association[i];
          END_IF;
        END_REPEAT;
      END_IF;
      
      IF (SIZEOF(MaterialAssociation) <> 1) THEN
        RETURN (?);
      ELSE
        IF 'IFC2X3.IFCMATERIAL' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
           RETURN (1);
        END_IF;
        IF 'IFC2X3.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
           RETURN (SIZEOF(MaterialAssociation[1].RelatingMaterial.ForLayerSet.MaterialLayers));
        END_IF;
        IF 'IFC2X3.IFCMATERIALLIST' IN TYPEOF(MaterialAssociation[1].RelatingMaterial) THEN
           RETURN (?);
        END_IF;
      END_IF;
    
      RETURN (?);
END_FUNCTION;

FUNCTION IfcNormalise
	(Arg : IfcVectorOrDirection)
	: IfcVectorOrDirection;
  LOCAL
    Ndim : INTEGER;
    V    : IfcDirection
         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]); 
    Vec  : IfcVector 
         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (
              IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]), 1.);
    Mag  : REAL;
    Result : IfcVectorOrDirection
           := V;
  END_LOCAL;
  
    IF NOT EXISTS (Arg) THEN
      RETURN (?);
    ELSE
      Ndim := Arg.Dim;
      IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg) THEN
        BEGIN
  	V.DirectionRatios := Arg.Orientation.DirectionRatios;
          Vec.Magnitude := Arg.Magnitude;
  	Vec.Orientation := V;
          IF Arg.Magnitude = 0.0 THEN
            RETURN(?);
          ELSE
            Vec.Magnitude := 1.0;
          END_IF;
        END;
      ELSE
        V.DirectionRatios := Arg.DirectionRatios;
      END_IF;
      Mag := 0.0;
        REPEAT i := 1 TO Ndim;
          Mag := Mag + V.DirectionRatios[i]*V.DirectionRatios[i];
        END_REPEAT;
      IF Mag > 0.0 THEN
        Mag := SQRT(Mag);
        REPEAT i := 1 TO Ndim;
          V.DirectionRatios[i] := V.DirectionRatios[i]/Mag;
        END_REPEAT;
        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(arg) THEN
          Vec.Orientation := V;
          Result := Vec;
        ELSE
          Result := V;
        END_IF;
      ELSE
        RETURN(?);
      END_IF;
    END_IF;
    RETURN (Result);
END_FUNCTION;

FUNCTION IfcOrthogonalComplement
	(Vec : IfcDirection)
	: IfcDirection;
  LOCAL
    Result : IfcDirection ;
  END_LOCAL;
    IF NOT EXISTS (Vec) OR (Vec.Dim <> 2) THEN
      RETURN(?);
    ELSE
      Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([-Vec.DirectionRatios[2], Vec.DirectionRatios[1]]);
      RETURN(Result);
    END_IF;
END_FUNCTION;

FUNCTION IfcPathHeadToTail
	(APath : IfcPath)
	: LOGICAL;
     LOCAL
       N : INTEGER := 0;
       P : LOGICAL := UNKNOWN;
     END_LOCAL;
       N := SIZEOF (APath.EdgeList);
     REPEAT i := 2 TO N;
        P := P AND (APath.EdgeList[i-1].EdgeEnd :=:
                    APath.EdgeList[i].EdgeStart);
     END_REPEAT;
     RETURN (P);
END_FUNCTION;

FUNCTION IfcSameAxis2Placement
	(ap1, ap2 : IfcAxis2Placement; Epsilon : REAL)
	: LOGICAL;
  
    RETURN (IfcSameDirection(ap1.P[1],ap2.P[1],Epsilon) AND
            IfcSameDirection(ap1.P[2],ap2.P[2],Epsilon) AND
            IfcSameCartesianPoint(ap1.Location,ap1.Location,Epsilon));
END_FUNCTION;

FUNCTION IfcSameCartesianPoint
	(cp1, cp2 : IfcCartesianPoint; Epsilon : REAL)
	: LOGICAL;
    
    LOCAL
      cp1x : REAL := cp1.Coordinates[1];
      cp1y : REAL := cp1.Coordinates[2];
      cp1z : REAL := 0;
      cp2x : REAL := cp2.Coordinates[1];
      cp2y : REAL := cp2.Coordinates[2];
      cp2z : REAL := 0;
    END_LOCAL;
  
    IF (SIZEOF(cp1.Coordinates) > 2) THEN
      cp1z := cp1.Coordinates[3];
    END_IF;
  
    IF (SIZEOF(cp2.Coordinates) > 2) THEN
      cp2z := cp2.Coordinates[3];
    END_IF;
  
    RETURN (IfcSameValue(cp1x,cp2x,Epsilon) AND
            IfcSameValue(cp1y,cp2y,Epsilon) AND
            IfcSameValue(cp1z,cp2z,Epsilon));
END_FUNCTION;

FUNCTION IfcSameDirection
	(dir1, dir2 : IfcDirection; Epsilon : REAL)
	: LOGICAL;
    LOCAL
      dir1x : REAL := dir1.DirectionRatios[1];
      dir1y : REAL := dir1.DirectionRatios[2];
      dir1z : REAL := 0;
      dir2x : REAL := dir2.DirectionRatios[1];
      dir2y : REAL := dir2.DirectionRatios[2];
      dir2z : REAL := 0;
    END_LOCAL;
  
    IF (SIZEOF(dir1.DirectionRatios) > 2) THEN
      dir1z := dir1.DirectionRatios[3];
    END_IF;
  
    IF (SIZEOF(dir2.DirectionRatios) > 2) THEN
      dir2z := dir2.DirectionRatios[3];
    END_IF;
    
    RETURN (IfcSameValue(dir1x,dir2x,Epsilon) AND
            IfcSameValue(dir1y,dir2y,Epsilon) AND
            IfcSameValue(dir1z,dir2z,Epsilon));
END_FUNCTION;

FUNCTION IfcSameValidPrecision
	(Epsilon1, Epsilon2 : REAL)
	: LOGICAL;
    LOCAL
      ValidEps1, ValidEps2 : REAL;
      DefaultEps           : REAL := 0.000001;
      DerivationOfEps      : REAL := 1.001;
      UpperEps             : REAL := 1.0;
    END_LOCAL;
    
      ValidEps1 := NVL(Epsilon1, DefaultEps);
      ValidEps2 := NVL(Epsilon2, DefaultEps);
      RETURN ((0.0 < ValidEps1) AND (ValidEps1 <= (DerivationOfEps * ValidEps2)) AND 
              (ValidEps2 <= (DerivationOfEps * ValidEps1)) AND (ValidEps2 < UpperEps));
END_FUNCTION;

FUNCTION IfcSameValue
	(Value1, Value2 : REAL; Epsilon : REAL)
	: LOGICAL;
    LOCAL
      ValidEps    : REAL;
      DefaultEps  : REAL := 0.000001;
    END_LOCAL;
    
    ValidEps := NVL(Epsilon, DefaultEps);
    RETURN ((Value1 + ValidEps > Value2) AND (Value1 < Value2 + ValidEps));
END_FUNCTION;

FUNCTION IfcScalarTimesVector
	(Scalar : REAL; Vec : IfcVectorOrDirection)
	: IfcVector;
  LOCAL
    V : IfcDirection;
    Mag : REAL;
    Result : IfcVector;
  END_LOCAL;
  
    IF NOT EXISTS (Scalar) OR NOT EXISTS (Vec) THEN
      RETURN (?) ;
    ELSE
      IF 'IFC2X3.IFCVECTOR' IN TYPEOF (Vec) THEN
        V := Vec.Orientation;
        Mag := Scalar * Vec.Magnitude;
      ELSE
        V := Vec;
        Mag := Scalar;
      END_IF;
      IF (Mag < 0.0 ) THEN
        REPEAT i := 1 TO SIZEOF(V.DirectionRatios);
          V.DirectionRatios[i] := -V.DirectionRatios[i];
        END_REPEAT;
        Mag := -Mag;
      END_IF;
      Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(IfcNormalise(V), Mag);
    END_IF;
    RETURN (Result);
END_FUNCTION;

FUNCTION IfcSecondProjAxis
	(ZAxis, XAxis, Arg: IfcDirection)
	: IfcDirection;
  LOCAL
    YAxis : IfcVector;
    V     : IfcDirection;
    Temp  : IfcVector;
  END_LOCAL;
  
    IF NOT EXISTS(Arg) THEN
      V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
    ELSE
      V := Arg;
    END_IF;
    Temp  := IfcScalarTimesVector(IfcDotProduct(V, ZAxis), ZAxis);
    YAxis := IfcVectorDifference(V, Temp);
    Temp  := IfcScalarTimesVector(IfcDotProduct(V, XAxis), XAxis);
    YAxis := IfcVectorDifference(YAxis, Temp);
    YAxis := IfcNormalise(YAxis);
    RETURN(YAxis.Orientation);
END_FUNCTION;

FUNCTION IfcShapeRepresentationTypes
	(RepType : IfcLabel; Items : SET OF IfcRepresentationItem)
	: LOGICAL;
      
      LOCAL
        Count : INTEGER := 0;
      END_LOCAL;
  
      CASE RepType OF 
      'Curve2D' :
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCCURVE' IN TYPEOF(temp)) 
                   AND (temp.Dim = 2)));
        END;
      'Annotation2D' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | (
                    SIZEOF(TYPEOF(temp) * [
                     'IFC2X3.IFCPOINT',
                     'IFC2X3.IFCCURVE',
                     'IFC2X3.IFCGEOMETRICCURVESET',
                     'IFC2X3.IFCANNOTATIONFILLAREA',
                     'IFC2X3.IFCDEFINEDSYMBOL',
                     'IFC2X3.IFCTEXTLITERAL',
                     'IFC2X3.IFCDRAUGHTINGCALLOUT']) = 1)
                   ));
        END;
      'GeometricSet' : 
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCSURFACE' IN TYPEOF(temp))));
        END;
      'GeometricCurveSet' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCPOINT' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCCURVE' IN TYPEOF(temp))));
           REPEAT i:=1 TO HIINDEX(Items);  
             IF ('IFC2X3.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
             THEN
               IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFC2X3.IFCSURFACE' IN TYPEOF(temp))) > 0)
               THEN
                 Count := Count - 1;
               END_IF;
             END_IF;
           END_REPEAT;
        END;
      'SurfaceModel' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                     'IFC2X3.IFCSHELLBASEDSURFACEMODEL',
                     'IFC2X3.IFCFACEBASEDSURFACEMODEL',
                     'IFC2X3.IFCFACETEDBREP',
                     'IFC2X3.IFCFACETEDBREPWITHVOIDS'] * TYPEOF(temp)) >= 1
                   ));      
        END;
      'SolidModel' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSOLIDMODEL' IN TYPEOF(temp))));            
        END;
      'SweptSolid' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSWEPTAREASOLID' IN TYPEOF(temp))));            
        END;
      'CSG' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANRESULT' IN TYPEOF(temp))));            
        END;
      'Clipping' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(temp))));            
        END;
      'AdvancedSweptSolid' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSURFACECURVESWEPTAREASOLID' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCSWEPTDISKSOLID' IN TYPEOF(temp))));      
        END;
      'Brep' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCFACETEDBREP' IN TYPEOF(temp))
                   OR ('IFC2X3.IFCFACETEDBREPWITHVOIDS' IN TYPEOF(temp))));      
        END;
      'BoundingBox' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCBOUNDINGBOX' IN TYPEOF(temp))));
          IF (SIZEOF(Items) > 1)
          THEN
            Count := 0;
          END_IF;   
        END;
      'SectionedSpine' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCSECTIONEDSPINE' IN TYPEOF(temp))));      
        END;
      'MappedRepresentation' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | ('IFC2X3.IFCMAPPEDITEM' IN TYPEOF(temp))));  
        END;
       OTHERWISE : RETURN(?);
      END_CASE;
      RETURN (Count = SIZEOF(Items));
END_FUNCTION;

FUNCTION IfcTopologyRepresentationTypes
	(RepType : IfcLabel; Items : SET OF IfcRepresentationItem)
	: LOGICAL;
      
      LOCAL
        Count : INTEGER := 0;
      END_LOCAL;
  
      CASE RepType OF 
      'Vertex' :
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | 
                    ('IFC2X3.IFCVERTEX' IN TYPEOF(temp))));
        END;
      'Edge' : 
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | 
                    ('IFC2X3.IFCEDGE' IN TYPEOF(temp))));
        END;
      'Path' : 
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | 
                    ('IFC2X3.IFCPATH' IN TYPEOF(temp))));
        END;
      'Face' : 
        BEGIN 
          Count := SIZEOF(QUERY(temp <* Items | 
                    ('IFC2X3.IFCFACE' IN TYPEOF(temp))));
        END;
      'Shell' :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Items | 
                    ('IFC2X3.IFCOPENSHELL' IN TYPEOF(temp))
                      OR ('IFC2X3.IFCCLOSEDSHELL' IN TYPEOF(temp))));
        END;
      'Undefined': RETURN(TRUE);
       OTHERWISE : RETURN(?);
      END_CASE;
      RETURN (Count = SIZEOF(Items));
END_FUNCTION;

FUNCTION IfcUniquePropertyName
	(Properties : SET [1:?] OF IfcProperty)
	: LOGICAL;
  
  LOCAL
    Names : SET OF IfcIdentifier := [];
  END_LOCAL;
  
  REPEAT i:=1 TO HIINDEX(Properties);
    Names := Names + Properties[i].Name;
  END_REPEAT;
  RETURN (SIZEOF(Names) = SIZEOF(Properties));
END_FUNCTION;

FUNCTION IfcValidCalendarDate
	(Date : IfcCalendarDate)
	: LOGICAL;
  IF NOT ({1 <= Date.DayComponent <= 31}) THEN    
    RETURN(FALSE);  
  END_IF;
  CASE Date.MonthComponent OF
    4         : RETURN({ 1<= Date.DayComponent <= 30});
    6         : RETURN({ 1<= Date.DayComponent <= 30});
    9         : RETURN({ 1<= Date.DayComponent <= 30});
    11        : RETURN({ 1<= Date.DayComponent <= 30});    
    2         :    
    BEGIN
      IF (IfcLeapYear(Date.YearComponent)) THEN
        RETURN({ 1<= Date.DayComponent <= 29});      
      ELSE
        RETURN({ 1<= Date.DayComponent <= 28});      
      END_IF;    
    END;
    OTHERWISE : RETURN(TRUE);  
  END_CASE;
END_FUNCTION;

FUNCTION IfcValidTime
	(Time: IfcLocalTime)
	: BOOLEAN;
  IF EXISTS (Time.SecondComponent) THEN
    RETURN (EXISTS (Time.MinuteComponent));  
  ELSE    
    RETURN (TRUE);  
  END_IF;
END_FUNCTION;

FUNCTION IfcVectorDifference
	(Arg1, Arg2 : IfcVectorOrDirection)
	: IfcVector;
  LOCAL
    Result : IfcVector;
    Res, Vec1, Vec2 : IfcDirection;
    Mag, Mag1, Mag2 : REAL;
    Ndim : INTEGER;
  END_LOCAL;
  
    IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
      RETURN (?) ;
    ELSE
      BEGIN
        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg1) THEN
          Mag1 := Arg1.Magnitude;
          Vec1 := Arg1.Orientation;
        ELSE
          Mag1 := 1.0;
          Vec1 := Arg1;
        END_IF;
        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg2) THEN
          Mag2 := Arg2.Magnitude;
          Vec2 := Arg2.Orientation;
        ELSE
          Mag2 := 1.0;
          Vec2 := Arg2;
        END_IF;
        Vec1 := IfcNormalise (Vec1);
        Vec2 := IfcNormalise (Vec2);
        Ndim := SIZEOF(Vec1.DirectionRatios);
        Mag  := 0.0;
        Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);
  
        REPEAT i := 1 TO Ndim;
          Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] - Mag2*Vec2.DirectionRatios[i];
          Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
        END_REPEAT;
  
        IF (Mag > 0.0 ) THEN
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
        ELSE
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
        END_IF;
      END;
    END_IF;
    RETURN (Result);
END_FUNCTION;

FUNCTION IfcVectorSum
	(Arg1, Arg2 : IfcVectorOrDirection)
	: IfcVector;
  LOCAL
    Result : IfcVector;
    Res, Vec1, Vec2 : IfcDirection;
    Mag, Mag1, Mag2 : REAL;
    Ndim : INTEGER;
  END_LOCAL;
  
    IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
      RETURN (?) ;
    ELSE
      BEGIN
        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg1) THEN
          Mag1 := Arg1.Magnitude;
          Vec1 := Arg1.Orientation;
        ELSE
          Mag1 := 1.0;
          Vec1 := Arg1;
        END_IF;
        IF 'IFC2X3.IFCVECTOR' IN TYPEOF(Arg2) THEN
          Mag2 := Arg2.Magnitude;
          Vec2 := Arg2.Orientation;
        ELSE
          Mag2 := 1.0;
          Vec2 := Arg2;
        END_IF;
        Vec1 := IfcNormalise (Vec1);
        Vec2 := IfcNormalise (Vec2);
        Ndim := SIZEOF(Vec1.DirectionRatios);
        Mag  := 0.0;
        Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);
  
        REPEAT i := 1 TO Ndim;
          Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] + Mag2*Vec2.DirectionRatios[i];
          Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
        END_REPEAT;
  
        IF (Mag > 0.0 ) THEN
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
        ELSE
          Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
        END_IF;
      END;
    END_IF;
    RETURN (Result);
END_FUNCTION;

RULE IfcRepresentationContextSameWCS FOR 
	(IfcGeometricRepresentationContext);
    LOCAL
      IsDifferent  : LOGICAL := FALSE;
    END_LOCAL;
      IF (SIZEOF(IfcGeometricRepresentationContext) > 1)
      THEN
        REPEAT i := 2 TO HIINDEX(IfcGeometricRepresentationContext);
          IF (IfcGeometricRepresentationContext[1].WorldCoordinateSystem :<>: IfcGeometricRepresentationContext[i].WorldCoordinateSystem)
          THEN
            IsDifferent := (NOT(IfcSameValidPrecision(IfcGeometricRepresentationContext[1].Precision,
                                                      IfcGeometricRepresentationContext[i].Precision)))
                        OR (NOT(IfcSameAxis2Placement(IfcGeometricRepresentationContext[1].WorldCoordinateSystem,
                                                      IfcGeometricRepresentationContext[i].WorldCoordinateSystem,
                                                      IfcGeometricRepresentationContext[1].Precision)));
            IF (IsDifferent = TRUE) THEN
              ESCAPE;
            END_IF;
          END_IF;
        END_REPEAT;
      END_IF;
    WHERE
      WR1 : IsDifferent = FALSE;
END_RULE;

RULE IfcSingleProjectInstance FOR 
	(IfcProject);
    WHERE
      WR1 : SIZEOF(IfcProject) <= 1;
END_RULE;

END_SCHEMA;
