SCHEMA IFC4;

TYPE IfcAbsorbedDoseMeasure = REAL;
END_TYPE;

TYPE IfcAccelerationMeasure = REAL;
END_TYPE;

TYPE IfcAmountOfSubstanceMeasure = REAL;
END_TYPE;

TYPE IfcAngularVelocityMeasure = REAL;
END_TYPE;

TYPE IfcArcIndex = LIST [3:3] OF IfcPositiveInteger;
END_TYPE;

TYPE IfcAreaDensityMeasure = REAL;
END_TYPE;

TYPE IfcAreaMeasure = REAL;
END_TYPE;

TYPE IfcBinary = BINARY;
END_TYPE;

TYPE IfcBoolean = BOOLEAN;
END_TYPE;

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

TYPE IfcCardinalPointReference = INTEGER;
 WHERE
  GreaterThanZero : SELF > 0
END_TYPE;

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

TYPE IfcCompoundPlaneAngleMeasure = LIST [3:4] OF INTEGER;
 WHERE
  MinutesInRange : ABS(SELF[2]) < 60
  SecondsInRange : ABS(SELF[3]) < 60
  MicrosecondsInRange : (SIZEOF(SELF) = 3) OR (ABS(SELF[4]) < 1000000)
  ConsistentSign : ((SELF[1] >= 0) AND (SELF[2] >= 0) AND (SELF[3] >= 0) AND ((SIZEOF(SELF) = 3) OR (SELF[4] >= 0))) OR ((SELF[1] <= 0) AND (SELF[2] <= 0) AND (SELF[3] <= 0) AND ((SIZEOF(SELF) = 3) OR (SELF[4] <= 0)))
END_TYPE;

TYPE IfcContextDependentMeasure = REAL;
END_TYPE;

TYPE IfcCountMeasure = NUMBER;
END_TYPE;

TYPE IfcCurvatureMeasure = REAL;
END_TYPE;

TYPE IfcDate = STRING;
END_TYPE;

TYPE IfcDateTime = STRING;
END_TYPE;

TYPE IfcDayInMonthNumber = INTEGER;
 WHERE
  ValidRange : {1 <= SELF <= 31}
END_TYPE;

TYPE IfcDayInWeekNumber = INTEGER;
 WHERE
  ValidRange : {1 <= SELF <= 7}
END_TYPE;

TYPE IfcDescriptiveMeasure = STRING;
END_TYPE;

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

TYPE IfcDoseEquivalentMeasure = REAL;
END_TYPE;

TYPE IfcDuration = STRING;
END_TYPE;

TYPE IfcDynamicViscosityMeasure = REAL;
END_TYPE;

TYPE IfcElectricCapacitanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricChargeMeasure = REAL;
END_TYPE;

TYPE IfcElectricConductanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricCurrentMeasure = REAL;
END_TYPE;

TYPE IfcElectricResistanceMeasure = REAL;
END_TYPE;

TYPE IfcElectricVoltageMeasure = REAL;
END_TYPE;

TYPE IfcEnergyMeasure = REAL;
END_TYPE;

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

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

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

TYPE IfcForceMeasure = REAL;
END_TYPE;

TYPE IfcFrequencyMeasure = REAL;
END_TYPE;

TYPE IfcGloballyUniqueId = STRING (22) FIXED;
END_TYPE;

TYPE IfcHeatFluxDensityMeasure = REAL;
END_TYPE;

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

TYPE IfcIdentifier = STRING (255);
END_TYPE;

TYPE IfcIlluminanceMeasure = REAL;
END_TYPE;

TYPE IfcInductanceMeasure = REAL;
END_TYPE;

TYPE IfcInteger = INTEGER;
END_TYPE;

TYPE IfcIntegerCountRateMeasure = INTEGER;
END_TYPE;

TYPE IfcIonConcentrationMeasure = REAL;
END_TYPE;

TYPE IfcIsothermalMoistureCapacityMeasure = REAL;
END_TYPE;

TYPE IfcKinematicViscosityMeasure = REAL;
END_TYPE;

TYPE IfcLabel = STRING (255);
END_TYPE;

TYPE IfcLanguageId = IfcIdentifier;
END_TYPE;

TYPE IfcLengthMeasure = REAL;
END_TYPE;

TYPE IfcLineIndex = LIST [2:?] OF IfcPositiveInteger;
END_TYPE;

TYPE IfcLinearForceMeasure = REAL;
END_TYPE;

TYPE IfcLinearMomentMeasure = REAL;
END_TYPE;

TYPE IfcLinearStiffnessMeasure = REAL;
END_TYPE;

TYPE IfcLinearVelocityMeasure = REAL;
END_TYPE;

TYPE IfcLogical = LOGICAL;
END_TYPE;

TYPE IfcLuminousFluxMeasure = REAL;
END_TYPE;

TYPE IfcLuminousIntensityDistributionMeasure = REAL;
END_TYPE;

TYPE IfcLuminousIntensityMeasure = REAL;
END_TYPE;

TYPE IfcMagneticFluxDensityMeasure = REAL;
END_TYPE;

TYPE IfcMagneticFluxMeasure = REAL;
END_TYPE;

TYPE IfcMassDensityMeasure = REAL;
END_TYPE;

TYPE IfcMassFlowRateMeasure = REAL;
END_TYPE;

TYPE IfcMassMeasure = REAL;
END_TYPE;

TYPE IfcMassPerLengthMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfElasticityMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfLinearSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfRotationalSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcModulusOfSubgradeReactionMeasure = REAL;
END_TYPE;

TYPE IfcMoistureDiffusivityMeasure = REAL;
END_TYPE;

TYPE IfcMolecularWeightMeasure = REAL;
END_TYPE;

TYPE IfcMomentOfInertiaMeasure = REAL;
END_TYPE;

TYPE IfcMonetaryMeasure = REAL;
END_TYPE;

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

TYPE IfcNonNegativeLengthMeasure = IfcLengthMeasure;
 WHERE
  NotNegative : SELF >= 0.
END_TYPE;

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

TYPE IfcNumericMeasure = NUMBER;
END_TYPE;

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

TYPE IfcParameterValue = REAL;
END_TYPE;

TYPE IfcPlanarForceMeasure = REAL;
END_TYPE;

TYPE IfcPlaneAngleMeasure = REAL;
END_TYPE;

TYPE IfcPositiveInteger = IfcInteger;
 WHERE
  WR1 : SELF > 0
END_TYPE;

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

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

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

TYPE IfcPowerMeasure = REAL;
END_TYPE;

TYPE IfcPresentableText = STRING;
END_TYPE;

TYPE IfcPressureMeasure = REAL;
END_TYPE;

TYPE IfcPropertySetDefinitionSet = SET [1:?] OF IfcPropertySetDefinition;
END_TYPE;

TYPE IfcRadioActivityMeasure = REAL;
END_TYPE;

TYPE IfcRatioMeasure = REAL;
END_TYPE;

TYPE IfcReal = REAL;
END_TYPE;

TYPE IfcRotationalFrequencyMeasure = REAL;
END_TYPE;

TYPE IfcRotationalMassMeasure = REAL;
END_TYPE;

TYPE IfcRotationalStiffnessMeasure = REAL;
END_TYPE;

TYPE IfcSectionModulusMeasure = REAL;
END_TYPE;

TYPE IfcSectionalAreaIntegralMeasure = REAL;
END_TYPE;

TYPE IfcShearModulusMeasure = REAL;
END_TYPE;

TYPE IfcSolidAngleMeasure = REAL;
END_TYPE;

TYPE IfcSoundPowerLevelMeasure = REAL;
END_TYPE;

TYPE IfcSoundPowerMeasure = REAL;
END_TYPE;

TYPE IfcSoundPressureLevelMeasure = REAL;
END_TYPE;

TYPE IfcSoundPressureMeasure = REAL;
END_TYPE;

TYPE IfcSpecificHeatCapacityMeasure = REAL;
END_TYPE;

TYPE IfcSpecularExponent = REAL;
END_TYPE;

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

TYPE IfcTemperatureGradientMeasure = REAL;
END_TYPE;

TYPE IfcTemperatureRateOfChangeMeasure = REAL;
END_TYPE;

TYPE IfcText = STRING;
END_TYPE;

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

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

TYPE IfcTextFontName = STRING;
END_TYPE;

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

TYPE IfcThermalAdmittanceMeasure = REAL;
END_TYPE;

TYPE IfcThermalConductivityMeasure = REAL;
END_TYPE;

TYPE IfcThermalExpansionCoefficientMeasure = REAL;
END_TYPE;

TYPE IfcThermalResistanceMeasure = REAL;
END_TYPE;

TYPE IfcThermalTransmittanceMeasure = REAL;
END_TYPE;

TYPE IfcThermodynamicTemperatureMeasure = REAL;
END_TYPE;

TYPE IfcTime = STRING;
END_TYPE;

TYPE IfcTimeMeasure = REAL;
END_TYPE;

TYPE IfcTimeStamp = INTEGER;
END_TYPE;

TYPE IfcTorqueMeasure = REAL;
END_TYPE;

TYPE IfcURIReference = STRING;
END_TYPE;

TYPE IfcVaporPermeabilityMeasure = REAL;
END_TYPE;

TYPE IfcVolumeMeasure = REAL;
END_TYPE;

TYPE IfcVolumetricFlowRateMeasure = REAL;
END_TYPE;

TYPE IfcWarpingConstantMeasure = REAL;
END_TYPE;

TYPE IfcWarpingMomentMeasure = REAL;
END_TYPE;

TYPE IfcActionRequestTypeEnum = ENUMERATION OF (
 EMAIL,
 FAX,
 PHONE,
 POST,
 VERBAL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

TYPE IfcAirTerminalTypeEnum = ENUMERATION OF (
 DIFFUSER,
 GRILLE,
 LOUVRE,
 REGISTER,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

TYPE IfcAudioVisualApplianceTypeEnum = ENUMERATION OF (
 AMPLIFIER,
 CAMERA,
 DISPLAY,
 MICROPHONE,
 PLAYER,
 PROJECTOR,
 RECEIVER,
 SPEAKER,
 SWITCHER,
 TELEPHONE,
 TUNER,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcBSplineSurfaceForm = ENUMERATION OF (
 PLANE_SURF,
 CYLINDRICAL_SURF,
 CONICAL_SURF,
 SPHERICAL_SURF,
 TOROIDAL_SURF,
 SURF_OF_REVOLUTION,
 RULED_SURF,
 GENERALISED_CONE,
 QUADRIC_SURF,
 SURF_OF_LINEAR_EXTRUSION,
 UNSPECIFIED);
END_TYPE;

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

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

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

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

TYPE IfcBuildingElementPartTypeEnum = ENUMERATION OF (
 INSULATION,
 PRECASTPANEL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcBuildingElementProxyTypeEnum = ENUMERATION OF (
 COMPLEX,
 ELEMENT,
 PARTIAL,
 PROVISIONFORVOID,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcBuildingSystemTypeEnum = ENUMERATION OF (
 FENESTRATION,
 FOUNDATION,
 LOADBEARING,
 OUTERSHELL,
 SHADING,
 TRANSPORT,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

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

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

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

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

TYPE IfcCommunicationsApplianceTypeEnum = ENUMERATION OF (
 ANTENNA,
 COMPUTER,
 FAX,
 GATEWAY,
 MODEM,
 NETWORKAPPLIANCE,
 NETWORKBRIDGE,
 NETWORKHUB,
 PRINTER,
 REPEATER,
 ROUTER,
 SCANNER,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcComplexPropertyTemplateTypeEnum = ENUMERATION OF (
 P_COMPLEX,
 Q_COMPLEX);
END_TYPE;

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

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

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

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

TYPE IfcConstructionEquipmentResourceTypeEnum = ENUMERATION OF (
 DEMOLISHING,
 EARTHMOVING,
 ERECTING,
 HEATING,
 LIGHTING,
 PAVING,
 PUMPING,
 TRANSPORTING,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcConstructionMaterialResourceTypeEnum = ENUMERATION OF (
 AGGREGATES,
 CONCRETE,
 DRYWALL,
 FUEL,
 GYPSUM,
 MASONRY,
 METAL,
 PLASTIC,
 WOOD,
 NOTDEFINED,
 USERDEFINED);
END_TYPE;

TYPE IfcConstructionProductResourceTypeEnum = ENUMERATION OF (
 ASSEMBLY,
 FORMWORK,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcControllerTypeEnum = ENUMERATION OF (
 FLOATING,
 PROGRAMMABLE,
 PROPORTIONAL,
 MULTIPOSITION,
 TWOPOSITION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

TYPE IfcCrewResourceTypeEnum = ENUMERATION OF (
 OFFICE,
 SITE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcCurveInterpolationEnum = ENUMERATION OF (
 LINEAR,
 LOG_LINEAR,
 LOG_LOG,
 NOTDEFINED);
END_TYPE;

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

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

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

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

TYPE IfcDiscreteAccessoryTypeEnum = ENUMERATION OF (
 ANCHORPLATE,
 BRACKET,
 SHOE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcDistributionPortTypeEnum = ENUMERATION OF (
 CABLE,
 CABLECARRIER,
 DUCT,
 PIPE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcDistributionSystemEnum = ENUMERATION OF (
 AIRCONDITIONING,
 AUDIOVISUAL,
 CHEMICAL,
 CHILLEDWATER,
 COMMUNICATION,
 COMPRESSEDAIR,
 CONDENSERWATER,
 CONTROL,
 CONVEYING,
 DATA,
 DISPOSAL,
 DOMESTICCOLDWATER,
 DOMESTICHOTWATER,
 DRAINAGE,
 EARTHING,
 ELECTRICAL,
 ELECTROACOUSTIC,
 EXHAUST,
 FIREPROTECTION,
 FUEL,
 GAS,
 HAZARDOUS,
 HEATING,
 LIGHTING,
 LIGHTNINGPROTECTION,
 MUNICIPALSOLIDWASTE,
 OIL,
 OPERATIONAL,
 POWERGENERATION,
 RAINWATER,
 REFRIGERATION,
 SECURITY,
 SEWAGE,
 SIGNAL,
 STORMWATER,
 TELEPHONE,
 TV,
 VACUUM,
 VENT,
 VENTILATION,
 WASTEWATER,
 WATERSUPPLY,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

TYPE IfcDoorTypeEnum = ENUMERATION OF (
 DOOR,
 GATE,
 TRAPDOOR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

TYPE IfcElectricApplianceTypeEnum = ENUMERATION OF (
 DISHWASHER,
 ELECTRICCOOKER,
 FREESTANDINGELECTRICHEATER,
 FREESTANDINGFAN,
 FREESTANDINGWATERHEATER,
 FREESTANDINGWATERCOOLER,
 FREEZER,
 FRIDGE_FREEZER,
 HANDDRYER,
 KITCHENMACHINE,
 MICROWAVE,
 PHOTOCOPIER,
 REFRIGERATOR,
 TUMBLEDRYER,
 VENDINGMACHINE,
 WASHINGMACHINE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcElectricDistributionBoardTypeEnum = ENUMERATION OF (
 CONSUMERUNIT,
 DISTRIBUTIONBOARD,
 MOTORCONTROLCENTRE,
 SWITCHBOARD,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

TYPE IfcEngineTypeEnum = ENUMERATION OF (
 EXTERNALCOMBUSTION,
 INTERNALCOMBUSTION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

TYPE IfcEventTriggerTypeEnum = ENUMERATION OF (
 EVENTRULE,
 EVENTMESSAGE,
 EVENTTIME,
 EVENTCOMPLEX,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcEventTypeEnum = ENUMERATION OF (
 STARTEVENT,
 ENDEVENT,
 INTERMEDIATEEVENT,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcExternalSpatialElementTypeEnum = ENUMERATION OF (
 EXTERNAL,
 EXTERNAL_EARTH,
 EXTERNAL_WATER,
 EXTERNAL_FIRE,
 USERDEFINED,
 NOTDEFIEND);
END_TYPE;

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

TYPE IfcFastenerTypeEnum = ENUMERATION OF (
 GLUE,
 MORTAR,
 WELD,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

TYPE IfcFurnitureTypeEnum = ENUMERATION OF (
 CHAIR,
 TABLE,
 DESK,
 BED,
 FILECABINET,
 SHELF,
 SOFA,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcGeographicElementTypeEnum = ENUMERATION OF (
 TERRAIN,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

TYPE IfcGridTypeEnum = ENUMERATION OF (
 RECTANGULAR,
 RADIAL,
 TRIANGULAR,
 IRREGULAR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

TYPE IfcInterceptorTypeEnum = ENUMERATION OF (
 CYCLONIC,
 GREASE,
 OIL,
 PETROL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

TYPE IfcKnotType = ENUMERATION OF (
 UNIFORM_KNOTS,
 QUASI_UNIFORM_KNOTS,
 PIECEWISE_BEZIER_KNOTS,
 UNSPECIFIED);
END_TYPE;

TYPE IfcLaborResourceTypeEnum = ENUMERATION OF (
 ADMINISTRATION,
 CARPENTRY,
 CLEANING,
 CONCRETE,
 DRYWALL,
 ELECTRIC,
 FINISHING,
 FLOORING,
 GENERAL,
 HVAC,
 LANDSCAPING,
 MASONRY,
 PAINTING,
 PAVING,
 PLUMBING,
 ROOFING,
 SITEGRADING,
 STEELWORK,
 SURVEYING,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

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

TYPE IfcMechanicalFastenerTypeEnum = ENUMERATION OF (
 ANCHORBOLT,
 BOLT,
 DOWEL,
 NAIL,
 NAILPLATE,
 RIVET,
 SCREW,
 SHEARCONNECTOR,
 STAPLE,
 STUDSHEARCONNECTOR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcMedicalDeviceTypeEnum = ENUMERATION OF (
 AIRSTATION,
 FEEDAIRUNIT,
 OXYGENGENERATOR,
 OXYGENPLANT,
 VACUUMSTATION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

TYPE IfcNullStyle = ENUMERATION OF (
 NULL);
END_TYPE;

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

TYPE IfcObjectiveEnum = ENUMERATION OF (
 CODECOMPLIANCE,
 CODEWAIVER,
 DESIGNINTENT,
 EXTERNAL,
 HEALTHANDSAFETY,
 MERGECONFLICT,
 MODELVIEW,
 PARAMETER,
 REQUIREMENT,
 SPECIFICATION,
 TRIGGERCONDITION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcOpeningElementTypeEnum = ENUMERATION OF (
 OPENING,
 RECESS,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

TYPE IfcPermitTypeEnum = ENUMERATION OF (
 ACCESS,
 BUILDING,
 WORK,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

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

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

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

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

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

TYPE IfcPropertySetTemplateTypeEnum = ENUMERATION OF (
 PSET_TYPEDRIVENONLY,
 PSET_TYPEDRIVENOVERRIDE,
 PSET_OCCURRENCEDRIVEN,
 PSET_PERFORMANCEDRIVEN,
 QTO_TYPEDRIVENONLY,
 QTO_TYPEDRIVENOVERRIDE,
 QTO_OCCURRENCEDRIVEN,
 NOTDEFINED);
END_TYPE;

TYPE IfcProtectiveDeviceTrippingUnitTypeEnum = ENUMERATION OF (
 ELECTRONIC,
 ELECTROMAGNETIC,
 RESIDUALCURRENT,
 THERMAL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

TYPE IfcRecurrenceTypeEnum = ENUMERATION OF (
 DAILY,
 WEEKLY,
 MONTHLY_BY_DAY_OF_MONTH,
 MONTHLY_BY_POSITION,
 BY_DAY_COUNT,
 BY_WEEKDAY_COUNT,
 YEARLY_BY_DAY_OF_MONTH,
 YEARLY_BY_POSITION);
END_TYPE;

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

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

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

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

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

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

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

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

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

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

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

TYPE IfcSensorTypeEnum = ENUMERATION OF (
 CO2SENSOR,
 CONDUCTANCESENSOR,
 CONTACTSENSOR,
 FIRESENSOR,
 FLOWSENSOR,
 FROSTSENSOR,
 GASSENSOR,
 HEATSENSOR,
 HUMIDITYSENSOR,
 IDENTIFIERSENSOR,
 IONCONCENTRATIONSENSOR,
 LEVELSENSOR,
 LIGHTSENSOR,
 MOISTURESENSOR,
 MOVEMENTSENSOR,
 PHSENSOR,
 PRESSURESENSOR,
 RADIATIONSENSOR,
 RADIOACTIVITYSENSOR,
 SMOKESENSOR,
 SOUNDSENSOR,
 TEMPERATURESENSOR,
 WINDSENSOR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcShadingDeviceTypeEnum = ENUMERATION OF (
 JALOUSIE,
 SHUTTER,
 AWNING,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcSimplePropertyTemplateTypeEnum = ENUMERATION OF (
 P_SINGLEVALUE,
 P_ENUMERATEDVALUE,
 P_BOUNDEDVALUE,
 P_LISTVALUE,
 P_TABLEVALUE,
 P_REFERENCEVALUE,
 Q_LENGTH,
 Q_AREA,
 Q_VOLUME,
 Q_COUNT,
 Q_WEIGHT,
 Q_TIME);
END_TYPE;

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

TYPE IfcSolarDeviceTypeEnum = ENUMERATION OF (
 SOLARCOLLECTOR,
 SOLARPANEL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcSpaceHeaterTypeEnum = ENUMERATION OF (
 CONVECTOR,
 RADIATOR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcSpaceTypeEnum = ENUMERATION OF (
 SPACE,
 PARKING,
 GFA,
 INTERNAL,
 EXTERNAL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcSpatialZoneTypeEnum = ENUMERATION OF (
 CONSTRUCTION,
 FIRESAFETY,
 LIGHTING,
 OCCUPANCY,
 SECURITY,
 THERMAL,
 TRANSPORT,
 VENTILATION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

TYPE IfcStructuralCurveActivityTypeEnum = ENUMERATION OF (
 CONST,
 LINEAR,
 POLYGONAL,
 EQUIDISTANT,
 SINUS,
 PARABOLA,
 DISCRETE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcStructuralSurfaceActivityTypeEnum = ENUMERATION OF (
 CONST,
 BILINEAR,
 DISCRETE,
 ISOCONTOUR,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcSubContractResourceTypeEnum = ENUMERATION OF (
 PURCHASE,
 WORK,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcSurfaceFeatureTypeEnum = ENUMERATION OF (
 MARK,
 TAG,
 TREATMENT,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

TYPE IfcSystemFurnitureElementTypeEnum = ENUMERATION OF (
 PANEL,
 WORKSURFACE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcTankTypeEnum = ENUMERATION OF (
 BASIN,
 BREAKPRESSURE,
 EXPANSION,
 FEEDANDEXPANSION,
 PRESSUREVESSEL,
 STORAGE,
 VESSEL,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcTaskDurationEnum = ENUMERATION OF (
 ELAPSEDTIME,
 WORKTIME,
 NOTDEFINED);
END_TYPE;

TYPE IfcTaskTypeEnum = ENUMERATION OF (
 ATTENDANCE,
 CONSTRUCTION,
 DEMOLITION,
 DISMANTLE,
 DISPOSAL,
 INSTALLATION,
 LOGISTIC,
 MAINTENANCE,
 MOVE,
 OPERATION,
 REMOVAL,
 RENOVATION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

TYPE IfcTendonAnchorTypeEnum = ENUMERATION OF (
 COUPLER,
 FIXED_END,
 TENSIONING_END,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

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

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

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

TYPE IfcUnitaryControlElementTypeEnum = ENUMERATION OF (
 ALARMPANEL,
 CONTROLPANEL,
 GASDETECTIONPANEL,
 INDICATORPANEL,
 MIMICPANEL,
 HUMIDISTAT,
 THERMOSTAT,
 WEATHERSTATION,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

TYPE IfcVoidingFeatureTypeEnum = ENUMERATION OF (
 CUTOUT,
 NOTCH,
 HOLE,
 MITER,
 CHAMFER,
 EDGE,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

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

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

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

TYPE IfcWindowTypeEnum = ENUMERATION OF (
 WINDOW,
 SKYLIGHT,
 LIGHTDOME,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

TYPE IfcWorkCalendarTypeEnum = ENUMERATION OF (
 FIRSTSHIFT,
 SECONDSHIFT,
 THIRDSHIFT,
 USERDEFINED,
 NOTDEFINED);
END_TYPE;

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

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

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

TYPE IfcAppliedValueSelect = SELECT (
 
IfcMeasureWithUnit,
 IfcValue,
 IfcReference);
END_TYPE;

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

TYPE IfcBendingParameterSelect = SELECT (
 
IfcLengthMeasure,
 IfcPlaneAngleMeasure);
END_TYPE;

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

TYPE IfcClassificationReferenceSelect = SELECT (
 
IfcClassificationReference,
 IfcClassification);
END_TYPE;

TYPE IfcClassificationSelect = SELECT (
 
IfcClassification,
 IfcClassificationReference);
END_TYPE;

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

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

TYPE IfcCoordinateReferenceSystemSelect = SELECT (
 
IfcCoordinateReferenceSystem,
 IfcGeometricRepresentationContext);
END_TYPE;

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

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

TYPE IfcCurveOnSurface = SELECT (
 
IfcCompositeCurveOnSurface,
 IfcPcurve);
END_TYPE;

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

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

TYPE IfcDefinitionSelect = SELECT (
 
IfcObjectDefinition,
 IfcPropertyDefinition);
END_TYPE;

TYPE IfcDerivedMeasureValue = SELECT (
 
IfcVolumetricFlowRateMeasure,
 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,
 IfcTemperatureRateOfChangeMeasure,
 IfcAreaDensityMeasure,
 IfcSoundPowerLevelMeasure,
 IfcSoundPressureLevelMeasure);
END_TYPE;

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

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

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

TYPE IfcGridPlacementDirectionSelect = SELECT (
 
IfcVirtualGridIntersection,
 IfcDirection);
END_TYPE;

TYPE IfcHatchLineDistanceSelect = SELECT (
 
IfcPositiveLengthMeasure,
 IfcVector);
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 (
 
IfcMaterialUsageDefinition,
 IfcMaterialDefinition,
 IfcMaterialList);
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,
 IfcNonNegativeLengthMeasure);
END_TYPE;

TYPE IfcMetricValueSelect = SELECT (
 
IfcMeasureWithUnit,
 IfcTable,
 IfcTimeSeries,
 IfcAppliedValue,
 IfcValue,
 IfcReference);
END_TYPE;

TYPE IfcModulusOfRotationalSubgradeReactionSelect = SELECT (
 
IfcBoolean,
 IfcModulusOfRotationalSubgradeReactionMeasure);
END_TYPE;

TYPE IfcModulusOfSubgradeReactionSelect = SELECT (
 
IfcBoolean,
 IfcModulusOfSubgradeReactionMeasure);
END_TYPE;

TYPE IfcModulusOfTranslationalSubgradeReactionSelect = SELECT (
 
IfcBoolean,
 IfcModulusOfLinearSubgradeReactionMeasure);
END_TYPE;

TYPE IfcObjectReferenceSelect = SELECT (
 
IfcMaterialDefinition,
 IfcPerson,
 IfcOrganization,
 IfcPersonAndOrganization,
 IfcExternalReference,
 IfcTimeSeries,
 IfcAddress,
 IfcAppliedValue,
 IfcTable);
END_TYPE;

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

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

TYPE IfcProcessSelect = SELECT (
 
IfcProcess,
 IfcTypeProcess);
END_TYPE;

TYPE IfcProductRepresentationSelect = SELECT (
 
IfcProductDefinitionShape,
 IfcRepresentationMap);
END_TYPE;

TYPE IfcProductSelect = SELECT (
 
IfcProduct,
 IfcTypeProduct);
END_TYPE;

TYPE IfcPropertySetDefinitionSelect = SELECT (
 
IfcPropertySetDefinitionSet,
 IfcPropertySetDefinition);
END_TYPE;

TYPE IfcResourceObjectSelect = SELECT (
 
IfcPropertyAbstraction,
 IfcPhysicalQuantity,
 IfcAppliedValue,
 IfcContextDependentUnit,
 IfcConversionBasedUnit,
 IfcProfileDef,
 IfcActorRole,
 IfcApproval,
 IfcConstraint,
 IfcTimeSeries,
 IfcMaterialDefinition,
 IfcPerson,
 IfcPersonAndOrganization,
 IfcOrganization,
 IfcExternalReference,
 IfcExternalInformation);
END_TYPE;

TYPE IfcResourceSelect = SELECT (
 
IfcResource,
 IfcTypeResource);
END_TYPE;

TYPE IfcRotationalStiffnessSelect = SELECT (
 
IfcBoolean,
 IfcRotationalStiffnessMeasure);
END_TYPE;

TYPE IfcSegmentIndexSelect = SELECT (
 
IfcLineIndex,
 IfcArcIndex);
END_TYPE;

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

TYPE IfcSimpleValue = SELECT (
 
IfcInteger,
 IfcReal,
 IfcBoolean,
 IfcIdentifier,
 IfcText,
 IfcLabel,
 IfcLogical,
 IfcDateTime,
 IfcDate,
 IfcTime,
 IfcDuration,
 IfcTimeStamp,
 IfcPositiveInteger);
END_TYPE;

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

TYPE IfcSolidOrShell = SELECT (
 
IfcSolidModel,
 IfcClosedShell);
END_TYPE;

TYPE IfcSpaceBoundarySelect = SELECT (
 
IfcSpace,
 IfcExternalSpatialElement);
END_TYPE;

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

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

TYPE IfcStyleAssignmentSelect = SELECT (
 
IfcPresentationStyleAssignment,
 IfcPresentationStyle);
END_TYPE;

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

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

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

TYPE IfcTimeOrRatioSelect = SELECT (
 
IfcRatioMeasure,
 IfcDuration);
END_TYPE;

TYPE IfcTranslationalStiffnessSelect = SELECT (
 
IfcBoolean,
 IfcLinearStiffnessMeasure);
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;

TYPE IfcWarpingStiffnessSelect = SELECT (
 
IfcBoolean,
 IfcWarpingMomentMeasure);
END_TYPE;

ENTITY IfcActionRequest
 SUBTYPE OF (
IfcControl);
  PredefinedType : OPTIONAL IfcActionRequestTypeEnum;
  Status : OPTIONAL IfcLabel;
  LongDescription : OPTIONAL IfcText;
END_ENTITY;

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

ENTITY IfcActorRole;
  Role :
IfcRoleEnum;
  UserDefinedRole : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
 INVERSE
  HasExternalReference : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
 WHERE
  WR1 : (Role <> IfcRoleEnum.USERDEFINED) OR ((Role = IfcRoleEnum.USERDEFINED) AND EXISTS(SELF.UserDefinedRole));
END_ENTITY;

ENTITY IfcActuator
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcActuatorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcActuatorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcActuatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCACTUATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcActuatorType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcActuatorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcActuatorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcActuatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcAdvancedBrep
 SUPERTYPE OF(
IfcAdvancedBrepWithVoids)
 SUBTYPE OF (IfcManifoldSolidBrep);
 WHERE
  HasAdvancedFaces : SIZEOF(QUERY(Afs <* SELF\IfcManifoldSolidBrep.Outer.CfsFaces | (NOT ('IFCTOPOLOGYRESOURCE.IFCADVANCEDFACE' IN TYPEOF(Afs))) )) = 0;
END_ENTITY;

ENTITY IfcAdvancedBrepWithVoids
 SUBTYPE OF (
IfcAdvancedBrep);
  Voids : SET [1:?] OF IfcClosedShell;
 WHERE
  VoidsHaveAdvancedFaces : SIZEOF (QUERY (Vsh <* Voids | SIZEOF (QUERY (Afs <* Vsh.CfsFaces | (NOT ('IFCTOPOLOGYRESOURCE.IFCADVANCEDFACE' IN TYPEOF(Afs))) )) = 0 )) = 0;
END_ENTITY;

ENTITY IfcAdvancedFace
 SUBTYPE OF (
IfcFaceSurface);
 WHERE
  ApplicableSurface : SIZEOF ( ['IFCGEOMETRYRESOURCE.IFCELEMENTARYSURFACE', 'IFCGEOMETRYRESOURCE.IFCSWEPTSURFACE', 'IFCGEOMETRYRESOURCE.IFCBSPLINESURFACE'] * TYPEOF(SELF\IfcFaceSurface.FaceSurface)) = 1;
  RequiresEdgeCurve : SIZEOF(QUERY (ElpFbnds <* QUERY (Bnds <* SELF\IfcFace.Bounds | 'IFCTOPOLOGYRESOURCE.IFCEDGELOOP' IN TYPEOF(Bnds.Bound)) | NOT (SIZEOF (QUERY (Oe <* ElpFbnds.Bound\IfcEdgeLoop.EdgeList | NOT('IFCTOPOLOGYRESOURCE.IFCEDGECURVE' IN TYPEOF(Oe\IfcOrientedEdge.EdgeElement) ))) = 0 ))) = 0;
  ApplicableEdgeCurves : SIZEOF(QUERY (ElpFbnds <* QUERY (Bnds <* SELF\IfcFace.Bounds | 'IFCTOPOLOGYRESOURCE.IFCEDGELOOP' IN TYPEOF(Bnds.Bound)) | NOT (SIZEOF (QUERY (Oe <* ElpFbnds.Bound\IfcEdgeLoop.EdgeList | NOT (SIZEOF (['IFCGEOMETRYRESOURCE.IFCLINE', 'IFCGEOMETRYRESOURCE.IFCCONIC', 'IFCGEOMETRYRESOURCE.IFCPOLYLINE', 'IFCGEOMETRYRESOURCE.IFCBSPLINECURVE'] * TYPEOF(Oe\IfcOrientedEdge.EdgeElement\IfcEdgeCurve.EdgeGeometry)) = 1 ) )) = 0 ))) = 0;
END_ENTITY;

ENTITY IfcAirTerminal
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcAirTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcAirTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAirTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCAIRTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcAirTerminalBox
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcAirTerminalBoxTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcAirTerminalBoxTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAirTerminalBoxTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCAIRTERMINALBOXTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

ENTITY IfcAirToAirHeatRecovery
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcAirToAirHeatRecoveryTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAirToAirHeatRecoveryTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCAIRTOAIRHEATRECOVERYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcAlarm
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcAlarmTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcAlarmTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAlarmTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCALARMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcAlarmType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcAlarmTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcAlarmTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAlarmTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

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

ENTITY IfcAppliedValue
 SUPERTYPE OF(
IfcCostValue);
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  AppliedValue : OPTIONAL IfcAppliedValueSelect;
  UnitBasis : OPTIONAL IfcMeasureWithUnit;
  ApplicableDate : OPTIONAL IfcDate;
  FixedUntilDate : OPTIONAL IfcDate;
  Category : OPTIONAL IfcLabel;
  Condition : OPTIONAL IfcLabel;
  ArithmeticOperator : OPTIONAL IfcArithmeticOperatorEnum;
  Components : OPTIONAL LIST [1:?] OF IfcAppliedValue;
 INVERSE
  HasExternalReference : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
END_ENTITY;

ENTITY IfcApproval;
  Identifier : OPTIONAL
IfcIdentifier;
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  TimeOfApproval : OPTIONAL IfcDateTime;
  Status : OPTIONAL IfcLabel;
  Level : OPTIONAL IfcLabel;
  Qualifier : OPTIONAL IfcText;
  RequestingApproval : OPTIONAL IfcActorSelect;
  GivingApproval : OPTIONAL IfcActorSelect;
 INVERSE
  HasExternalReferences : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
  ApprovedObjects : SET OF IfcRelAssociatesApproval FOR RelatingApproval;
  ApprovedResources : SET OF IfcResourceApprovalRelationship FOR RelatingApproval;
  IsRelatedWith : SET OF IfcApprovalRelationship FOR RelatedApprovals;
  Relates : SET OF IfcApprovalRelationship FOR RelatingApproval;
 WHERE
  HasIdentifierOrName : EXISTS (Identifier) OR EXISTS (Name);
END_ENTITY;

ENTITY IfcApprovalRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingApproval : IfcApproval;
  RelatedApprovals : SET [1:?] OF IfcApproval;
END_ENTITY;

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

ENTITY IfcArbitraryOpenProfileDef
 SUPERTYPE OF(
IfcCenterLineProfileDef)
 SUBTYPE OF (IfcProfileDef);
  Curve : IfcBoundedCurve;
 WHERE
  WR11 : ('IFCPROFILERESOURCE.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 | 'IFCGEOMETRYRESOURCE.IFCLINE' IN TYPEOF(temp))) = 0;
END_ENTITY;

ENTITY IfcAsset
 SUBTYPE OF (
IfcGroup);
  Identification : OPTIONAL IfcIdentifier;
  OriginalValue : OPTIONAL IfcCostValue;
  CurrentValue : OPTIONAL IfcCostValue;
  TotalReplacementCost : OPTIONAL IfcCostValue;
  Owner : OPTIONAL IfcActorSelect;
  User : OPTIONAL IfcActorSelect;
  ResponsiblePerson : OPTIONAL IfcPerson;
  IncorporationDate : OPTIONAL IfcDate;
  DepreciatedValue : OPTIONAL IfcCostValue;
END_ENTITY;

ENTITY IfcAsymmetricIShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  BottomFlangeWidth : IfcPositiveLengthMeasure;
  OverallDepth : IfcPositiveLengthMeasure;
  WebThickness : IfcPositiveLengthMeasure;
  BottomFlangeThickness : IfcPositiveLengthMeasure;
  BottomFlangeFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  TopFlangeWidth : IfcPositiveLengthMeasure;
  TopFlangeThickness : OPTIONAL IfcPositiveLengthMeasure;
  TopFlangeFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  BottomFlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  BottomFlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
  TopFlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  TopFlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
 WHERE
  ValidFlangeThickness : NOT(EXISTS(TopFlangeThickness)) OR ((BottomFlangeThickness + TopFlangeThickness) < OverallDepth);
  ValidWebThickness : (WebThickness < BottomFlangeWidth) AND (WebThickness < TopFlangeWidth);
  ValidBottomFilletRadius : (NOT(EXISTS(BottomFlangeFilletRadius))) OR (BottomFlangeFilletRadius <= (BottomFlangeWidth - WebThickness)/2.);
  ValidTopFilletRadius : (NOT(EXISTS(TopFlangeFilletRadius))) OR (TopFlangeFilletRadius <= (TopFlangeWidth - WebThickness)/2.);
END_ENTITY;

ENTITY IfcAudioVisualAppliance
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcAudioVisualApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcAudioVisualApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAudioVisualApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCAUDIOVISUALAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcAudioVisualApplianceType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcAudioVisualApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcAudioVisualApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcAudioVisualApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcAxis2Placement3D
 SUBTYPE OF (
IfcPlacement);
  Axis : OPTIONAL IfcDirection;
  RefDirection : OPTIONAL IfcDirection;
 DERIVE
  P : LIST [3:3] OF IfcDirection := IfcBuildAxes(Axis, RefDirection);
 WHERE
  LocationIs3D : SELF\IfcPlacement.Location.Dim = 3;
  AxisIs3D : (NOT (EXISTS (Axis))) OR (Axis.Dim = 3);
  RefDirIs3D : (NOT (EXISTS (RefDirection))) OR (RefDirection.Dim = 3);
  AxisToRefDirPosition : (NOT (EXISTS (Axis))) OR (NOT (EXISTS (RefDirection))) OR (IfcCrossProduct(Axis,RefDirection).Magnitude > 0.0);
  AxisAndRefDirProvision : NOT ((EXISTS (Axis)) XOR (EXISTS (RefDirection)));
END_ENTITY;

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

ENTITY IfcBSplineCurveWithKnots
 SUPERTYPE OF(
IfcRationalBSplineCurveWithKnots)
 SUBTYPE OF (IfcBSplineCurve);
  KnotMultiplicities : LIST [2:?] OF IfcInteger;
  Knots : LIST [2:?] OF IfcParameterValue;
  KnotSpec : IfcKnotType;
 DERIVE
  UpperIndexOnKnots : IfcInteger := SIZEOF(Knots);
 WHERE
  ConsistentBSpline : IfcConstraintsParamBSpline(Degree, UpperIndexOnKnots, UpperIndexOnControlPoints, KnotMultiplicities, Knots);
  CorrespondingKnotLists : SIZEOF(KnotMultiplicities) = UpperIndexOnKnots;
END_ENTITY;

ENTITY IfcBSplineSurface
 ABSTRACT SUPERTYPE OF(
IfcBSplineSurfaceWithKnots)
 SUBTYPE OF (IfcBoundedSurface);
  UDegree : IfcInteger;
  VDegree : IfcInteger;
  ControlPointsList : LIST [2:?] OF LIST [2:?] OF IfcCartesianPoint;
  SurfaceForm : IfcBSplineSurfaceForm;
  UClosed : IfcLogical;
  VClosed : IfcLogical;
  SelfIntersect : IfcLogical;
 DERIVE
  UUpper : IfcInteger := SIZEOF(ControlPointsList) - 1;
  VUpper : IfcInteger := SIZEOF(ControlPointsList[1]) - 1;
  ControlPoints : ARRAY [0:UUpper] OF ARRAY [0:VUpper] OF IfcCartesianPoint := IfcMakeArrayOfArray(ControlPointsList, 0,UUpper,0,VUpper);
END_ENTITY;

ENTITY IfcBSplineSurfaceWithKnots
 SUPERTYPE OF(
IfcRationalBSplineSurfaceWithKnots)
 SUBTYPE OF (IfcBSplineSurface);
  UMultiplicities : LIST [2:?] OF IfcInteger;
  VMultiplicities : LIST [2:?] OF IfcInteger;
  UKnots : LIST [2:?] OF IfcParameterValue;
  VKnots : LIST [2:?] OF IfcParameterValue;
  KnotSpec : IfcKnotType;
 DERIVE
  KnotVUpper : IfcInteger := SIZEOF(VKnots);
  KnotUUpper : IfcInteger := SIZEOF(UKnots);
 WHERE
  UDirectionConstraints : IfcConstraintsParamBSpline ( SELF\IfcBSplineSurface.UDegree, KnotUUpper, SELF\IfcBSplineSurface.UUpper, UMultiplicities, UKnots);
  VDirectionConstraints : IfcConstraintsParamBSpline ( SELF\IfcBSplineSurface.VDegree, KnotVUpper, SELF\IfcBSplineSurface.VUpper, VMultiplicities, VKnots);
  CorrespondingULists : SIZEOF(UMultiplicities) = KnotUUpper;
  CorrespondingVLists : SIZEOF(VMultiplicities) = KnotVUpper;
END_ENTITY;

ENTITY IfcBeam
 SUPERTYPE OF(
IfcBeamStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcBeamTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcBeamTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBeamTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCBEAMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcBeamStandardCase
 SUBTYPE OF (
IfcBeam);
 WHERE
  HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcBeamType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcBeamTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcBeamTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBeamTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcBlobTexture
 SUBTYPE OF (
IfcSurfaceTexture);
  RasterFormat : IfcIdentifier;
  RasterCode : IfcBinary;
 WHERE
  SupportedRasterFormat : SELF.RasterFormat IN ['BMP', 'JPG', 'GIF', 'PNG'];
  RasterCodeByteStream : BLENGTH(RasterCode) MOD 8 = 0;
END_ENTITY;

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

ENTITY IfcBoiler
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcBoilerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcBoilerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBoilerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCBOILERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcBooleanClippingResult
 SUBTYPE OF (
IfcBooleanResult);
 WHERE
  FirstOperandType : ('IFCGEOMETRICMODELRESOURCE.IFCSWEPTAREASOLID' IN TYPEOF(FirstOperand)) OR ('IFCGEOMETRICMODELRESOURCE.IFCSWEPTDISCSOLID' IN TYPEOF(FirstOperand)) OR ('IFCGEOMETRICMODELRESOURCE.IFCBOOLEANCLIPPINGRESULT' IN TYPEOF(FirstOperand));
  SecondOperandType : ('IFCGEOMETRICMODELRESOURCE.IFCHALFSPACESOLID' IN TYPEOF(SecondOperand));
  OperatorType : Operator = DIFFERENCE;
END_ENTITY;

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

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

ENTITY IfcBoundaryCurve
 SUPERTYPE OF(
IfcOuterBoundaryCurve)
 SUBTYPE OF (IfcCompositeCurveOnSurface);
 WHERE
  IsClosed : SELF\IfcCompositeCurve.ClosedCurve;
END_ENTITY;

ENTITY IfcBoundaryEdgeCondition
 SUBTYPE OF (
IfcBoundaryCondition);
  TranslationalStiffnessByLengthX : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
  TranslationalStiffnessByLengthY : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
  TranslationalStiffnessByLengthZ : OPTIONAL IfcModulusOfTranslationalSubgradeReactionSelect;
  RotationalStiffnessByLengthX : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
  RotationalStiffnessByLengthY : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
  RotationalStiffnessByLengthZ : OPTIONAL IfcModulusOfRotationalSubgradeReactionSelect;
END_ENTITY;

ENTITY IfcBoundaryFaceCondition
 SUBTYPE OF (
IfcBoundaryCondition);
  TranslationalStiffnessByAreaX : OPTIONAL IfcModulusOfSubgradeReactionSelect;
  TranslationalStiffnessByAreaY : OPTIONAL IfcModulusOfSubgradeReactionSelect;
  TranslationalStiffnessByAreaZ : OPTIONAL IfcModulusOfSubgradeReactionSelect;
END_ENTITY;

ENTITY IfcBoundaryNodeCondition
 SUPERTYPE OF(
IfcBoundaryNodeConditionWarping)
 SUBTYPE OF (IfcBoundaryCondition);
  TranslationalStiffnessX : OPTIONAL IfcTranslationalStiffnessSelect;
  TranslationalStiffnessY : OPTIONAL IfcTranslationalStiffnessSelect;
  TranslationalStiffnessZ : OPTIONAL IfcTranslationalStiffnessSelect;
  RotationalStiffnessX : OPTIONAL IfcRotationalStiffnessSelect;
  RotationalStiffnessY : OPTIONAL IfcRotationalStiffnessSelect;
  RotationalStiffnessZ : OPTIONAL IfcRotationalStiffnessSelect;
END_ENTITY;

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

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

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

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

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

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

ENTITY IfcBuildingElement
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBeam, IfcBuildingElementProxy, IfcChimney, IfcColumn, IfcCovering, IfcCurtainWall, IfcDoor, IfcFooting, IfcMember, IfcPile, IfcPlate, IfcRailing, IfcRamp, IfcRampFlight, IfcRoof, IfcShadingDevice, IfcSlab, IfcStair, IfcStairFlight, IfcWall, IfcWindow))
 SUBTYPE OF (IfcElement);
 WHERE
  MaxOneMaterialAssociation : SIZEOF (QUERY(temp <* SELF\IfcObjectDefinition.HasAssociations | 'IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp) )) <= 1;
END_ENTITY;

ENTITY IfcBuildingElementPart
 SUBTYPE OF (
IfcElementComponent);
  PredefinedType : OPTIONAL IfcBuildingElementPartTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcBuildingElementPartTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBuildingElementPartTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDCOMPONENTELEMENTS.IFCBUILDINGELEMENTPARTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcBuildingElementPartType
 SUBTYPE OF (
IfcElementComponentType);
  PredefinedType : IfcBuildingElementPartTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcBuildingElementPartTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBuildingElementPartTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcBuildingElementProxy
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcBuildingElementProxyTypeEnum;
 WHERE
  HasObjectName : EXISTS(SELF\IfcRoot.Name);
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcBuildingElementProxyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBuildingElementProxyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCBUILDINGELEMENTPROXYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcBuildingElementProxyType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcBuildingElementProxyTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcBuildingElementProxyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBuildingElementProxyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcBuildingElementType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBeamType, IfcBuildingElementProxyType, IfcChimneyType, IfcColumnType, IfcCoveringType, IfcCurtainWallType, IfcDoorType, IfcFootingType, IfcMemberType, IfcPileType, IfcPlateType, IfcRailingType, IfcRampFlightType, IfcRampType, IfcRoofType, IfcShadingDeviceType, IfcSlabType, IfcStairFlightType, IfcStairType, IfcWallType, IfcWindowType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

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

ENTITY IfcBuildingSystem
 SUBTYPE OF (
IfcSystem);
  PredefinedType : OPTIONAL IfcBuildingSystemTypeEnum;
  LongName : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcBurner
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcBurnerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcBurnerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBurnerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCBURNERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcBurnerType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcBurnerTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcBurnerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcBurnerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  Depth : IfcPositiveLengthMeasure;
  Width : IfcPositiveLengthMeasure;
  WallThickness : IfcPositiveLengthMeasure;
  Girth : IfcPositiveLengthMeasure;
  InternalFilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
 WHERE
  ValidGirth : Girth < (Depth / 2.);
  ValidInternalFilletRadius : NOT(EXISTS(InternalFilletRadius)) OR ((InternalFilletRadius <= Width/2. - WallThickness) AND (InternalFilletRadius <= Depth/2. - WallThickness));
  ValidWallThickness : (WallThickness < Width/2.) AND (WallThickness < Depth/2.);
END_ENTITY;

ENTITY IfcCableCarrierFitting
 SUBTYPE OF (
IfcFlowFitting);
  PredefinedType : OPTIONAL IfcCableCarrierFittingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCableCarrierFittingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableCarrierFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCCABLECARRIERFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcCableCarrierSegment
 SUBTYPE OF (
IfcFlowSegment);
  PredefinedType : OPTIONAL IfcCableCarrierSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCableCarrierSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableCarrierSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCCABLECARRIERSEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCableCarrierSegmentType
 SUBTYPE OF (
IfcFlowSegmentType);
  PredefinedType : IfcCableCarrierSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCableCarrierSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableCarrierSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCableFitting
 SUBTYPE OF (
IfcFlowFitting);
  PredefinedType : OPTIONAL IfcCableFittingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCableFittingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCCABLEFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCableFittingType
 SUBTYPE OF (
IfcFlowFittingType);
  PredefinedType : IfcCableFittingTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCableFittingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableFittingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCableSegment
 SUBTYPE OF (
IfcFlowSegment);
  PredefinedType : OPTIONAL IfcCableSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCableSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCCABLESEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCableSegmentType
 SUBTYPE OF (
IfcFlowSegmentType);
  PredefinedType : IfcCableSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCableSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCableSegmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcCartesianPointList
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcCartesianPointList2D, IfcCartesianPointList3D))
 SUBTYPE OF (IfcGeometricRepresentationItem);
 DERIVE
  Dim : IfcDimensionCount := IfcPointListDim(SELF);
END_ENTITY;

ENTITY IfcCartesianPointList2D
 SUBTYPE OF (
IfcCartesianPointList);
  CoordList : LIST [1:?] OF LIST [2:2] OF IfcLengthMeasure;
END_ENTITY;

ENTITY IfcCartesianPointList3D
 SUBTYPE OF (
IfcCartesianPointList);
  CoordList : LIST [1:?] OF LIST [3:3] OF IfcLengthMeasure;
END_ENTITY;

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

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

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

ENTITY IfcCartesianTransformationOperator3D
 SUPERTYPE OF(
IfcCartesianTransformationOperator3DnonUniform)
 SUBTYPE OF (IfcCartesianTransformationOperator);
  Axis3 : OPTIONAL IfcDirection;
 DERIVE
  U : LIST [3:3] OF IfcDirection := IfcBaseAxis(3,SELF\IfcCartesianTransformationOperator.Axis1, SELF\IfcCartesianTransformationOperator.Axis2,Axis3);
 WHERE
  DimIs3D : SELF\IfcCartesianTransformationOperator.Dim = 3;
  Axis1Is3D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis1)) OR (SELF\IfcCartesianTransformationOperator.Axis1.Dim = 3);
  Axis2Is3D : NOT(EXISTS(SELF\IfcCartesianTransformationOperator.Axis2)) OR (SELF\IfcCartesianTransformationOperator.Axis2.Dim = 3);
  Axis3Is3D : NOT(EXISTS(Axis3)) OR (Axis3.Dim = 3);
END_ENTITY;

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

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

ENTITY IfcChiller
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcChillerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcChillerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcChillerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCHILLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcChimney
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcChimneyTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcChimneyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcChimneyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCCHIMNEYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcChimneyType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcChimneyTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcChimneyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcChimneyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

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

ENTITY IfcCivilElement
 SUBTYPE OF (
IfcElement);
END_ENTITY;

ENTITY IfcCivilElementType
 SUBTYPE OF (
IfcElementType);
END_ENTITY;

ENTITY IfcClassification
 SUBTYPE OF (
IfcExternalInformation);
  Source : OPTIONAL IfcLabel;
  Edition : OPTIONAL IfcLabel;
  EditionDate : OPTIONAL IfcDate;
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  Location : OPTIONAL IfcURIReference;
  ReferenceTokens : OPTIONAL LIST [1:?] OF IfcIdentifier;
 INVERSE
  ClassificationForObjects : SET OF IfcRelAssociatesClassification FOR RelatingClassification;
  HasReferences : SET OF IfcClassificationReference FOR ReferencedSource;
END_ENTITY;

ENTITY IfcClassificationReference
 SUBTYPE OF (
IfcExternalReference);
  ReferencedSource : OPTIONAL IfcClassificationReferenceSelect;
  Description : OPTIONAL IfcText;
  Sort : OPTIONAL IfcIdentifier;
 INVERSE
  ClassificationRefForObjects : SET [0:?] OF IfcRelAssociatesClassification FOR RelatingClassification;
  HasReferences : SET [0:?] OF IfcClassificationReference FOR ReferencedSource;
END_ENTITY;

ENTITY IfcClosedShell
 SUBTYPE OF (
IfcConnectedFaceSet);
END_ENTITY;

ENTITY IfcCoil
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcCoilTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCoilTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCoilTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCOILTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

ENTITY IfcColourRgbList
 SUBTYPE OF (
IfcPresentationItem);
  ColourList : LIST [1:?] OF LIST [3:3] OF IfcNormalisedRatioMeasure;
END_ENTITY;

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

ENTITY IfcColumn
 SUPERTYPE OF(
IfcColumnStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcColumnTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcColumnTypeEnum.USERDEFINED) OR ((PredefinedType = IfcColumnTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCCOLUMNTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcColumnStandardCase
 SUBTYPE OF (
IfcColumn);
 WHERE
  HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcColumnType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcColumnTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcColumnTypeEnum.USERDEFINED) OR ((PredefinedType = IfcColumnTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCommunicationsAppliance
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcCommunicationsApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCommunicationsApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCommunicationsApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCCOMMUNICATIONSAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCommunicationsApplianceType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcCommunicationsApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCommunicationsApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCommunicationsApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcComplexPropertyTemplate
 SUBTYPE OF (
IfcPropertyTemplate);
  UsageName : OPTIONAL IfcLabel;
  TemplateType : OPTIONAL IfcComplexPropertyTemplateTypeEnum;
  HasPropertyTemplates : OPTIONAL SET [1:?] OF IfcPropertyTemplate;
 WHERE
  UniquePropertyNames : IfcUniquePropertyTemplateNames(HasPropertyTemplates);
  NoSelfReference : SIZEOF(QUERY(temp <* HasPropertyTemplates | SELF :=: temp)) = 0;
END_ENTITY;

ENTITY IfcCompositeCurve
 SUPERTYPE OF(
IfcCompositeCurveOnSurface)
 SUBTYPE OF (IfcBoundedCurve);
  Segments : LIST [1:?] OF IfcCompositeCurveSegment;
  SelfIntersect : IfcLogical;
 DERIVE
  NSegments : IfcInteger := SIZEOF(Segments);
  ClosedCurve : IfcLogical := Segments[NSegments].Transition <> Discontinuous;
 WHERE
  CurveContinuous : ((NOT ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 1)) OR ((ClosedCurve) AND (SIZEOF(QUERY(Temp <* Segments | Temp.Transition = Discontinuous)) = 0));
  SameDim : SIZEOF( QUERY( Temp <* Segments | Temp.Dim <> Segments[1].Dim)) = 0;
END_ENTITY;

ENTITY IfcCompositeCurveOnSurface
 SUPERTYPE OF(
IfcBoundaryCurve)
 SUBTYPE OF (IfcCompositeCurve);
 DERIVE
  BasisSurface : SET [0:1] OF IfcSurface := IfcGetBasisSurface(SELF);
 WHERE
  SameSurface : SIZEOF(BasisSurface) > 0;
END_ENTITY;

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

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

ENTITY IfcCompressor
 SUBTYPE OF (
IfcFlowMovingDevice);
  PredefinedType : OPTIONAL IfcCompressorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCompressorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCompressorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCOMPRESSORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcCondenser
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcCondenserTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCondenserTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCondenserTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCONDENSERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

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

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

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

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

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

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

ENTITY IfcConnectionVolumeGeometry
 SUBTYPE OF (
IfcConnectionGeometry);
  VolumeOnRelatingElement : IfcSolidOrShell;
  VolumeOnRelatedElement : OPTIONAL IfcSolidOrShell;
END_ENTITY;

ENTITY IfcConstraint
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcMetric, IfcObjective));
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  ConstraintGrade : IfcConstraintEnum;
  ConstraintSource : OPTIONAL IfcLabel;
  CreatingActor : OPTIONAL IfcActorSelect;
  CreationTime : OPTIONAL IfcDateTime;
  UserDefinedGrade : OPTIONAL IfcLabel;
 INVERSE
  HasExternalReferences : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
  PropertiesForConstraint : SET OF IfcResourceConstraintRelationship FOR RelatingConstraint;
 WHERE
  WR11 : (ConstraintGrade <> IfcConstraintEnum.USERDEFINED) OR ((ConstraintGrade = IfcConstraintEnum.USERDEFINED) AND EXISTS(SELF\IfcConstraint.UserDefinedGrade));
END_ENTITY;

ENTITY IfcConstructionEquipmentResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcConstructionEquipmentResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcConstructionEquipmentResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcConstructionEquipmentResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionEquipmentResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

ENTITY IfcConstructionMaterialResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcConstructionMaterialResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcConstructionMaterialResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionMaterialResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcConstructionMaterialResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcConstructionMaterialResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcConstructionMaterialResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionMaterialResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

ENTITY IfcConstructionProductResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcConstructionProductResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcConstructionProductResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionProductResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcConstructionProductResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcConstructionProductResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcConstructionProductResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcConstructionProductResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

ENTITY IfcConstructionResource
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcConstructionEquipmentResource, IfcConstructionMaterialResource, IfcConstructionProductResource, IfcCrewResource, IfcLaborResource, IfcSubContractResource))
 SUBTYPE OF (IfcResource);
  Usage : OPTIONAL IfcResourceTime;
  BaseCosts : OPTIONAL LIST [1:?] OF IfcAppliedValue;
  BaseQuantity : OPTIONAL IfcPhysicalQuantity;
END_ENTITY;

ENTITY IfcConstructionResourceType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcConstructionEquipmentResourceType, IfcConstructionMaterialResourceType, IfcConstructionProductResourceType, IfcCrewResourceType, IfcLaborResourceType, IfcSubContractResourceType))
 SUBTYPE OF (IfcTypeResource);
  BaseCosts : OPTIONAL LIST [1:?] OF IfcAppliedValue;
  BaseQuantity : OPTIONAL IfcPhysicalQuantity;
END_ENTITY;

ENTITY IfcContext
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcProject, IfcProjectLibrary))
 SUBTYPE OF (IfcObjectDefinition);
  ObjectType : OPTIONAL IfcLabel;
  LongName : OPTIONAL IfcLabel;
  Phase : OPTIONAL IfcLabel;
  RepresentationContexts : OPTIONAL SET [1:?] OF IfcRepresentationContext;
  UnitsInContext : OPTIONAL IfcUnitAssignment;
 INVERSE
  IsDefinedBy : SET [0:?] OF IfcRelDefinesByProperties FOR RelatedObjects;
  Declares : SET OF IfcRelDeclares FOR RelatingContext;
END_ENTITY;

ENTITY IfcContextDependentUnit
 SUBTYPE OF (
IfcNamedUnit);
  Name : IfcLabel;
 INVERSE
  HasExternalReference : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
END_ENTITY;

ENTITY IfcControl
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcActionRequest, IfcCostItem, IfcCostSchedule, IfcPerformanceHistory, IfcPermit, IfcProjectOrder, IfcWorkCalendar, IfcWorkControl))
 SUBTYPE OF (IfcObject);
  Identification : OPTIONAL IfcIdentifier;
 INVERSE
  Controls : SET OF IfcRelAssignsToControl FOR RelatingControl;
END_ENTITY;

ENTITY IfcController
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcControllerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcControllerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcControllerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCCONTROLLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcControllerType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcControllerTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcControllerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcControllerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcConversionBasedUnit
 SUPERTYPE OF(
IfcConversionBasedUnitWithOffset)
 SUBTYPE OF (IfcNamedUnit);
  Name : IfcLabel;
  ConversionFactor : IfcMeasureWithUnit;
 INVERSE
  HasExternalReference : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
END_ENTITY;

ENTITY IfcConversionBasedUnitWithOffset
 SUBTYPE OF (
IfcConversionBasedUnit);
  ConversionOffset : IfcReal;
END_ENTITY;

ENTITY IfcCooledBeam
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcCooledBeamTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCooledBeamTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCooledBeamTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCOOLEDBEAMTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcCoolingTower
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcCoolingTowerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCoolingTowerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCoolingTowerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCCOOLINGTOWERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcCoordinateOperation
 ABSTRACT SUPERTYPE OF(
IfcMapConversion);
  SourceCRS : IfcCoordinateReferenceSystemSelect;
  TargetCRS : IfcCoordinateReferenceSystem;
END_ENTITY;

ENTITY IfcCoordinateReferenceSystem
 ABSTRACT SUPERTYPE OF(
IfcProjectedCRS);
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  GeodeticDatum : OPTIONAL IfcIdentifier;
  VerticalDatum : OPTIONAL IfcIdentifier;
 INVERSE
  HasCoordinateOperation : SET [0:1] OF IfcCoordinateOperation FOR SourceCRS;
END_ENTITY;

ENTITY IfcCostItem
 SUBTYPE OF (
IfcControl);
  PredefinedType : OPTIONAL IfcCostItemTypeEnum;
  CostValues : OPTIONAL LIST [1:?] OF IfcCostValue;
  CostQuantities : OPTIONAL LIST [1:?] OF IfcPhysicalQuantity;
END_ENTITY;

ENTITY IfcCostSchedule
 SUBTYPE OF (
IfcControl);
  PredefinedType : OPTIONAL IfcCostScheduleTypeEnum;
  Status : OPTIONAL IfcLabel;
  SubmittedOn : OPTIONAL IfcDateTime;
  UpdateDate : OPTIONAL IfcDateTime;
END_ENTITY;

ENTITY IfcCostValue
 SUBTYPE OF (
IfcAppliedValue);
END_ENTITY;

ENTITY IfcCovering
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcCoveringTypeEnum;
 INVERSE
  CoversSpaces : SET [0:1] OF IfcRelCoversSpaces FOR RelatedCoverings;
  CoversElements : SET [0:1] OF IfcRelCoversBldgElements FOR RelatedCoverings;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCoveringTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCoveringTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCCOVERINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCoveringType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcCoveringTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCoveringTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCoveringTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcCrewResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcCrewResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCrewResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCrewResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcCrewResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcCrewResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCrewResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCrewResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

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

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

ENTITY IfcCurrencyRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingMonetaryUnit : IfcMonetaryUnit;
  RelatedMonetaryUnit : IfcMonetaryUnit;
  ExchangeRate : IfcPositiveRatioMeasure;
  RateDateTime : OPTIONAL IfcDateTime;
  RateSource : OPTIONAL IfcLibraryInformation;
END_ENTITY;

ENTITY IfcCurtainWall
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcCurtainWallTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcCurtainWallTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCurtainWallTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCCURTAINWALLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcCurtainWallType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcCurtainWallTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcCurtainWallTypeEnum.USERDEFINED) OR ((PredefinedType = IfcCurtainWallTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcCurveBoundedPlane
 SUBTYPE OF (
IfcBoundedSurface);
  BasisSurface : IfcPlane;
  OuterBoundary : IfcCurve;
  InnerBoundaries : SET OF IfcCurve;
END_ENTITY;

ENTITY IfcCurveBoundedSurface
 SUBTYPE OF (
IfcBoundedSurface);
  BasisSurface : IfcSurface;
  Boundaries : SET [1:?] OF IfcBoundaryCurve;
  ImplicitOuter : IfcBoolean;
END_ENTITY;

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

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

ENTITY IfcCurveStyleFontAndScaling
 SUBTYPE OF (
IfcPresentationItem);
  Name : OPTIONAL IfcLabel;
  CurveFont : IfcCurveStyleFontSelect;
  CurveFontScaling : IfcPositiveRatioMeasure;
END_ENTITY;

ENTITY IfcCurveStyleFontPattern
 SUBTYPE OF (
IfcPresentationItem);
  VisibleSegmentLength : IfcLengthMeasure;
  InvisibleSegmentLength : IfcPositiveLengthMeasure;
 WHERE
  VisibleLengthGreaterEqualZero : VisibleSegmentLength >= 0.;
END_ENTITY;

ENTITY IfcCylindricalSurface
 SUBTYPE OF (
IfcElementarySurface);
  Radius : IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcDamper
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcDamperTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDamperTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDamperTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCDAMPERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

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

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

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

ENTITY IfcDirection
 SUBTYPE OF (
IfcGeometricRepresentationItem);
  DirectionRatios : LIST [2:3] OF IfcReal;
 DERIVE
  Dim : IfcDimensionCount := HIINDEX(DirectionRatios);
 WHERE
  MagnitudeGreaterZero : SIZEOF(QUERY(Tmp <* DirectionRatios | Tmp <> 0.0)) > 0;
END_ENTITY;

ENTITY IfcDiscreteAccessory
 SUBTYPE OF (
IfcElementComponent);
  PredefinedType : OPTIONAL IfcDiscreteAccessoryTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDiscreteAccessoryTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDiscreteAccessoryTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDCOMPONENTELEMENTS.IFCDISCRETEACCESSORYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcDiscreteAccessoryType
 SUBTYPE OF (
IfcElementComponentType);
  PredefinedType : IfcDiscreteAccessoryTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcDiscreteAccessoryTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDiscreteAccessoryTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcDistributionChamberElement
 SUBTYPE OF (
IfcDistributionFlowElement);
  PredefinedType : OPTIONAL IfcDistributionChamberElementTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDistributionChamberElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDistributionChamberElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGSERVICEELEMENTS.IFCDISTRIBUTIONCHAMBERELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcDistributionChamberElementType
 SUBTYPE OF (
IfcDistributionFlowElementType);
  PredefinedType : IfcDistributionChamberElementTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcDistributionChamberElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDistributionChamberElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcDistributionCircuit
 SUBTYPE OF (
IfcDistributionSystem);
END_ENTITY;

ENTITY IfcDistributionControlElement
 SUPERTYPE OF(ONEOF(
IfcActuator, IfcAlarm, IfcController, IfcFlowInstrument, IfcProtectiveDeviceTrippingUnit, IfcSensor, IfcUnitaryControlElement))
 SUBTYPE OF (IfcDistributionElement);
 INVERSE
  AssignedToFlowElement : SET [0:1] OF IfcRelFlowControlElements FOR RelatedControlElements;
END_ENTITY;

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

ENTITY IfcDistributionElement
 SUPERTYPE OF(ONEOF(
IfcDistributionControlElement, IfcDistributionFlowElement))
 SUBTYPE OF (IfcElement);
 INVERSE
  HasPorts : SET OF IfcRelConnectsPortToElement FOR RelatedElement;
END_ENTITY;

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

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

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

ENTITY IfcDistributionPort
 SUBTYPE OF (
IfcPort);
  FlowDirection : OPTIONAL IfcFlowDirectionEnum;
  PredefinedType : OPTIONAL IfcDistributionPortTypeEnum;
  SystemType : OPTIONAL IfcDistributionSystemEnum;
END_ENTITY;

ENTITY IfcDistributionSystem
 SUPERTYPE OF(
IfcDistributionCircuit)
 SUBTYPE OF (IfcSystem);
  LongName : OPTIONAL IfcLabel;
  PredefinedType : OPTIONAL IfcDistributionSystemEnum;
END_ENTITY;

ENTITY IfcDocumentInformation
 SUBTYPE OF (
IfcExternalInformation);
  Identification : IfcIdentifier;
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  Location : OPTIONAL IfcURIReference;
  Purpose : OPTIONAL IfcText;
  IntendedUse : OPTIONAL IfcText;
  Scope : OPTIONAL IfcText;
  Revision : OPTIONAL IfcLabel;
  DocumentOwner : OPTIONAL IfcActorSelect;
  Editors : OPTIONAL SET [1:?] OF IfcActorSelect;
  CreationTime : OPTIONAL IfcDateTime;
  LastRevisionTime : OPTIONAL IfcDateTime;
  ElectronicFormat : OPTIONAL IfcIdentifier;
  ValidFrom : OPTIONAL IfcDate;
  ValidUntil : OPTIONAL IfcDate;
  Confidentiality : OPTIONAL IfcDocumentConfidentialityEnum;
  Status : OPTIONAL IfcDocumentStatusEnum;
 INVERSE
  DocumentInfoForObjects : SET OF IfcRelAssociatesDocument FOR RelatingDocument;
  HasDocumentReferences : SET OF IfcDocumentReference FOR ReferencedDocument;
  IsPointedTo : SET OF IfcDocumentInformationRelationship FOR RelatedDocuments;
  IsPointer : SET [0:1] OF IfcDocumentInformationRelationship FOR RelatingDocument;
END_ENTITY;

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

ENTITY IfcDocumentReference
 SUBTYPE OF (
IfcExternalReference);
  Description : OPTIONAL IfcText;
  ReferencedDocument : OPTIONAL IfcDocumentInformation;
 INVERSE
  DocumentRefForObjects : SET OF IfcRelAssociatesDocument FOR RelatingDocument;
 WHERE
  WR1 : EXISTS(Name) XOR EXISTS(ReferencedDocument);
END_ENTITY;

ENTITY IfcDoor
 SUPERTYPE OF(
IfcDoorStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
  OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcDoorTypeEnum;
  OperationType : OPTIONAL IfcDoorTypeOperationEnum;
  UserDefinedOperationType : OPTIONAL IfcLabel;
 WHERE
  CorrectStyleAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCDOORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

ENTITY IfcDoorStandardCase
 SUBTYPE OF (
IfcDoor);
END_ENTITY;

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

ENTITY IfcDoorType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcDoorTypeEnum;
  OperationType : IfcDoorTypeOperationEnum;
  ParameterTakesPrecedence : OPTIONAL IfcBoolean;
  UserDefinedOperationType : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcDoorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDoorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcDuctFitting
 SUBTYPE OF (
IfcFlowFitting);
  PredefinedType : OPTIONAL IfcDuctFittingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDuctFittingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDuctFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCDUCTFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcDuctSegment
 SUBTYPE OF (
IfcFlowSegment);
  PredefinedType : OPTIONAL IfcDuctSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDuctSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDuctSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCDUCTSEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcDuctSilencer
 SUBTYPE OF (
IfcFlowTreatmentDevice);
  PredefinedType : OPTIONAL IfcDuctSilencerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcDuctSilencerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcDuctSilencerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCDUCTSILENCERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

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

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

ENTITY IfcElectricAppliance
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcElectricApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricApplianceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICAPPLIANCETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricApplianceType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcElectricApplianceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricApplianceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricApplianceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElectricDistributionBoard
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcElectricDistributionBoardTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricDistributionBoardTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricDistributionBoardTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICDISTRIBUTIONBOARDTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricDistributionBoardType
 SUBTYPE OF (
IfcFlowControllerType);
  PredefinedType : IfcElectricDistributionBoardTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricDistributionBoardTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricDistributionBoardTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElectricFlowStorageDevice
 SUBTYPE OF (
IfcFlowStorageDevice);
  PredefinedType : OPTIONAL IfcElectricFlowStorageDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICFLOWSTORAGEDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricFlowStorageDeviceType
 SUBTYPE OF (
IfcFlowStorageDeviceType);
  PredefinedType : IfcElectricFlowStorageDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricFlowStorageDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElectricGenerator
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcElectricGeneratorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricGeneratorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricGeneratorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICGENERATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricGeneratorType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcElectricGeneratorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricGeneratorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricGeneratorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElectricMotor
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcElectricMotorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricMotorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricMotorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICMOTORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricMotorType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcElectricMotorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricMotorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricMotorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElectricTimeControl
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcElectricTimeControlTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElectricTimeControlTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricTimeControlTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCELECTRICTIMECONTROLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElectricTimeControlType
 SUBTYPE OF (
IfcFlowControllerType);
  PredefinedType : IfcElectricTimeControlTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElectricTimeControlTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElectricTimeControlTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcElementAssembly
 SUBTYPE OF (
IfcElement);
  AssemblyPlace : OPTIONAL IfcAssemblyPlaceEnum;
  PredefinedType : OPTIONAL IfcElementAssemblyTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPRODUCTEXTENSION.IFCELEMENTASSEMBLYTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcElementAssemblyType
 SUBTYPE OF (
IfcElementType);
  PredefinedType : IfcElementAssemblyTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcElementAssemblyTypeEnum.USERDEFINED) OR ((PredefinedType = IfcElementAssemblyTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcElementComponent
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBuildingElementPart, IfcDiscreteAccessory, IfcFastener, IfcMechanicalFastener, IfcReinforcingElement, IfcVibrationIsolator))
 SUBTYPE OF (IfcElement);
END_ENTITY;

ENTITY IfcElementComponentType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBuildingElementPartType, IfcDiscreteAccessoryType, IfcFastenerType, IfcMechanicalFastenerType, IfcReinforcingElementType, IfcVibrationIsolatorType))
 SUBTYPE OF (IfcElementType);
END_ENTITY;

ENTITY IfcElementQuantity
 SUBTYPE OF (
IfcQuantitySet);
  MethodOfMeasurement : OPTIONAL IfcLabel;
  Quantities : SET [1:?] OF IfcPhysicalQuantity;
 WHERE
  UniqueQuantityNames : IfcUniqueQuantityNames(Quantities);
END_ENTITY;

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

ENTITY IfcElementarySurface
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcCylindricalSurface, IfcPlane))
 SUBTYPE OF (IfcSurface);
  Position : IfcAxis2Placement3D;
END_ENTITY;

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

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

ENTITY IfcEnergyConversionDevice
 SUPERTYPE OF(ONEOF(
IfcAirToAirHeatRecovery, IfcBoiler, IfcBurner, IfcChiller, IfcCoil, IfcCondenser, IfcCooledBeam, IfcCoolingTower, IfcElectricGenerator, IfcElectricMotor, IfcEngine, IfcEvaporativeCooler, IfcEvaporator, IfcHeatExchanger, IfcHumidifier, IfcMotorConnection, IfcSolarDevice, IfcTransformer, IfcTubeBundle, IfcUnitaryEquipment))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcEngine
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcEngineTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcEngineTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEngineTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCENGINETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcEngineType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcEngineTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcEngineTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEngineTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcEvaporativeCooler
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcEvaporativeCoolerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcEvaporativeCoolerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEvaporativeCoolerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCEVAPORATIVECOOLERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcEvaporator
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcEvaporatorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcEvaporatorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEvaporatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCEVAPORATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcEvent
 SUBTYPE OF (
IfcProcess);
  PredefinedType : OPTIONAL IfcEventTypeEnum;
  EventTriggerType : OPTIONAL IfcEventTriggerTypeEnum;
  UserDefinedEventTriggerType : OPTIONAL IfcLabel;
  EventOccurenceTime : OPTIONAL IfcEventTime;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcEventTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEventTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : NOT(EXISTS(EventTriggerType)) OR (EventTriggerType <> IfcEventTriggerTypeEnum.USERDEFINED) OR ((EventTriggerType = IfcEventTriggerTypeEnum.USERDEFINED) AND EXISTS(UserDefinedEventTriggerType));
END_ENTITY;

ENTITY IfcEventTime
 SUBTYPE OF (
IfcSchedulingTime);
  ActualDate : OPTIONAL IfcDateTime;
  EarlyDate : OPTIONAL IfcDateTime;
  LateDate : OPTIONAL IfcDateTime;
  ScheduleDate : OPTIONAL IfcDateTime;
END_ENTITY;

ENTITY IfcEventType
 SUBTYPE OF (
IfcTypeProcess);
  PredefinedType : IfcEventTypeEnum;
  EventTriggerType : IfcEventTriggerTypeEnum;
  UserDefinedEventTriggerType : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcEventTypeEnum.USERDEFINED) OR ((PredefinedType = IfcEventTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType)) ;
  CorrectEventTriggerType : (EventTriggerType <> IfcEventTriggerTypeEnum.USERDEFINED) OR ((EventTriggerType = IfcEventTriggerTypeEnum.USERDEFINED) AND EXISTS(UserDefinedEventTriggerType)) ;
END_ENTITY;

ENTITY IfcExtendedProperties
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcMaterialProperties, IfcProfileProperties))
 SUBTYPE OF (IfcPropertyAbstraction);
  Name : OPTIONAL IfcIdentifier;
  Description : OPTIONAL IfcText;
  Properties : SET [1:?] OF IfcProperty;
END_ENTITY;

ENTITY IfcExternalInformation
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcClassification, IfcDocumentInformation, IfcLibraryInformation));
END_ENTITY;

ENTITY IfcExternalReference
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcClassificationReference, IfcDocumentReference, IfcExternallyDefinedHatchStyle, IfcExternallyDefinedSurfaceStyle, IfcExternallyDefinedTextFont, IfcLibraryReference));
  Location : OPTIONAL IfcURIReference;
  Identification : OPTIONAL IfcIdentifier;
  Name : OPTIONAL IfcLabel;
 INVERSE
  ExternalReferenceForResources : SET [0:?] OF IfcExternalReferenceRelationship FOR RelatingReference;
 WHERE
  WR1 : EXISTS(Identification) OR EXISTS(Location) OR EXISTS(Name);
END_ENTITY;

ENTITY IfcExternalReferenceRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingReference : IfcExternalReference;
  RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
END_ENTITY;

ENTITY IfcExternalSpatialElement
 SUBTYPE OF (
IfcExternalSpatialStructureElement);
  PredefinedType : OPTIONAL IfcExternalSpatialElementTypeEnum;
 INVERSE
  BoundedBy : SET OF IfcRelSpaceBoundary FOR RelatingSpace;
END_ENTITY;

ENTITY IfcExternalSpatialStructureElement
 ABSTRACT SUPERTYPE OF(
IfcExternalSpatialElement)
 SUBTYPE OF (IfcSpatialElement);
END_ENTITY;

ENTITY IfcExternallyDefinedHatchStyle
 SUBTYPE OF (
IfcExternalReference);
END_ENTITY;

ENTITY IfcExternallyDefinedSurfaceStyle
 SUBTYPE OF (
IfcExternalReference);
END_ENTITY;

ENTITY IfcExternallyDefinedTextFont
 SUBTYPE OF (
IfcExternalReference);
END_ENTITY;

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

ENTITY IfcExtrudedAreaSolidTapered
 SUBTYPE OF (
IfcExtrudedAreaSolid);
  EndSweptArea : IfcProfileDef;
 WHERE
  CorrectProfileAssignment : IfcTaperedSweptAreaProfiles(SELF\IfcSweptAreaSolid.SweptArea, SELF.EndSweptArea);
END_ENTITY;

ENTITY IfcFace
 SUPERTYPE OF(
IfcFaceSurface)
 SUBTYPE OF (IfcTopologicalRepresentationItem);
  Bounds : SET [1:?] OF IfcFaceBound;
 INVERSE
  HasTextureMaps : SET [0:?] OF IfcTextureMap FOR MappedTo;
 WHERE
  HasOuterBound : SIZEOF(QUERY(temp <* Bounds | 'IFCTOPOLOGYRESOURCE.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(
IfcFaceOuterBound)
 SUBTYPE OF (IfcTopologicalRepresentationItem);
  Bound : IfcLoop;
  Orientation : IfcBoolean;
END_ENTITY;

ENTITY IfcFaceOuterBound
 SUBTYPE OF (
IfcFaceBound);
END_ENTITY;

ENTITY IfcFaceSurface
 SUPERTYPE OF(
IfcAdvancedFace)
 SUBTYPE OF (IfcFace);
  FaceSurface : IfcSurface;
  SameSense : IfcBoolean;
END_ENTITY;

ENTITY IfcFacetedBrep
 SUPERTYPE OF(
IfcFacetedBrepWithVoids)
 SUBTYPE OF (IfcManifoldSolidBrep);
END_ENTITY;

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

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

ENTITY IfcFan
 SUBTYPE OF (
IfcFlowMovingDevice);
  PredefinedType : OPTIONAL IfcFanTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFanTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFanTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCFANTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcFastener
 SUBTYPE OF (
IfcElementComponent);
  PredefinedType : OPTIONAL IfcFastenerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFastenerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFastenerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDCOMPONENTELEMENTS.IFCFASTENERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcFastenerType
 SUBTYPE OF (
IfcElementComponentType);
  PredefinedType : IfcFastenerTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcFastenerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFastenerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcFeatureElementSubtraction
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcOpeningElement, IfcVoidingFeature))
 SUBTYPE OF (IfcFeatureElement);
 INVERSE
  VoidsElements : IfcRelVoidsElement FOR RelatedOpeningElement;
 WHERE
  HasNoSubtraction : SIZEOF(SELF\IfcElement.HasOpenings) = 0;
  IsNotFilling : SIZEOF(SELF\IfcElement.FillsVoids) = 0;
END_ENTITY;

ENTITY IfcFillAreaStyle
 SUBTYPE OF (
IfcPresentationStyle);
  FillStyles : SET [1:?] OF IfcFillStyleSelect;
  ModelorDraughting : OPTIONAL IfcBoolean;
 WHERE
  MaxOneColour : SIZEOF(QUERY(Style <* SELF.FillStyles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCCOLOUR' IN TYPEOF(Style) )) <= 1;
  MaxOneExtHatchStyle : SIZEOF(QUERY(Style <* SELF.FillStyles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN TYPEOF(Style) )) <= 1;
  ConsistentHatchStyleDef : IfcCorrectFillAreaStyle(SELF.FillStyles);
END_ENTITY;

ENTITY IfcFillAreaStyleHatching
 SUBTYPE OF (
IfcGeometricRepresentationItem);
  HatchLineAppearance : IfcCurveStyle;
  StartOfNextHatchLine : IfcHatchLineDistanceSelect;
  PointOfReferenceHatchLine : OPTIONAL IfcCartesianPoint;
  PatternStart : OPTIONAL IfcCartesianPoint;
  HatchLineAngle : IfcPlaneAngleMeasure;
 WHERE
  PatternStart2D : NOT(EXISTS(PatternStart)) OR (PatternStart.Dim = 2) ;
  RefHatchLine2D : NOT(EXISTS(PointOfReferenceHatchLine)) OR (PointOfReferenceHatchLine.Dim = 2);
END_ENTITY;

ENTITY IfcFillAreaStyleTiles
 SUBTYPE OF (
IfcGeometricRepresentationItem);
  TilingPattern : LIST [2:2] OF IfcVector;
  Tiles : SET [1:?] OF IfcStyledItem;
  TilingScale : IfcPositiveRatioMeasure;
END_ENTITY;

ENTITY IfcFilter
 SUBTYPE OF (
IfcFlowTreatmentDevice);
  PredefinedType : OPTIONAL IfcFilterTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFilterTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFilterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCFILTERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcFireSuppressionTerminal
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcFireSuppressionTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFireSuppressionTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFireSuppressionTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPLUMBINGFIREPROTECTIONDOMAIN.IFCFIRESUPPRESSIONTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcFireSuppressionTerminalType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcFireSuppressionTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcFireSuppressionTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFireSuppressionTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFixedReferenceSweptAreaSolid
 SUBTYPE OF (
IfcSweptAreaSolid);
  Directrix : IfcCurve;
  StartParam : OPTIONAL IfcParameterValue;
  EndParam : OPTIONAL IfcParameterValue;
  FixedReference : IfcDirection;
 WHERE
  DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR (SIZEOF(['IFCGEOMETRYRESOURCE.IFCCONIC', 'IFCGEOMETRYRESOURCE.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
END_ENTITY;

ENTITY IfcFlowController
 SUPERTYPE OF(ONEOF(
IfcAirTerminalBox, IfcDamper, IfcElectricDistributionBoard, IfcElectricTimeControl, IfcFlowMeter, IfcProtectiveDevice, IfcSwitchingDevice, IfcValve))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFlowFitting
 SUPERTYPE OF(ONEOF(
IfcCableCarrierFitting, IfcCableFitting, IfcDuctFitting, IfcJunctionBox, IfcPipeFitting))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFlowInstrument
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcFlowInstrumentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFlowInstrumentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFlowInstrumentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCFLOWINSTRUMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcFlowInstrumentType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcFlowInstrumentTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcFlowInstrumentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFlowInstrumentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFlowMeter
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcFlowMeterTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFlowMeterTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFlowMeterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCFLOWMETERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcFlowMovingDevice
 SUPERTYPE OF(ONEOF(
IfcCompressor, IfcFan, IfcPump))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFlowSegment
 SUPERTYPE OF(ONEOF(
IfcCableCarrierSegment, IfcCableSegment, IfcDuctSegment, IfcPipeSegment))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFlowStorageDevice
 SUPERTYPE OF(ONEOF(
IfcElectricFlowStorageDevice, IfcTank))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFlowTerminal
 SUPERTYPE OF(ONEOF(
IfcAirTerminal, IfcAudioVisualAppliance, IfcCommunicationsAppliance, IfcElectricAppliance, IfcFireSuppressionTerminal, IfcLamp, IfcLightFixture, IfcMedicalDevice, IfcOutlet, IfcSanitaryTerminal, IfcSpaceHeater, IfcStackTerminal, IfcWasteTerminal))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

ENTITY IfcFlowTerminalType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcAirTerminalType, IfcAudioVisualApplianceType, IfcCommunicationsApplianceType, IfcElectricApplianceType, IfcFireSuppressionTerminalType, IfcLampType, IfcLightFixtureType, IfcMedicalDeviceType, IfcOutletType, IfcSanitaryTerminalType, IfcSpaceHeaterType, IfcStackTerminalType, IfcWasteTerminalType))
 SUBTYPE OF (IfcDistributionFlowElementType);
END_ENTITY;

ENTITY IfcFlowTreatmentDevice
 SUPERTYPE OF(ONEOF(
IfcDuctSilencer, IfcFilter, IfcInterceptor))
 SUBTYPE OF (IfcDistributionFlowElement);
END_ENTITY;

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

ENTITY IfcFooting
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcFootingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCFOOTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType)) ;
END_ENTITY;

ENTITY IfcFootingType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcFootingTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcFootingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFootingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcFurnishingElement
 SUPERTYPE OF(ONEOF(
IfcFurniture, IfcSystemFurnitureElement))
 SUBTYPE OF (IfcElement);
END_ENTITY;

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

ENTITY IfcFurniture
 SUBTYPE OF (
IfcFurnishingElement);
  PredefinedType : OPTIONAL IfcFurnitureTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcFurnitureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFurnitureTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDFACILITIESELEMENTS.IFCFURNITURETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcFurnitureType
 SUBTYPE OF (
IfcFurnishingElementType);
  AssemblyPlace : IfcAssemblyPlaceEnum;
  PredefinedType : OPTIONAL IfcFurnitureTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcFurnitureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcFurnitureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcGeographicElement
 SUBTYPE OF (
IfcElement);
  PredefinedType : OPTIONAL IfcGeographicElementTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcGeographicElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcGeographicElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPRODUCTEXTENSION.IFCGEOGRAPHICELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcGeographicElementType
 SUBTYPE OF (
IfcElementType);
  PredefinedType : IfcGeographicElementTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcGeographicElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcGeographicElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcGeometricRepresentationContext
 SUPERTYPE OF(
IfcGeometricRepresentationSubContext)
 SUBTYPE OF (IfcRepresentationContext);
  CoordinateSpaceDimension : IfcDimensionCount;
  Precision : OPTIONAL IfcReal;
  WorldCoordinateSystem : IfcAxis2Placement;
  TrueNorth : OPTIONAL IfcDirection;
 INVERSE
  HasSubContexts : SET OF IfcGeometricRepresentationSubContext FOR ParentContext;
  HasCoordinateOperation : SET [0:1] OF IfcCoordinateOperation FOR SourceCRS;
 WHERE
  North2D : NOT(EXISTS(TrueNorth)) OR (HIINDEX(TrueNorth.DirectionRatios) = 2);
END_ENTITY;

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

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

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

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

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

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

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

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

ENTITY IfcHeatExchanger
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcHeatExchangerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcHeatExchangerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcHeatExchangerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCHEATEXCHANGERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcHumidifier
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcHumidifierTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcHumidifierTypeEnum.USERDEFINED) OR ((PredefinedType = IfcHumidifierTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCHUMIDIFIERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcIShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  OverallWidth : IfcPositiveLengthMeasure;
  OverallDepth : IfcPositiveLengthMeasure;
  WebThickness : IfcPositiveLengthMeasure;
  FlangeThickness : IfcPositiveLengthMeasure;
  FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  FlangeEdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
 WHERE
  ValidFlangeThickness : (2. * FlangeThickness) < OverallDepth;
  ValidWebThickness : WebThickness < OverallWidth;
  ValidFilletRadius : NOT(EXISTS(FilletRadius)) OR ((FilletRadius <= (OverallWidth - WebThickness)/2.) AND (FilletRadius <= (OverallDepth - (2. * FlangeThickness))/2.));
END_ENTITY;

ENTITY IfcImageTexture
 SUBTYPE OF (
IfcSurfaceTexture);
  URLReference : IfcURIReference;
END_ENTITY;

ENTITY IfcIndexedColourMap
 SUBTYPE OF (
IfcPresentationItem);
  MappedTo : IfcTessellatedFaceSet;
  Opacity : OPTIONAL IfcNormalisedRatioMeasure;
  Colours : IfcColourRgbList;
  ColourIndex : LIST [1:?] OF IfcPositiveInteger;
END_ENTITY;

ENTITY IfcIndexedPolyCurve
 SUBTYPE OF (
IfcBoundedCurve);
  Points : IfcCartesianPointList;
  Segments : OPTIONAL LIST [1:?] OF IfcSegmentIndexSelect;
  SelfIntersect : OPTIONAL IfcBoolean;
 WHERE
  Consecutive : (SIZEOF(Segments) = 0) OR IfcConsecutiveSegments(Segments);
END_ENTITY;

ENTITY IfcIndexedTextureMap
 ABSTRACT SUPERTYPE OF(
IfcIndexedTriangleTextureMap)
 SUBTYPE OF (IfcTextureCoordinate);
  MappedTo : IfcTessellatedFaceSet;
  TexCoords : IfcTextureVertexList;
END_ENTITY;

ENTITY IfcIndexedTriangleTextureMap
 SUBTYPE OF (
IfcIndexedTextureMap);
  TexCoordIndex : OPTIONAL LIST [1:?] OF LIST [3:3] OF IfcPositiveInteger;
END_ENTITY;

ENTITY IfcInterceptor
 SUBTYPE OF (
IfcFlowTreatmentDevice);
  PredefinedType : OPTIONAL IfcInterceptorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcInterceptorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcInterceptorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPLUMBINGFIREPROTECTIONDOMAIN.IFCINTERCEPTORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcInterceptorType
 SUBTYPE OF (
IfcFlowTreatmentDeviceType);
  PredefinedType : IfcInterceptorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcInterceptorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcInterceptorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcInventory
 SUBTYPE OF (
IfcGroup);
  PredefinedType : OPTIONAL IfcInventoryTypeEnum;
  Jurisdiction : OPTIONAL IfcActorSelect;
  ResponsiblePersons : OPTIONAL SET [1:?] OF IfcPerson;
  LastUpdateDate : OPTIONAL IfcDate;
  CurrentValue : OPTIONAL IfcCostValue;
  OriginalValue : OPTIONAL IfcCostValue;
END_ENTITY;

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

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

ENTITY IfcJunctionBox
 SUBTYPE OF (
IfcFlowFitting);
  PredefinedType : OPTIONAL IfcJunctionBoxTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcJunctionBoxTypeEnum.USERDEFINED) OR ((PredefinedType = IfcJunctionBoxTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCJUNCTIONBOXTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcJunctionBoxType
 SUBTYPE OF (
IfcFlowFittingType);
  PredefinedType : IfcJunctionBoxTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcJunctionBoxTypeEnum.USERDEFINED) OR ((PredefinedType = IfcJunctionBoxTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcLShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  Depth : IfcPositiveLengthMeasure;
  Width : OPTIONAL IfcPositiveLengthMeasure;
  Thickness : IfcPositiveLengthMeasure;
  FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  LegSlope : OPTIONAL IfcPlaneAngleMeasure;
 WHERE
  ValidThickness : (Thickness < Depth) AND (NOT(EXISTS(Width)) OR (Thickness < Width));
END_ENTITY;

ENTITY IfcLaborResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcLaborResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcLaborResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLaborResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcLaborResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcLaborResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcLaborResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLaborResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

ENTITY IfcLagTime
 SUBTYPE OF (
IfcSchedulingTime);
  LagValue : IfcTimeOrRatioSelect;
  DurationType : IfcTaskDurationEnum;
END_ENTITY;

ENTITY IfcLamp
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcLampTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcLampTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLampTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCLAMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcLampType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcLampTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcLampTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLampTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcLibraryInformation
 SUBTYPE OF (
IfcExternalInformation);
  Name : IfcLabel;
  Version : OPTIONAL IfcLabel;
  Publisher : OPTIONAL IfcActorSelect;
  VersionDate : OPTIONAL IfcDateTime;
  Location : OPTIONAL IfcURIReference;
  Description : OPTIONAL IfcText;
 INVERSE
  LibraryInfoForObjects : SET [0:?] OF IfcRelAssociatesLibrary FOR RelatingLibrary;
  HasLibraryReferences : SET OF IfcLibraryReference FOR ReferencedLibrary;
END_ENTITY;

ENTITY IfcLibraryReference
 SUBTYPE OF (
IfcExternalReference);
  Description : OPTIONAL IfcText;
  Language : OPTIONAL IfcLanguageId;
  ReferencedLibrary : OPTIONAL IfcLibraryInformation;
 INVERSE
  LibraryRefForObjects : SET [0:?] OF IfcRelAssociatesLibrary FOR RelatingLibrary;
END_ENTITY;

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

ENTITY IfcLightFixture
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcLightFixtureTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcLightFixtureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLightFixtureTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCLIGHTFIXTURETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcLightFixtureType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcLightFixtureTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcLightFixtureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcLightFixtureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcLightSourceAmbient
 SUBTYPE OF (
IfcLightSource);
END_ENTITY;

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

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

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

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

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

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

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

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

ENTITY IfcMapConversion
 SUBTYPE OF (
IfcCoordinateOperation);
  Eastings : IfcLengthMeasure;
  Northings : IfcLengthMeasure;
  OrthogonalHeight : IfcLengthMeasure;
  XAxisAbscissa : OPTIONAL IfcReal;
  XAxisOrdinate : OPTIONAL IfcReal;
  Scale : OPTIONAL IfcReal;
END_ENTITY;

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

ENTITY IfcMaterial
 SUBTYPE OF (
IfcMaterialDefinition);
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  Category : OPTIONAL IfcLabel;
 INVERSE
  HasRepresentation : SET [0:1] OF IfcMaterialDefinitionRepresentation FOR RepresentedMaterial;
  IsRelatedWith : SET OF IfcMaterialRelationship FOR RelatedMaterials;
  RelatesTo : SET [0:1] OF IfcMaterialRelationship FOR RelatingMaterial;
END_ENTITY;

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

ENTITY IfcMaterialConstituent
 SUBTYPE OF (
IfcMaterialDefinition);
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  Material : IfcMaterial;
  Fraction : OPTIONAL IfcNormalisedRatioMeasure;
  Category : OPTIONAL IfcLabel;
 INVERSE
  ToMaterialConstituentSet : IfcMaterialConstituentSet FOR MaterialConstituents;
END_ENTITY;

ENTITY IfcMaterialConstituentSet
 SUBTYPE OF (
IfcMaterialDefinition);
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  MaterialConstituents : OPTIONAL SET [1:?] OF IfcMaterialConstituent;
END_ENTITY;

ENTITY IfcMaterialDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcMaterial, IfcMaterialConstituent, IfcMaterialConstituentSet, IfcMaterialLayer, IfcMaterialLayerSet, IfcMaterialProfile, IfcMaterialProfileSet));
 INVERSE
  AssociatedTo : SET [0:?] OF IfcRelAssociatesMaterial FOR RelatingMaterial;
  HasExternalReferences : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
  HasProperties : SET OF IfcMaterialProperties FOR Material;
END_ENTITY;

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

ENTITY IfcMaterialLayer
 SUPERTYPE OF(
IfcMaterialLayerWithOffsets)
 SUBTYPE OF (IfcMaterialDefinition);
  Material : OPTIONAL IfcMaterial;
  LayerThickness : IfcNonNegativeLengthMeasure;
  IsVentilated : OPTIONAL IfcLogical;
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  Category : OPTIONAL IfcLabel;
  Priority : OPTIONAL IfcInteger;
 INVERSE
  ToMaterialLayerSet : IfcMaterialLayerSet FOR MaterialLayers;
 WHERE
  NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
END_ENTITY;

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

ENTITY IfcMaterialLayerSetUsage
 SUBTYPE OF (
IfcMaterialUsageDefinition);
  ForLayerSet : IfcMaterialLayerSet;
  LayerSetDirection : IfcLayerSetDirectionEnum;
  DirectionSense : IfcDirectionSenseEnum;
  OffsetFromReferenceLine : IfcLengthMeasure;
  ReferenceExtent : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcMaterialLayerWithOffsets
 SUBTYPE OF (
IfcMaterialLayer);
  OffsetDirection : IfcLayerSetDirectionEnum;
  OffsetValues : ARRAY [1:2] OF IfcLengthMeasure;
END_ENTITY;

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

ENTITY IfcMaterialProfile
 SUPERTYPE OF(
IfcMaterialProfileWithOffsets)
 SUBTYPE OF (IfcMaterialDefinition);
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  Material : OPTIONAL IfcMaterial;
  Profile : IfcProfileDef;
  Priority : OPTIONAL IfcInteger;
  Category : OPTIONAL IfcLabel;
 INVERSE
  ToMaterialProfileSet : IfcMaterialProfileSet FOR MaterialProfiles;
 WHERE
  NormalizedPriority : NOT(EXISTS(Priority)) OR {0 <= Priority <= 100};
END_ENTITY;

ENTITY IfcMaterialProfileSet
 SUBTYPE OF (
IfcMaterialDefinition);
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  MaterialProfiles : LIST [1:?] OF IfcMaterialProfile;
  CompositeProfile : OPTIONAL IfcCompositeProfileDef;
END_ENTITY;

ENTITY IfcMaterialProfileSetUsage
 SUPERTYPE OF(
IfcMaterialProfileSetUsageTapering)
 SUBTYPE OF (IfcMaterialUsageDefinition);
  ForProfileSet : IfcMaterialProfileSet;
  CardinalPoint : OPTIONAL IfcCardinalPointReference;
  ReferenceExtent : OPTIONAL IfcPositiveLengthMeasure;
END_ENTITY;

ENTITY IfcMaterialProfileSetUsageTapering
 SUBTYPE OF (
IfcMaterialProfileSetUsage);
  ForProfileEndSet : IfcMaterialProfileSet;
  CardinalEndPoint : OPTIONAL IfcCardinalPointReference;
END_ENTITY;

ENTITY IfcMaterialProfileWithOffsets
 SUBTYPE OF (
IfcMaterialProfile);
  OffsetValues : ARRAY [1:2] OF IfcLengthMeasure;
END_ENTITY;

ENTITY IfcMaterialProperties
 SUBTYPE OF (
IfcExtendedProperties);
  Material : IfcMaterialDefinition;
END_ENTITY;

ENTITY IfcMaterialRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingMaterial : IfcMaterial;
  RelatedMaterials : SET [1:?] OF IfcMaterial;
  Expression : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcMaterialUsageDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcMaterialLayerSetUsage, IfcMaterialProfileSetUsage));
 INVERSE
  AssociatedTo : SET [1:?] OF IfcRelAssociatesMaterial FOR RelatingMaterial;
END_ENTITY;

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

ENTITY IfcMechanicalFastener
 SUBTYPE OF (
IfcElementComponent);
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  NominalLength : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcMechanicalFastenerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcMechanicalFastenerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMechanicalFastenerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDCOMPONENTELEMENTS.IFCMECHANICALFASTENERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcMechanicalFastenerType
 SUBTYPE OF (
IfcElementComponentType);
  PredefinedType : IfcMechanicalFastenerTypeEnum;
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  NominalLength : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcMechanicalFastenerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMechanicalFastenerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcMedicalDevice
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcMedicalDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcMedicalDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMedicalDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCMEDICALDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcMedicalDeviceType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcMedicalDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcMedicalDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMedicalDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcMember
 SUPERTYPE OF(
IfcMemberStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcMemberTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcMemberTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMemberTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCMEMBERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcMemberStandardCase
 SUBTYPE OF (
IfcMember);
 WHERE
  HasMaterialProfileSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALPROFILESETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcMemberType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcMemberTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcMemberTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMemberTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcMirroredProfileDef
 SUBTYPE OF (
IfcDerivedProfileDef);
 DERIVE
  SELF\IfcDerivedProfileDef.Operator : IfcCartesianTransformationOperator2D := IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcCartesianTransformationOperator( -- Axis1 IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcDirection([-1., 0.]), -- Axis2 IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcDirection([ 0., 1.]), -- LocalOrigin IfcRepresentationItem() || IfcGeometricRepresentationItem() || IfcPoint() || IfcCartesianPoint([0., 0.]), -- Scale 1.) || IfcCartesianTransformationOperator2D();
END_ENTITY;

ENTITY IfcMonetaryUnit;
  Currency :
IfcLabel;
END_ENTITY;

ENTITY IfcMotorConnection
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcMotorConnectionTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcMotorConnectionTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMotorConnectionTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCMOTORCONNECTIONTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcMotorConnectionType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcMotorConnectionTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcMotorConnectionTypeEnum.USERDEFINED) OR ((PredefinedType = IfcMotorConnectionTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcObject
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcActor, IfcControl, IfcGroup, IfcProcess, IfcProduct, IfcResource))
 SUBTYPE OF (IfcObjectDefinition);
  ObjectType : OPTIONAL IfcLabel;
 INVERSE
  IsDeclaredBy : SET [0:1] OF IfcRelDefinesByObject FOR RelatedObjects;
  Declares : SET OF IfcRelDefinesByObject FOR RelatingObject;
  IsTypedBy : SET [0:1] OF IfcRelDefinesByType FOR RelatedObjects;
  IsDefinedBy : SET OF IfcRelDefinesByProperties FOR RelatedObjects;
 WHERE
  UniquePropertySetNames : ((SIZEOF(IsDefinedBy) = 0) OR IfcUniqueDefinitionNames(IsDefinedBy));
END_ENTITY;

ENTITY IfcObjectDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcContext, IfcObject, IfcTypeObject))
 SUBTYPE OF (IfcRoot);
 INVERSE
  HasAssignments : SET OF IfcRelAssigns FOR RelatedObjects;
  Nests : SET [0:1] OF IfcRelNests FOR RelatedObjects;
  IsNestedBy : SET OF IfcRelNests FOR RelatingObject;
  HasContext : SET [0:1] OF IfcRelDeclares FOR RelatedDefinitions;
  IsDecomposedBy : SET OF IfcRelAggregates FOR RelatingObject;
  Decomposes : SET [0:1] OF IfcRelAggregates FOR RelatedObjects;
  HasAssociations : SET OF IfcRelAssociates FOR RelatedObjects;
END_ENTITY;

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

ENTITY IfcObjective
 SUBTYPE OF (
IfcConstraint);
  BenchmarkValues : OPTIONAL LIST [1:?] OF IfcConstraint;
  LogicalAggregator : OPTIONAL IfcLogicalOperatorEnum;
  ObjectiveQualifier : IfcObjectiveEnum;
  UserDefinedQualifier : OPTIONAL IfcLabel;
 WHERE
  WR21 : (ObjectiveQualifier <> IfcObjectiveEnum.USERDEFINED) OR ((ObjectiveQualifier = IfcObjectiveEnum.USERDEFINED) AND EXISTS(SELF\IfcObjective.UserDefinedQualifier));
END_ENTITY;

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

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

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

ENTITY IfcOpenShell
 SUBTYPE OF (
IfcConnectedFaceSet);
END_ENTITY;

ENTITY IfcOpeningElement
 SUPERTYPE OF(
IfcOpeningStandardCase)
 SUBTYPE OF (IfcFeatureElementSubtraction);
  PredefinedType : OPTIONAL IfcOpeningElementTypeEnum;
 INVERSE
  HasFillings : SET OF IfcRelFillsElement FOR RelatingOpeningElement;
END_ENTITY;

ENTITY IfcOpeningStandardCase
 SUBTYPE OF (
IfcOpeningElement);
END_ENTITY;

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

ENTITY IfcOrganizationRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingOrganization : IfcOrganization;
  RelatedOrganizations : SET [1:?] OF IfcOrganization;
END_ENTITY;

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

ENTITY IfcOuterBoundaryCurve
 SUBTYPE OF (
IfcBoundaryCurve);
END_ENTITY;

ENTITY IfcOutlet
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcOutletTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcOutletTypeEnum.USERDEFINED) OR ((PredefinedType = IfcOutletTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCOUTLETTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcOutletType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcOutletTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcOutletTypeEnum.USERDEFINED) OR ((PredefinedType = IfcOutletTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcOwnerHistory;
  OwningUser :
IfcPersonAndOrganization;
  OwningApplication : IfcApplication;
  State : OPTIONAL IfcStateEnum;
  ChangeAction : OPTIONAL IfcChangeActionEnum;
  LastModifiedDate : OPTIONAL IfcTimeStamp;
  LastModifyingUser : OPTIONAL IfcPersonAndOrganization;
  LastModifyingApplication : OPTIONAL IfcApplication;
  CreationDate : IfcTimeStamp;
 WHERE
  CorrectChangeAction : (EXISTS(LastModifiedDate)) OR (NOT(EXISTS(LastModifiedDate)) AND NOT(EXISTS(ChangeAction))) OR (NOT(EXISTS(LastModifiedDate)) AND EXISTS(ChangeAction) AND ((ChangeAction = IfcChangeActionEnum.NOTDEFINED) OR (ChangeAction = IfcChangeActionEnum.NOCHANGE)));
END_ENTITY;

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

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

ENTITY IfcPcurve
 SUBTYPE OF (
IfcCurve);
  BasisSurface : IfcSurface;
  ReferenceCurve : IfcCurve;
 WHERE
  DimIs2D : ReferenceCurve.Dim = 2;
END_ENTITY;

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

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

ENTITY IfcPermit
 SUBTYPE OF (
IfcControl);
  PredefinedType : OPTIONAL IfcPermitTypeEnum;
  Status : OPTIONAL IfcLabel;
  LongDescription : OPTIONAL IfcText;
END_ENTITY;

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

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

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

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

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

ENTITY IfcPile
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcPileTypeEnum;
  ConstructionType : OPTIONAL IfcPileConstructionEnum;
 WHERE
  CorrectPredefinedType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCPILETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcPileType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcPileTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcPileTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPileTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcPipeFitting
 SUBTYPE OF (
IfcFlowFitting);
  PredefinedType : OPTIONAL IfcPipeFittingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcPipeFittingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPipeFittingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCPIPEFITTINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcPipeSegment
 SUBTYPE OF (
IfcFlowSegment);
  PredefinedType : OPTIONAL IfcPipeSegmentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcPipeSegmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPipeSegmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCPIPESEGMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcPixelTexture
 SUBTYPE OF (
IfcSurfaceTexture);
  Width : IfcInteger;
  Height : IfcInteger;
  ColourComponents : IfcInteger;
  Pixel : LIST [1:?] OF IfcBinary;
 WHERE
  MinPixelInS : Width >= 1;
  MinPixelInT : Height >= 1;
  NumberOfColours : {1 <= ColourComponents <= 4};
  SizeOfPixelList : SIZEOF(Pixel) = (Width * Height);
  PixelAsByteAndSameLength : SIZEOF(QUERY(temp<* Pixel | (BLENGTH(temp) MOD 8 = 0) AND (BLENGTH(temp) = BLENGTH(Pixel[1])) )) = SIZEOF(Pixel);
END_ENTITY;

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

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

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

ENTITY IfcPlane
 SUBTYPE OF (
IfcElementarySurface);
END_ENTITY;

ENTITY IfcPlate
 SUPERTYPE OF(
IfcPlateStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcPlateTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcPlateTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPlateTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCPLATETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcPlateStandardCase
 SUBTYPE OF (
IfcPlate);
 WHERE
  HasMaterialLayerSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcPlateType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcPlateTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcPlateTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPlateTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

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

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

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

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

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

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

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

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

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

ENTITY IfcPreDefinedProperties
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcReinforcementBarProperties, IfcSectionProperties, IfcSectionReinforcementProperties))
 SUBTYPE OF (IfcPropertyAbstraction);
END_ENTITY;

ENTITY IfcPreDefinedPropertySet
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcDoorLiningProperties, IfcDoorPanelProperties, IfcPermeableCoveringProperties, IfcReinforcementDefinitionProperties, IfcWindowLiningProperties, IfcWindowPanelProperties))
 SUBTYPE OF (IfcPropertySetDefinition);
END_ENTITY;

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

ENTITY IfcPresentationItem
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcColourRgbList, IfcColourSpecification, IfcCurveStyleFont, IfcCurveStyleFontAndScaling, IfcCurveStyleFontPattern, IfcIndexedColourMap, IfcPreDefinedItem, IfcSurfaceStyleLighting, IfcSurfaceStyleRefraction, IfcSurfaceStyleShading, IfcSurfaceStyleWithTextures, IfcSurfaceTexture, IfcTextStyleForDefinedFont, IfcTextStyleTextModel, IfcTextureCoordinate, IfcTextureVertex, IfcTextureVertexList));
END_ENTITY;

ENTITY IfcPresentationLayerAssignment
 SUPERTYPE OF(
IfcPresentationLayerWithStyle);
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  AssignedItems : SET [1:?] OF IfcLayeredItem;
  Identifier : OPTIONAL IfcIdentifier;
 WHERE
  ApplicableItems : SIZEOF(QUERY(temp <* AssignedItems | ( SIZEOF(TYPEOF(temp) * [ 'IFCREPRESENTATIONRESOURCE.IFCSHAPEREPRESENTATION', 'IFCGEOMETRYRESOURCE.IFCGEOMETRICREPRESENTATIONITEM', 'IFCGEOMETRYRESOURCE.IFCMAPPEDITEM']) = 1) )) = SIZEOF(AssignedItems);
END_ENTITY;

ENTITY IfcPresentationLayerWithStyle
 SUBTYPE OF (
IfcPresentationLayerAssignment);
  LayerOn : IfcLogical;
  LayerFrozen : IfcLogical;
  LayerBlocked : IfcLogical;
  LayerStyles : SET OF IfcPresentationStyle;
 WHERE
  ApplicableOnlyToItems : SIZEOF(QUERY(temp <* AssignedItems | ( SIZEOF(TYPEOF(temp) * [ 'IFCGEOMETRYRESOURCE.IFCGEOMETRICREPRESENTATIONITEM', 'IFCGEOMETRYRESOURCE.IFCMAPPEDITEM']) = 1) )) = SIZEOF(AssignedItems);
END_ENTITY;

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

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

ENTITY IfcProcedure
 SUBTYPE OF (
IfcProcess);
  PredefinedType : OPTIONAL IfcProcedureTypeEnum;
 WHERE
  HasName : EXISTS(SELF\IfcRoot.Name);
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcProcedureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcProcedureType
 SUBTYPE OF (
IfcTypeProcess);
  PredefinedType : IfcProcedureTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcProcedureTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProcedureTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType));
END_ENTITY;

ENTITY IfcProcess
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcEvent, IfcProcedure, IfcTask))
 SUBTYPE OF (IfcObject);
  Identification : OPTIONAL IfcIdentifier;
  LongDescription : OPTIONAL IfcText;
 INVERSE
  IsPredecessorTo : SET OF IfcRelSequence FOR RelatingProcess;
  IsSuccessorFrom : SET OF IfcRelSequence FOR RelatedProcess;
  OperatesOn : SET OF IfcRelAssignsToProcess FOR RelatingProcess;
END_ENTITY;

ENTITY IfcProduct
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcAnnotation, IfcElement, IfcGrid, IfcPort, IfcProxy, IfcSpatialElement, IfcStructuralActivity, IfcStructuralItem))
 SUBTYPE OF (IfcObject);
  ObjectPlacement : OPTIONAL IfcObjectPlacement;
  Representation : OPTIONAL IfcProductRepresentation;
 INVERSE
  ReferencedBy : SET OF IfcRelAssignsToProduct FOR RelatingProduct;
 WHERE
  PlacementForShapeRepresentation : (EXISTS(Representation) AND EXISTS(ObjectPlacement)) OR (EXISTS(Representation) AND (SIZEOF(QUERY(temp <* Representation.Representations | 'IFCREPRESENTATIONRESOURCE.IFCSHAPEREPRESENTATION' IN TYPEOF(temp))) = 0)) OR (NOT(EXISTS(Representation)));
END_ENTITY;

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

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

ENTITY IfcProfileDef
 SUPERTYPE OF(ONEOF(
IfcArbitraryClosedProfileDef, IfcArbitraryOpenProfileDef, IfcCompositeProfileDef, IfcDerivedProfileDef, IfcParameterizedProfileDef));
  ProfileType : IfcProfileTypeEnum;
  ProfileName : OPTIONAL IfcLabel;
 INVERSE
  HasExternalReference : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
  HasProperties : SET OF IfcProfileProperties FOR ProfileDefinition;
END_ENTITY;

ENTITY IfcProfileProperties
 SUBTYPE OF (
IfcExtendedProperties);
  ProfileDefinition : IfcProfileDef;
END_ENTITY;

ENTITY IfcProject
 SUBTYPE OF (
IfcContext);
 WHERE
  HasName : EXISTS(SELF\IfcRoot.Name);
  CorrectContext : NOT(EXISTS(SELF\IfcContext.RepresentationContexts)) OR (SIZEOF(QUERY(Temp <* SELF\IfcContext.RepresentationContexts | 'IFCREPRESENTATIONRESOURCE.IFCGEOMETRICREPRESENTATIONSUBCONTEXT' IN TYPEOF(Temp) )) = 0);
  NoDecomposition : SIZEOF(SELF\IfcObjectDefinition.Decomposes) = 0;
END_ENTITY;

ENTITY IfcProjectLibrary
 SUBTYPE OF (
IfcContext);
END_ENTITY;

ENTITY IfcProjectOrder
 SUBTYPE OF (
IfcControl);
  PredefinedType : OPTIONAL IfcProjectOrderTypeEnum;
  Status : OPTIONAL IfcLabel;
  LongDescription : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcProjectedCRS
 SUBTYPE OF (
IfcCoordinateReferenceSystem);
  MapProjection : OPTIONAL IfcIdentifier;
  MapZone : OPTIONAL IfcIdentifier;
  MapUnit : OPTIONAL IfcNamedUnit;
 WHERE
  IsLengthUnit : NOT(EXISTS(MapUnit)) OR (MapUnit.UnitType = IfcUnitEnum.LENGTHUNIT);
END_ENTITY;

ENTITY IfcProjectionElement
 SUBTYPE OF (
IfcFeatureElementAddition);
  PredefinedType : OPTIONAL IfcProjectionElementTypeEnum;
END_ENTITY;

ENTITY IfcProperty
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcComplexProperty, IfcSimpleProperty))
 SUBTYPE OF (IfcPropertyAbstraction);
  Name : IfcIdentifier;
  Description : OPTIONAL IfcText;
 INVERSE
  PartOfPset : SET OF IfcPropertySet FOR HasProperties;
  PropertyForDependance : SET OF IfcPropertyDependencyRelationship FOR DependingProperty;
  PropertyDependsOn : SET OF IfcPropertyDependencyRelationship FOR DependantProperty;
  PartOfComplex : SET OF IfcComplexProperty FOR HasProperties;
  HasConstraints : SET OF IfcResourceConstraintRelationship FOR RelatedResourceObjects;
  HasApprovals : SET OF IfcResourceApprovalRelationship FOR RelatedResourceObjects;
END_ENTITY;

ENTITY IfcPropertyAbstraction
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcExtendedProperties, IfcPreDefinedProperties, IfcProperty, IfcPropertyEnumeration));
 INVERSE
  HasExternalReferences : SET OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
END_ENTITY;

ENTITY IfcPropertyBoundedValue
 SUBTYPE OF (
IfcSimpleProperty);
  UpperBoundValue : OPTIONAL IfcValue;
  LowerBoundValue : OPTIONAL IfcValue;
  Unit : OPTIONAL IfcUnit;
  SetPointValue : OPTIONAL IfcValue;
 WHERE
  SameUnitUpperLower : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(LowerBoundValue)) OR (TYPEOF(UpperBoundValue) = TYPEOF(LowerBoundValue));
  SameUnitUpperSet : NOT(EXISTS(UpperBoundValue)) OR NOT(EXISTS(SetPointValue)) OR (TYPEOF(UpperBoundValue) = TYPEOF(SetPointValue));
  SameUnitLowerSet : NOT(EXISTS(LowerBoundValue)) OR NOT(EXISTS(SetPointValue)) OR (TYPEOF(LowerBoundValue) = TYPEOF(SetPointValue));
END_ENTITY;

ENTITY IfcPropertyDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcPropertySetDefinition, IfcPropertyTemplateDefinition))
 SUBTYPE OF (IfcRoot);
 INVERSE
  HasContext : SET [0:1] OF IfcRelDeclares FOR RelatedDefinitions;
  HasAssociations : SET OF IfcRelAssociates FOR RelatedObjects;
END_ENTITY;

ENTITY IfcPropertyDependencyRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  DependingProperty : IfcProperty;
  DependantProperty : IfcProperty;
  Expression : OPTIONAL IfcText;
 WHERE
  NoSelfReference : DependingProperty :<>: DependantProperty;
END_ENTITY;

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

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

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

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

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

ENTITY IfcPropertySetDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcPreDefinedPropertySet, IfcPropertySet, IfcQuantitySet))
 SUBTYPE OF (IfcPropertyDefinition);
 INVERSE
  DefinesType : SET OF IfcTypeObject FOR HasPropertySets;
  IsDefinedBy : SET OF IfcRelDefinesByTemplate FOR RelatedPropertySets;
  DefinesOccurrence : SET [0:?] OF IfcRelDefinesByProperties FOR RelatingPropertyDefinition;
END_ENTITY;

ENTITY IfcPropertySetTemplate
 SUBTYPE OF (
IfcPropertyTemplateDefinition);
  TemplateType : OPTIONAL IfcPropertySetTemplateTypeEnum;
  ApplicableEntity : OPTIONAL IfcIdentifier;
  HasPropertyTemplates : SET [1:?] OF IfcPropertyTemplate;
 INVERSE
  Defines : SET OF IfcRelDefinesByTemplate FOR RelatingTemplate;
 WHERE
  ExistsName : EXISTS(SELF\IfcRoot.Name);
  UniquePropertyNames : IfcUniquePropertyTemplateNames(HasPropertyTemplates);
END_ENTITY;

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

ENTITY IfcPropertyTableValue
 SUBTYPE OF (
IfcSimpleProperty);
  DefiningValues : OPTIONAL LIST [1:?] OF UNIQUE IfcValue;
  DefinedValues : OPTIONAL LIST [1:?] OF IfcValue;
  Expression : OPTIONAL IfcText;
  DefiningUnit : OPTIONAL IfcUnit;
  DefinedUnit : OPTIONAL IfcUnit;
  CurveInterpolation : OPTIONAL IfcCurveInterpolationEnum;
 WHERE
  WR21 : (NOT(EXISTS(DefiningValues)) AND NOT(EXISTS(DefinedValues))) OR (SIZEOF(DefiningValues) = SIZEOF(DefinedValues));
  WR22 : NOT(EXISTS(DefiningValues)) OR (SIZEOF(QUERY(temp <* SELF.DefiningValues | TYPEOF(temp) <> TYPEOF(SELF.DefiningValues[1]) )) = 0);
  WR23 : NOT(EXISTS(DefinedValues)) OR (SIZEOF(QUERY(temp <* SELF.DefinedValues | TYPEOF(temp) <> TYPEOF(SELF.DefinedValues[1]) )) = 0);
END_ENTITY;

ENTITY IfcPropertyTemplate
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcComplexPropertyTemplate, IfcSimplePropertyTemplate))
 SUBTYPE OF (IfcPropertyTemplateDefinition);
 INVERSE
  PartOfComplexTemplate : SET OF IfcComplexPropertyTemplate FOR HasPropertyTemplates;
  PartOfPsetTemplate : SET OF IfcPropertySetTemplate FOR HasPropertyTemplates;
END_ENTITY;

ENTITY IfcPropertyTemplateDefinition
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcPropertySetTemplate, IfcPropertyTemplate))
 SUBTYPE OF (IfcPropertyDefinition);
END_ENTITY;

ENTITY IfcProtectiveDevice
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcProtectiveDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcProtectiveDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProtectiveDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCPROTECTIVEDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcProtectiveDeviceTrippingUnit
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcProtectiveDeviceTrippingUnitTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCPROTECTIVEDEVICETRIPPINGUNITTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcProtectiveDeviceTrippingUnitType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcProtectiveDeviceTrippingUnitTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProtectiveDeviceTrippingUnitTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcProtectiveDeviceType
 SUBTYPE OF (
IfcFlowControllerType);
  PredefinedType : IfcProtectiveDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcProtectiveDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcProtectiveDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcPump
 SUBTYPE OF (
IfcFlowMovingDevice);
  PredefinedType : OPTIONAL IfcPumpTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcPumpTypeEnum.USERDEFINED) OR ((PredefinedType = IfcPumpTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCPUMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

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

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

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

ENTITY IfcQuantitySet
 ABSTRACT SUPERTYPE OF(
IfcElementQuantity)
 SUBTYPE OF (IfcPropertySetDefinition);
END_ENTITY;

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

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

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

ENTITY IfcRailing
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcRailingTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcRailingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRailingTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCRAILINGTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcRailingType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcRailingTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcRailingTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRailingTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcRamp
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcRampTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcRampTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRampTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCRAMPTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcRampFlight
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcRampFlightTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcRampFlightTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRampFlightTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCRAMPFLIGHTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcRampFlightType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcRampFlightTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcRampFlightTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRampFlightTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcRampType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcRampTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcRampTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRampTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcRationalBSplineCurveWithKnots
 SUBTYPE OF (
IfcBSplineCurveWithKnots);
  WeightsData : LIST [2:?] OF IfcReal;
 DERIVE
  Weights : ARRAY [0:UpperIndexOnControlPoints] OF IfcReal := IfcListToArray(WeightsData,0,SELF\IfcBSplineCurve.UpperIndexOnControlPoints);
 WHERE
  SameNumOfWeightsAndPoints : SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineCurve.ControlPointsList);
  WeightsGreaterZero : IfcCurveWeightsPositive(SELF);
END_ENTITY;

ENTITY IfcRationalBSplineSurfaceWithKnots
 SUBTYPE OF (
IfcBSplineSurfaceWithKnots);
  WeightsData : LIST [2:?] OF LIST [2:?] OF IfcReal;
 DERIVE
  Weights : ARRAY [0:UUpper] OF ARRAY [0:VUpper] OF IfcReal := IfcMakeArrayOfArray(WeightsData,0,UUpper,0,VUpper);
 WHERE
  CorrespondingWeightsDataLists : (SIZEOF(WeightsData) = SIZEOF(SELF\IfcBSplineSurface.ControlPointsList)) AND (SIZEOF(WeightsData[1]) = SIZEOF(SELF\IfcBSplineSurface.ControlPointsList[1]));
  WeightValuesGreaterZero : IfcSurfaceWeightsPositive(SELF);
END_ENTITY;

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

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

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

ENTITY IfcRectangularTrimmedSurface
 SUBTYPE OF (
IfcBoundedSurface);
  BasisSurface : IfcSurface;
  U1 : IfcParameterValue;
  V1 : IfcParameterValue;
  U2 : IfcParameterValue;
  V2 : IfcParameterValue;
  Usense : IfcBoolean;
  Vsense : IfcBoolean;
 WHERE
  U1AndU2Different : U1 <> U2;
  V1AndV2Different : V1 <> V2;
  UsenseCompatible : (('IFCGEOMETRYRESOURCE.IFCELEMENTARYSURFACE' IN TYPEOF(BasisSurface)) AND (NOT ('IFCGEOMETRYRESOURCE.IFCPLANE' IN TYPEOF(BasisSurface)))) OR ('IFCGEOMETRYRESOURCE.IFCSURFACEOFREVOLUTION' IN TYPEOF(BasisSurface)) OR (Usense = (U2 > U1));
  VsenseCompatible : Vsense = (V2 > V1);
END_ENTITY;

ENTITY IfcRecurrencePattern;
  RecurrenceType :
IfcRecurrenceTypeEnum;
  DayComponent : OPTIONAL SET [1:?] OF IfcDayInMonthNumber;
  WeekdayComponent : OPTIONAL SET [1:?] OF IfcDayInWeekNumber;
  MonthComponent : OPTIONAL SET [1:?] OF IfcMonthInYearNumber;
  Position : OPTIONAL IfcInteger;
  Interval : OPTIONAL IfcInteger;
  Occurrences : OPTIONAL IfcInteger;
  TimePeriods : OPTIONAL LIST [1:?] OF IfcTimePeriod;
END_ENTITY;

ENTITY IfcReference;
  TypeIdentifier : OPTIONAL
IfcIdentifier;
  AttributeIdentifier : OPTIONAL IfcIdentifier;
  InstanceName : OPTIONAL IfcLabel;
  ListPositions : OPTIONAL LIST [1:?] OF IfcInteger;
  InnerReference : OPTIONAL IfcReference;
END_ENTITY;

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

ENTITY IfcReinforcementBarProperties
 SUBTYPE OF (
IfcPreDefinedProperties);
  TotalCrossSectionArea : IfcAreaMeasure;
  SteelGrade : IfcLabel;
  BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
  EffectiveDepth : OPTIONAL IfcLengthMeasure;
  NominalBarDiameter : OPTIONAL IfcPositiveLengthMeasure;
  BarCount : OPTIONAL IfcCountMeasure;
END_ENTITY;

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

ENTITY IfcReinforcingBar
 SUBTYPE OF (
IfcReinforcingElement);
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  CrossSectionArea : OPTIONAL IfcAreaMeasure;
  BarLength : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcReinforcingBarTypeEnum;
  BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
 WHERE
  CorrectPredefinedType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcReinforcingBarTypeEnum.USERDEFINED) OR ((PredefinedType = IfcReinforcingBarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType)) ;
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCREINFORCINGBARTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcReinforcingBarType
 SUBTYPE OF (
IfcReinforcingElementType);
  PredefinedType : IfcReinforcingBarTypeEnum;
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  CrossSectionArea : OPTIONAL IfcAreaMeasure;
  BarLength : OPTIONAL IfcPositiveLengthMeasure;
  BarSurface : OPTIONAL IfcReinforcingBarSurfaceEnum;
  BendingShapeCode : OPTIONAL IfcLabel;
  BendingParameters : OPTIONAL LIST [1:?] OF IfcBendingParameterSelect;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcReinforcingBarTypeEnum.USERDEFINED) OR ((PredefinedType = IfcReinforcingBarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
  BendingShapeCodeProvided : NOT EXISTS(BendingParameters) OR EXISTS(BendingShapeCode);
END_ENTITY;

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

ENTITY IfcReinforcingElementType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcReinforcingBarType, IfcReinforcingMeshType, IfcTendonAnchorType, IfcTendonType))
 SUBTYPE OF (IfcElementComponentType);
END_ENTITY;

ENTITY IfcReinforcingMesh
 SUBTYPE OF (
IfcReinforcingElement);
  MeshLength : OPTIONAL IfcPositiveLengthMeasure;
  MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
  LongitudinalBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  TransverseBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  LongitudinalBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
  TransverseBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
  LongitudinalBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
  TransverseBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcReinforcingMeshTypeEnum;
 WHERE
  CorrectPredefinedType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcReinforcingMeshTypeEnum.USERDEFINED) OR ((PredefinedType = IfcReinforcingMeshTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCREINFORCINGMESHTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType)) ;
END_ENTITY;

ENTITY IfcReinforcingMeshType
 SUBTYPE OF (
IfcReinforcingElementType);
  PredefinedType : IfcReinforcingMeshTypeEnum;
  MeshLength : OPTIONAL IfcPositiveLengthMeasure;
  MeshWidth : OPTIONAL IfcPositiveLengthMeasure;
  LongitudinalBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  TransverseBarNominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  LongitudinalBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
  TransverseBarCrossSectionArea : OPTIONAL IfcAreaMeasure;
  LongitudinalBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
  TransverseBarSpacing : OPTIONAL IfcPositiveLengthMeasure;
  BendingShapeCode : OPTIONAL IfcLabel;
  BendingParameters : OPTIONAL LIST [1:?] OF IfcBendingParameterSelect;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcReinforcingMeshTypeEnum.USERDEFINED) OR ((PredefinedType = IfcReinforcingMeshTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
  BendingShapeCodeProvided : NOT EXISTS(BendingParameters) OR EXISTS(BendingShapeCode);
END_ENTITY;

ENTITY IfcRelAggregates
 SUBTYPE OF (
IfcRelDecomposes);
  RelatingObject : IfcObjectDefinition;
  RelatedObjects : SET [1:?] OF IfcObjectDefinition;
 WHERE
  NoSelfReference : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
END_ENTITY;

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

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

ENTITY IfcRelAssignsToControl
 SUBTYPE OF (
IfcRelAssigns);
  RelatingControl : IfcControl;
 WHERE
  NoSelfReference : SIZEOF(QUERY(Temp <* SELF\IfcRelAssigns.RelatedObjects | RelatingControl :=: Temp)) = 0;
END_ENTITY;

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

ENTITY IfcRelAssignsToGroupByFactor
 SUBTYPE OF (
IfcRelAssignsToGroup);
  Factor : IfcRatioMeasure;
END_ENTITY;

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

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

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

ENTITY IfcRelAssociates
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcRelAssociatesApproval, IfcRelAssociatesClassification, IfcRelAssociatesConstraint, IfcRelAssociatesDocument, IfcRelAssociatesLibrary, IfcRelAssociatesMaterial))
 SUBTYPE OF (IfcRelationship);
  RelatedObjects : SET [1:?] OF IfcDefinitionSelect;
END_ENTITY;

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

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

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

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

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

ENTITY IfcRelAssociatesMaterial
 SUBTYPE OF (
IfcRelAssociates);
  RelatingMaterial : IfcMaterialSelect;
 WHERE
  NoVoidElement : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | ('IFCPRODUCTEXTENSION.IFCFEATUREELEMENTSUBTRACTION' IN TYPEOF(temp)) OR ('IFCPRODUCTEXTENSION.IFCVIRTUALELEMENT' IN TYPEOF(temp)) )) = 0;
  AllowedElements : SIZEOF(QUERY(temp <* SELF\IfcRelAssociates.RelatedObjects | ( SIZEOF(TYPEOF(temp) * [ 'IFCPRODUCTEXTENSION.IFCELEMENT', 'IFCPRODUCTEXTENSION.IFCELEMENTTYPE', 'IFCSHAREDBLDGELEMENTS.IFCWINDOWSTYLE', 'IFCSHAREDBLDGELEMENTS.IFCDOORSTYLE', 'IFCSTRUCTURALANALYSISDOMAIN.IFCSTRUCTURALMEMBER', 'IFCPRODUCTEXTENSION.IFCPORT']) = 0) )) = 0;
END_ENTITY;

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

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

ENTITY IfcRelConnectsPathElements
 SUBTYPE OF (
IfcRelConnectsElements);
  RelatingPriorities : LIST OF IfcInteger;
  RelatedPriorities : LIST OF IfcInteger;
  RelatedConnectionType : IfcConnectionTypeEnum;
  RelatingConnectionType : IfcConnectionTypeEnum;
 WHERE
  NormalizedRelatingPriorities : (SIZEOF(RelatingPriorities) = 0) OR (SIZEOF (QUERY (temp <* RelatingPriorities | {0 <= temp <= 100} )) = SIZEOF(RelatingPriorities));
  NormalizedRelatedPriorities : (SIZEOF(RelatedPriorities) = 0) OR (SIZEOF (QUERY (temp <* RelatedPriorities | {0 <= temp <= 100} )) = SIZEOF(RelatedPriorities));
END_ENTITY;

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

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

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

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

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

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

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

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

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

ENTITY IfcRelDeclares
 SUBTYPE OF (
IfcRelationship);
  RelatingContext : IfcContext;
  RelatedDefinitions : SET [1:?] OF IfcDefinitionSelect;
 WHERE
  NoSelfReference : SIZEOF(QUERY(Temp <* RelatedDefinitions | RelatingContext :=: Temp)) = 0;
END_ENTITY;

ENTITY IfcRelDecomposes
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcRelAggregates, IfcRelNests, IfcRelProjectsElement, IfcRelVoidsElement))
 SUBTYPE OF (IfcRelationship);
END_ENTITY;

ENTITY IfcRelDefines
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcRelDefinesByObject, IfcRelDefinesByProperties, IfcRelDefinesByTemplate, IfcRelDefinesByType))
 SUBTYPE OF (IfcRelationship);
END_ENTITY;

ENTITY IfcRelDefinesByObject
 SUBTYPE OF (
IfcRelDefines);
  RelatedObjects : SET [1:?] OF IfcObject;
  RelatingObject : IfcObject;
END_ENTITY;

ENTITY IfcRelDefinesByProperties
 SUBTYPE OF (
IfcRelDefines);
  RelatedObjects : SET [1:?] OF IfcObjectDefinition;
  RelatingPropertyDefinition : IfcPropertySetDefinitionSelect;
END_ENTITY;

ENTITY IfcRelDefinesByTemplate
 SUBTYPE OF (
IfcRelDefines);
  RelatedPropertySets : SET [1:?] OF IfcPropertySetDefinition;
  RelatingTemplate : IfcPropertySetTemplate;
END_ENTITY;

ENTITY IfcRelDefinesByType
 SUBTYPE OF (
IfcRelDefines);
  RelatedObjects : SET [1:?] OF IfcObject;
  RelatingType : IfcTypeObject;
END_ENTITY;

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

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

ENTITY IfcRelInterferesElements
 SUBTYPE OF (
IfcRelConnects);
  RelatingElement : IfcElement;
  RelatedElement : IfcElement;
  InterferenceGeometry : OPTIONAL IfcConnectionGeometry;
  InterferenceType : OPTIONAL IfcIdentifier;
  ImpliedOrder : LOGICAL;
 WHERE
  NotSelfReference : RelatingElement :<>: RelatedElement;
END_ENTITY;

ENTITY IfcRelNests
 SUBTYPE OF (
IfcRelDecomposes);
  RelatingObject : IfcObjectDefinition;
  RelatedObjects : LIST [1:?] OF IfcObjectDefinition;
 WHERE
  NoSelfReference : SIZEOF(QUERY(Temp <* RelatedObjects | RelatingObject :=: Temp)) = 0;
END_ENTITY;

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

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

ENTITY IfcRelSequence
 SUBTYPE OF (
IfcRelConnects);
  RelatingProcess : IfcProcess;
  RelatedProcess : IfcProcess;
  TimeLag : OPTIONAL IfcLagTime;
  SequenceType : OPTIONAL IfcSequenceEnum;
  UserDefinedSequenceType : OPTIONAL IfcLabel;
 WHERE
  AvoidInconsistentSequence : RelatingProcess :<>: RelatedProcess;
  CorrectSequenceType : (SequenceType <> IfcSequenceEnum.USERDEFINED) OR ((SequenceType = IfcSequenceEnum.USERDEFINED) AND EXISTS(UserDefinedSequenceType));
END_ENTITY;

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

ENTITY IfcRelSpaceBoundary
 SUPERTYPE OF(
IfcRelSpaceBoundary1stLevel)
 SUBTYPE OF (IfcRelConnects);
  RelatingSpace : IfcSpaceBoundarySelect;
  RelatedBuildingElement : IfcElement;
  ConnectionGeometry : OPTIONAL IfcConnectionGeometry;
  PhysicalOrVirtualBoundary : IfcPhysicalOrVirtualEnum;
  InternalOrExternalBoundary : IfcInternalOrExternalEnum;
 WHERE
  CorrectPhysOrVirt : ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Physical) AND (NOT('IFCPRODUCTEXTENSION.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)))) OR ((PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.Virtual) AND (('IFCPRODUCTEXTENSION.IFCVIRTUALELEMENT' IN TYPEOF(RelatedBuildingElement)) OR ('IFCPRODUCTEXTENSION.IFCOPENINGELEMENT' IN TYPEOF(RelatedBuildingElement)))) OR (PhysicalOrVirtualBoundary = IfcPhysicalOrVirtualEnum.NotDefined);
END_ENTITY;

ENTITY IfcRelSpaceBoundary1stLevel
 SUPERTYPE OF(
IfcRelSpaceBoundary2ndLevel)
 SUBTYPE OF (IfcRelSpaceBoundary);
  ParentBoundary : OPTIONAL IfcRelSpaceBoundary1stLevel;
 INVERSE
  InnerBoundaries : SET OF IfcRelSpaceBoundary1stLevel FOR ParentBoundary;
END_ENTITY;

ENTITY IfcRelSpaceBoundary2ndLevel
 SUBTYPE OF (
IfcRelSpaceBoundary1stLevel);
  CorrespondingBoundary : OPTIONAL IfcRelSpaceBoundary2ndLevel;
 INVERSE
  Corresponds : SET [0:1] OF IfcRelSpaceBoundary2ndLevel FOR CorrespondingBoundary;
END_ENTITY;

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

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

ENTITY IfcReparametrisedCompositeCurveSegment
 SUBTYPE OF (
IfcCompositeCurveSegment);
  ParamLength : IfcParameterValue;
 WHERE
  PositiveLengthParameter : ParamLength > 0.0;
END_ENTITY;

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

ENTITY IfcRepresentationContext
 ABSTRACT SUPERTYPE OF(
IfcGeometricRepresentationContext);
  ContextIdentifier : OPTIONAL IfcLabel;
  ContextType : OPTIONAL IfcLabel;
 INVERSE
  RepresentationsInContext : SET OF IfcRepresentation FOR ContextOfItems;
END_ENTITY;

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

ENTITY IfcRepresentationMap;
  MappingOrigin :
IfcAxis2Placement;
  MappedRepresentation : IfcRepresentation;
 INVERSE
  HasShapeAspects : SET [0:?] OF IfcShapeAspect FOR PartOfProductDefinitionShape;
  MapUsage : SET OF IfcMappedItem FOR MappingSource;
 WHERE
  ApplicableMappedRepr : 'IFCREPRESENTATIONRESOURCE.IFCSHAPEMODEL' IN TYPEOF(MappedRepresentation);
END_ENTITY;

ENTITY IfcResource
 ABSTRACT SUPERTYPE OF(
IfcConstructionResource)
 SUBTYPE OF (IfcObject);
  Identification : OPTIONAL IfcIdentifier;
  LongDescription : OPTIONAL IfcText;
 INVERSE
  ResourceOf : SET OF IfcRelAssignsToResource FOR RelatingResource;
END_ENTITY;

ENTITY IfcResourceApprovalRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
  RelatingApproval : IfcApproval;
END_ENTITY;

ENTITY IfcResourceConstraintRelationship
 SUBTYPE OF (
IfcResourceLevelRelationship);
  RelatingConstraint : IfcConstraint;
  RelatedResourceObjects : SET [1:?] OF IfcResourceObjectSelect;
END_ENTITY;

ENTITY IfcResourceLevelRelationship
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcApprovalRelationship, IfcCurrencyRelationship, IfcDocumentInformationRelationship, IfcExternalReferenceRelationship, IfcMaterialRelationship, IfcOrganizationRelationship, IfcPropertyDependencyRelationship, IfcResourceApprovalRelationship, IfcResourceConstraintRelationship));
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
END_ENTITY;

ENTITY IfcResourceTime
 SUBTYPE OF (
IfcSchedulingTime);
  ScheduleWork : OPTIONAL IfcDuration;
  ScheduleUsage : OPTIONAL IfcPositiveRatioMeasure;
  ScheduleStart : OPTIONAL IfcDateTime;
  ScheduleFinish : OPTIONAL IfcDateTime;
  ScheduleContour : OPTIONAL IfcLabel;
  LevelingDelay : OPTIONAL IfcDuration;
  IsOverAllocated : OPTIONAL IfcBoolean;
  StatusTime : OPTIONAL IfcDateTime;
  ActualWork : OPTIONAL IfcDuration;
  ActualUsage : OPTIONAL IfcPositiveRatioMeasure;
  ActualStart : OPTIONAL IfcDateTime;
  ActualFinish : OPTIONAL IfcDateTime;
  RemainingWork : OPTIONAL IfcDuration;
  RemainingUsage : OPTIONAL IfcPositiveRatioMeasure;
  Completion : OPTIONAL IfcPositiveRatioMeasure;
END_ENTITY;

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

ENTITY IfcRevolvedAreaSolidTapered
 SUBTYPE OF (
IfcRevolvedAreaSolid);
  EndSweptArea : IfcProfileDef;
 WHERE
  CorrectProfileAssignment : IfcTaperedSweptAreaProfiles(SELF\IfcSweptAreaSolid.SweptArea, SELF.EndSweptArea);
END_ENTITY;

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

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

ENTITY IfcRoof
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcRoofTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcRoofTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRoofTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCROOFTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcRoofType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcRoofTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcRoofTypeEnum.USERDEFINED) OR ((PredefinedType = IfcRoofTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

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

ENTITY IfcSanitaryTerminal
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcSanitaryTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSanitaryTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSanitaryTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPLUMBINGFIREPROTECTIONDOMAIN.IFCSANITARYTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSanitaryTerminalType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcSanitaryTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSanitaryTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSanitaryTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcSchedulingTime
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcEventTime, IfcLagTime, IfcResourceTime, IfcTaskTime, IfcWorkTime));
  Name : OPTIONAL IfcLabel;
  DataOrigin : OPTIONAL IfcDataOriginEnum;
  UserDefinedDataOrigin : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcSectionProperties
 SUBTYPE OF (
IfcPreDefinedProperties);
  SectionType : IfcSectionTypeEnum;
  StartProfile : IfcProfileDef;
  EndProfile : OPTIONAL IfcProfileDef;
END_ENTITY;

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

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

ENTITY IfcSensor
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcSensorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSensorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSensorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCSENSORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSensorType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcSensorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSensorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSensorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcShadingDevice
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcShadingDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcShadingDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcShadingDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCSHADINGDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcShadingDeviceType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcShadingDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcShadingDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcShadingDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcShapeRepresentation
 SUBTYPE OF (
IfcShapeModel);
 WHERE
  CorrectContext : 'IFCREPRESENTATIONRESOURCE.IFCGEOMETRICREPRESENTATIONCONTEXT' IN TYPEOF(SELF\IfcRepresentation.ContextOfItems);
  NoTopologicalItem : SIZEOF(QUERY(temp <* Items | ('IFCTOPOLOGYRESOURCE.IFCTOPOLOGICALREPRESENTATIONITEM' IN TYPEOF(temp)) AND (NOT(SIZEOF( ['IFCTOPOLOGYRESOURCE.IFCVERTEXPOINT', 'IFCTOPOLOGYRESOURCE.IFCEDGECURVE', 'IFCTOPOLOGYRESOURCE.IFCFACESURFACE'] * TYPEOF(temp)) = 1)) )) = 0;
  HasRepresentationType : EXISTS(SELF\IfcRepresentation.RepresentationType);
  CorrectItemsForType : IfcShapeRepresentationTypes(SELF\IfcRepresentation.RepresentationType, SELF\IfcRepresentation.Items);
  HasRepresentationIdentifier : EXISTS(SELF\IfcRepresentation.RepresentationIdentifier);
END_ENTITY;

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

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

ENTITY IfcSimplePropertyTemplate
 SUBTYPE OF (
IfcPropertyTemplate);
  TemplateType : OPTIONAL IfcSimplePropertyTemplateTypeEnum;
  PrimaryMeasureType : OPTIONAL IfcLabel;
  SecondaryMeasureType : OPTIONAL IfcLabel;
  Enumerators : OPTIONAL IfcPropertyEnumeration;
  PrimaryUnit : OPTIONAL IfcUnit;
  SecondaryUnit : OPTIONAL IfcUnit;
  Expression : OPTIONAL IfcLabel;
  AccessState : OPTIONAL IfcStateEnum;
END_ENTITY;

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

ENTITY IfcSlab
 SUPERTYPE OF(ONEOF(
IfcSlabElementedCase, IfcSlabStandardCase))
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcSlabTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCSLABTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSlabElementedCase
 SUBTYPE OF (
IfcSlab);
 WHERE
  HasDecomposition : HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) > 0;
END_ENTITY;

ENTITY IfcSlabStandardCase
 SUBTYPE OF (
IfcSlab);
 WHERE
  HasMaterialLayerSetusage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcSlabType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcSlabTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSlabTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSlabTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcSolarDevice
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcSolarDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSolarDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSolarDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCSOLARDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSolarDeviceType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcSolarDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSolarDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSolarDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcSpace
 SUBTYPE OF (
IfcSpatialStructureElement);
  PredefinedType : OPTIONAL IfcSpaceTypeEnum;
  ElevationWithFlooring : OPTIONAL IfcLengthMeasure;
 INVERSE
  HasCoverings : SET OF IfcRelCoversSpaces FOR RelatingSpace;
  BoundedBy : SET OF IfcRelSpaceBoundary FOR RelatingSpace;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSpaceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSpaceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPRODUCTEXTENSION.IFCSPACETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSpaceHeater
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcSpaceHeaterTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSpaceHeaterTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSpaceHeaterTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCSPACEHEATERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcSpaceType
 SUBTYPE OF (
IfcSpatialStructureElementType);
  PredefinedType : IfcSpaceTypeEnum;
  LongName : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSpaceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSpaceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcSpatialElementType.ElementType));
END_ENTITY;

ENTITY IfcSpatialElement
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcExternalSpatialStructureElement, IfcSpatialStructureElement, IfcSpatialZone))
 SUBTYPE OF (IfcProduct);
  LongName : OPTIONAL IfcLabel;
 INVERSE
  ContainsElements : SET OF IfcRelContainedInSpatialStructure FOR RelatingStructure;
  ServicedBySystems : SET OF IfcRelServicesBuildings FOR RelatedBuildings;
  ReferencesElements : SET OF IfcRelReferencedInSpatialStructure FOR RelatingStructure;
END_ENTITY;

ENTITY IfcSpatialElementType
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcSpatialStructureElementType, IfcSpatialZoneType))
 SUBTYPE OF (IfcTypeProduct);
  ElementType : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcSpatialStructureElement
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBuilding, IfcBuildingStorey, IfcSite, IfcSpace))
 SUBTYPE OF (IfcSpatialElement);
  CompositionType : OPTIONAL IfcElementCompositionEnum;
 WHERE
  WR41 : (HIINDEX(SELF\IfcObjectDefinition.Decomposes) = 1) AND ('IFCKERNEL.IFCRELAGGREGATES' IN TYPEOF(SELF\IfcObjectDefinition.Decomposes[1])) AND (('IFCKERNEL.IFCPROJECT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject)) OR ('IFCPRODUCTEXTENSION.IFCSPATIALSTRUCTUREELEMENT' IN TYPEOF (SELF\IfcObjectDefinition.Decomposes[1].RelatingObject)) );
END_ENTITY;

ENTITY IfcSpatialStructureElementType
 ABSTRACT SUPERTYPE OF(
IfcSpaceType)
 SUBTYPE OF (IfcSpatialElementType);
END_ENTITY;

ENTITY IfcSpatialZone
 SUBTYPE OF (
IfcSpatialElement);
  PredefinedType : OPTIONAL IfcSpatialZoneTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSpatialZoneTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSpatialZoneTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPRODUCTEXTENSION.IFCSPATIALZONETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSpatialZoneType
 SUBTYPE OF (
IfcSpatialElementType);
  PredefinedType : IfcSpatialZoneTypeEnum;
  LongName : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSpatialZoneTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSpatialZoneTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcSpatialElementType.ElementType));
END_ENTITY;

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

ENTITY IfcStackTerminal
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcStackTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcStackTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStackTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPLUMBINGFIREPROTECTIONDOMAIN.IFCSTACKTERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcStackTerminalType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcStackTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcStackTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStackTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcStair
 SUBTYPE OF (
IfcBuildingElement);
  PredefinedType : OPTIONAL IfcStairTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcStairTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStairTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCSTAIRTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcStairFlight
 SUBTYPE OF (
IfcBuildingElement);
  NumberOfRisers : OPTIONAL IfcInteger;
  NumberOfTreads : OPTIONAL IfcInteger;
  RiserHeight : OPTIONAL IfcPositiveLengthMeasure;
  TreadLength : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcStairFlightTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcStairFlightTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStairFlightTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCSTAIRFLIGHTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcStairFlightType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcStairFlightTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcStairFlightTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStairFlightTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcStairType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcStairTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcStairTypeEnum.USERDEFINED) OR ((PredefinedType = IfcStairTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcStructuralAction
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcStructuralCurveAction, IfcStructuralPointAction, IfcStructuralSurfaceAction))
 SUBTYPE OF (IfcStructuralActivity);
  DestabilizingLoad : OPTIONAL IfcBoolean;
END_ENTITY;

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

ENTITY IfcStructuralAnalysisModel
 SUBTYPE OF (
IfcSystem);
  PredefinedType : IfcAnalysisModelTypeEnum;
  OrientationOf2DPlane : OPTIONAL IfcAxis2Placement3D;
  LoadedBy : OPTIONAL SET [1:?] OF IfcStructuralLoadGroup;
  HasResults : OPTIONAL SET [1:?] OF IfcStructuralResultGroup;
  SharedPlacement : OPTIONAL IfcObjectPlacement;
 WHERE
  HasObjectType : (PredefinedType <> IfcAnalysisModelTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

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

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

ENTITY IfcStructuralCurveAction
 SUPERTYPE OF(
IfcStructuralLinearAction)
 SUBTYPE OF (IfcStructuralAction);
  ProjectedOrTrue : OPTIONAL IfcProjectedOrTrueLengthEnum;
  PredefinedType : IfcStructuralCurveActivityTypeEnum;
 WHERE
  ProjectedIsGlobal : (NOT EXISTS(ProjectedOrTrue)) OR ((ProjectedOrTrue <> PROJECTED_LENGTH) OR (SELF\IfcStructuralActivity.GlobalOrLocal = GLOBAL_COORDS));
  HasObjectType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
  SuitablePredefinedType : PredefinedType <> IfcStructuralCurveActivityTypeEnum.EQUIDISTANT;
END_ENTITY;

ENTITY IfcStructuralCurveConnection
 SUBTYPE OF (
IfcStructuralConnection);
  Axis : IfcDirection;
END_ENTITY;

ENTITY IfcStructuralCurveMember
 SUPERTYPE OF(
IfcStructuralCurveMemberVarying)
 SUBTYPE OF (IfcStructuralMember);
  PredefinedType : IfcStructuralCurveMemberTypeEnum;
  Axis : IfcDirection;
 WHERE
  HasObjectType : (PredefinedType <> IfcStructuralCurveMemberTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcStructuralCurveMemberVarying
 SUBTYPE OF (
IfcStructuralCurveMember);
END_ENTITY;

ENTITY IfcStructuralCurveReaction
 SUBTYPE OF (
IfcStructuralReaction);
  PredefinedType : IfcStructuralCurveActivityTypeEnum;
 WHERE
  HasObjectType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
  SuitablePredefinedType : (PredefinedType <> IfcStructuralCurveActivityTypeEnum.SINUS) AND (PredefinedType <> IfcStructuralCurveActivityTypeEnum.PARABOLA);
END_ENTITY;

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

ENTITY IfcStructuralLinearAction
 SUBTYPE OF (
IfcStructuralCurveAction);
 WHERE
  SuitableLoadType : SIZEOF(['IFCSTRUCTURALLOADRESOURCE.IFCSTRUCTURALLOADLINEARFORCE', 'IFCSTRUCTURALLOADRESOURCE.IFCSTRUCTURALLOADTEMPERATURE'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
  ConstPredefinedType : SELF\IfcStructuralCurveAction.PredefinedType = IfcStructuralCurveActivityTypeEnum.CONST;
END_ENTITY;

ENTITY IfcStructuralLoad
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcStructuralLoadConfiguration, IfcStructuralLoadOrResult));
  Name : OPTIONAL IfcLabel;
END_ENTITY;

ENTITY IfcStructuralLoadCase
 SUBTYPE OF (
IfcStructuralLoadGroup);
  SelfWeightCoefficients : OPTIONAL LIST [3:3] OF IfcRatioMeasure;
 WHERE
  IsLoadCasePredefinedType : SELF\IfcStructuralLoadGroup.PredefinedType = IfcLoadGroupTypeEnum.LOAD_CASE;
END_ENTITY;

ENTITY IfcStructuralLoadConfiguration
 SUBTYPE OF (
IfcStructuralLoad);
  Values : LIST [1:?] OF IfcStructuralLoadOrResult;
  Locations : OPTIONAL LIST [1:?] OF UNIQUE LIST [1:2] OF IfcLengthMeasure;
 WHERE
  ValidListSize : NOT EXISTS(Locations) OR (SIZEOF(Locations) = SIZEOF(Values));
END_ENTITY;

ENTITY IfcStructuralLoadGroup
 SUPERTYPE OF(
IfcStructuralLoadCase)
 SUBTYPE OF (IfcGroup);
  PredefinedType : IfcLoadGroupTypeEnum;
  ActionType : IfcActionTypeEnum;
  ActionSource : IfcActionSourceTypeEnum;
  Coefficient : OPTIONAL IfcRatioMeasure;
  Purpose : OPTIONAL IfcLabel;
 INVERSE
  SourceOfResultGroup : SET [0:1] OF IfcStructuralResultGroup FOR ResultForLoadGroup;
  LoadGroupFor : SET OF IfcStructuralAnalysisModel FOR LoadedBy;
 WHERE
  HasObjectType : ( (PredefinedType <> IfcLoadGroupTypeEnum.USERDEFINED) AND (ActionType <> IfcActionTypeEnum.USERDEFINED) AND (ActionSource <> IfcActionSourceTypeEnum.USERDEFINED) ) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

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

ENTITY IfcStructuralLoadOrResult
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcStructuralLoadStatic, IfcSurfaceReinforcementArea))
 SUBTYPE OF (IfcStructuralLoad);
END_ENTITY;

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

ENTITY IfcStructuralLoadSingleDisplacement
 SUPERTYPE OF(
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(
IfcStructuralLoadSingleForceWarping)
 SUBTYPE OF (IfcStructuralLoadStatic);
  ForceX : OPTIONAL IfcForceMeasure;
  ForceY : OPTIONAL IfcForceMeasure;
  ForceZ : OPTIONAL IfcForceMeasure;
  MomentX : OPTIONAL IfcTorqueMeasure;
  MomentY : OPTIONAL IfcTorqueMeasure;
  MomentZ : OPTIONAL IfcTorqueMeasure;
END_ENTITY;

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

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

ENTITY IfcStructuralLoadTemperature
 SUBTYPE OF (
IfcStructuralLoadStatic);
  DeltaTConstant : OPTIONAL IfcThermodynamicTemperatureMeasure;
  DeltaTY : OPTIONAL IfcThermodynamicTemperatureMeasure;
  DeltaTZ : OPTIONAL IfcThermodynamicTemperatureMeasure;
END_ENTITY;

ENTITY IfcStructuralMember
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcStructuralCurveMember, IfcStructuralSurfaceMember))
 SUBTYPE OF (IfcStructuralItem);
 INVERSE
  ConnectedBy : SET OF IfcRelConnectsStructuralMember FOR RelatingStructuralMember;
END_ENTITY;

ENTITY IfcStructuralPlanarAction
 SUBTYPE OF (
IfcStructuralSurfaceAction);
 WHERE
  SuitableLoadType : SIZEOF(['IFCSTRUCTURALLOADRESOURCE.IFCSTRUCTURALLOADPLANARFORCE', 'IFCSTRUCTURALLOADRESOURCE.IFCSTRUCTURALLOADTEMPERATURE'] * TYPEOF(SELF\IfcStructuralActivity.AppliedLoad)) = 1;
  ConstPredefinedType : SELF\IfcStructuralSurfaceAction.PredefinedType = IfcStructuralSurfaceActivityTypeEnum.CONST;
END_ENTITY;

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

ENTITY IfcStructuralPointConnection
 SUBTYPE OF (
IfcStructuralConnection);
  ConditionCoordinateSystem : OPTIONAL IfcAxis2Placement3D;
END_ENTITY;

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

ENTITY IfcStructuralReaction
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcStructuralCurveReaction, IfcStructuralPointReaction, IfcStructuralSurfaceReaction))
 SUBTYPE OF (IfcStructuralActivity);
END_ENTITY;

ENTITY IfcStructuralResultGroup
 SUBTYPE OF (
IfcGroup);
  TheoryType : IfcAnalysisTheoryTypeEnum;
  ResultForLoadGroup : OPTIONAL IfcStructuralLoadGroup;
  IsLinear : IfcBoolean;
 INVERSE
  ResultGroupFor : SET [0:1] OF IfcStructuralAnalysisModel FOR HasResults;
 WHERE
  HasObjectType : (TheoryType <> IfcAnalysisTheoryTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcStructuralSurfaceAction
 SUPERTYPE OF(
IfcStructuralPlanarAction)
 SUBTYPE OF (IfcStructuralAction);
  ProjectedOrTrue : OPTIONAL IfcProjectedOrTrueLengthEnum;
  PredefinedType : IfcStructuralSurfaceActivityTypeEnum;
 WHERE
  ProjectedIsGlobal : (NOT EXISTS(ProjectedOrTrue)) OR ((ProjectedOrTrue <> PROJECTED_LENGTH) OR (SELF\IfcStructuralActivity.GlobalOrLocal = GLOBAL_COORDS));
  HasObjectType : (PredefinedType <> IfcStructuralSurfaceActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcStructuralSurfaceConnection
 SUBTYPE OF (
IfcStructuralConnection);
END_ENTITY;

ENTITY IfcStructuralSurfaceMember
 SUPERTYPE OF(
IfcStructuralSurfaceMemberVarying)
 SUBTYPE OF (IfcStructuralMember);
  PredefinedType : IfcStructuralSurfaceMemberTypeEnum;
  Thickness : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
  HasObjectType : (PredefinedType <> IfcStructuralSurfaceMemberTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcStructuralSurfaceMemberVarying
 SUBTYPE OF (
IfcStructuralSurfaceMember);
END_ENTITY;

ENTITY IfcStructuralSurfaceReaction
 SUBTYPE OF (
IfcStructuralReaction);
  PredefinedType : IfcStructuralSurfaceActivityTypeEnum;
 WHERE
  HasPredefinedType : (PredefinedType <> IfcStructuralSurfaceActivityTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

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

ENTITY IfcStyledItem
 SUBTYPE OF (
IfcRepresentationItem);
  Item : OPTIONAL IfcRepresentationItem;
  Styles : SET [1:?] OF IfcStyleAssignmentSelect;
  Name : OPTIONAL IfcLabel;
 WHERE
  ApplicableItem : NOT('IFCPRESENTATIONAPPEARANCERESOURCE.IFCSTYLEDITEM' IN TYPEOF(Item));
END_ENTITY;

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

ENTITY IfcSubContractResource
 SUBTYPE OF (
IfcConstructionResource);
  PredefinedType : OPTIONAL IfcSubContractResourceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSubContractResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSubContractResourceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcSubContractResourceType
 SUBTYPE OF (
IfcConstructionResourceType);
  PredefinedType : IfcSubContractResourceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSubContractResourceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSubContractResourceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeResource.ResourceType));
END_ENTITY;

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

ENTITY IfcSurface
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBoundedSurface, IfcElementarySurface, IfcSweptSurface))
 SUBTYPE OF (IfcGeometricRepresentationItem);
 DERIVE
  Dim : IfcDimensionCount := 3;
END_ENTITY;

ENTITY IfcSurfaceCurveSweptAreaSolid
 SUBTYPE OF (
IfcSweptAreaSolid);
  Directrix : IfcCurve;
  StartParam : OPTIONAL IfcParameterValue;
  EndParam : OPTIONAL IfcParameterValue;
  ReferenceSurface : IfcSurface;
 WHERE
  DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR (SIZEOF(['IFCGEOMETRYRESOURCE.IFCCONIC', 'IFCGEOMETRYRESOURCE.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
END_ENTITY;

ENTITY IfcSurfaceFeature
 SUBTYPE OF (
IfcFeatureElement);
  PredefinedType : OPTIONAL IfcSurfaceFeatureTypeEnum;
 WHERE
  HasObjectType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcSurfaceFeatureTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

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

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

ENTITY IfcSurfaceReinforcementArea
 SUBTYPE OF (
IfcStructuralLoadOrResult);
  SurfaceReinforcement1 : OPTIONAL LIST [2:3] OF IfcLengthMeasure;
  SurfaceReinforcement2 : OPTIONAL LIST [2:3] OF IfcLengthMeasure;
  ShearReinforcement : OPTIONAL IfcRatioMeasure;
 WHERE
  SurfaceAndOrShearAreaSpecified : EXISTS(SurfaceReinforcement1) OR EXISTS(SurfaceReinforcement2) OR EXISTS(ShearReinforcement);
  NonnegativeArea1 : (NOT EXISTS(SurfaceReinforcement1)) OR ( (SurfaceReinforcement1[1] >= 0.) AND (SurfaceReinforcement1[2] >= 0.) AND ((SIZEOF(SurfaceReinforcement1) = 1) OR (SurfaceReinforcement1[1] >= 0.)) );
  NonnegativeArea2 : (NOT EXISTS(SurfaceReinforcement2)) OR ( (SurfaceReinforcement2[1] >= 0.) AND (SurfaceReinforcement2[2] >= 0.) AND ((SIZEOF(SurfaceReinforcement2) = 1) OR (SurfaceReinforcement2[1] >= 0.)) );
  NonnegativeArea3 : (NOT EXISTS(ShearReinforcement)) OR (ShearReinforcement >= 0.);
END_ENTITY;

ENTITY IfcSurfaceStyle
 SUBTYPE OF (
IfcPresentationStyle);
  Side : IfcSurfaceSide;
  Styles : SET [1:5] OF IfcSurfaceStyleElementSelect;
 WHERE
  MaxOneShading : SIZEOF(QUERY(Style <* SELF.Styles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCSURFACESTYLESHADING' IN TYPEOF(Style) )) <= 1;
  MaxOneLighting : SIZEOF(QUERY(Style <* SELF.Styles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCSURFACESTYLELIGHTING' IN TYPEOF(Style) )) <= 1;
  MaxOneRefraction : SIZEOF(QUERY(Style <* SELF.Styles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCSURFACESTYLEREFRACTION' IN TYPEOF(Style) )) <= 1;
  MaxOneTextures : SIZEOF(QUERY(Style <* SELF.Styles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCSURFACESTYLEWITHTEXTURES' IN TYPEOF(Style) )) <= 1;
  MaxOneExtDefined : SIZEOF(QUERY(Style <* SELF.Styles | 'IFCPRESENTATIONAPPEARANCERESOURCE.IFCEXTERNALLYDEFINEDSURFACESTYLE' IN TYPEOF(Style) )) <= 1;
END_ENTITY;

ENTITY IfcSurfaceStyleLighting
 SUBTYPE OF (
IfcPresentationItem);
  DiffuseTransmissionColour : IfcColourRgb;
  DiffuseReflectionColour : IfcColourRgb;
  TransmissionColour : IfcColourRgb;
  ReflectanceColour : IfcColourRgb;
END_ENTITY;

ENTITY IfcSurfaceStyleRefraction
 SUBTYPE OF (
IfcPresentationItem);
  RefractionIndex : OPTIONAL IfcReal;
  DispersionFactor : OPTIONAL IfcReal;
END_ENTITY;

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

ENTITY IfcSurfaceStyleShading
 SUPERTYPE OF(
IfcSurfaceStyleRendering)
 SUBTYPE OF (IfcPresentationItem);
  SurfaceColour : IfcColourRgb;
  Transparency : OPTIONAL IfcNormalisedRatioMeasure;
END_ENTITY;

ENTITY IfcSurfaceStyleWithTextures
 SUBTYPE OF (
IfcPresentationItem);
  Textures : LIST [1:?] OF IfcSurfaceTexture;
END_ENTITY;

ENTITY IfcSurfaceTexture
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcBlobTexture, IfcImageTexture, IfcPixelTexture))
 SUBTYPE OF (IfcPresentationItem);
  RepeatS : IfcBoolean;
  RepeatT : IfcBoolean;
  Mode : OPTIONAL IfcIdentifier;
  TextureTransform : OPTIONAL IfcCartesianTransformationOperator2D;
  Parameter : OPTIONAL LIST [1:?] OF IfcIdentifier;
 INVERSE
  IsMappedBy : SET [0:?] OF IfcTextureCoordinate FOR Maps;
  UsedInStyles : SET [0:?] OF IfcSurfaceStyleWithTextures FOR Textures;
END_ENTITY;

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

ENTITY IfcSweptDiskSolid
 SUPERTYPE OF(
IfcSweptDiskSolidPolygonal)
 SUBTYPE OF (IfcSolidModel);
  Directrix : IfcCurve;
  Radius : IfcPositiveLengthMeasure;
  InnerRadius : OPTIONAL IfcPositiveLengthMeasure;
  StartParam : OPTIONAL IfcParameterValue;
  EndParam : OPTIONAL IfcParameterValue;
 WHERE
  DirectrixDim : Directrix.Dim = 3;
  InnerRadiusSize : (NOT EXISTS(InnerRadius)) OR (Radius > InnerRadius);
  DirectrixBounded : (EXISTS(StartParam) AND EXISTS(EndParam)) OR (SIZEOF(['IFCGEOMETRYRESOURCE.IFCCONIC', 'IFCGEOMETRYRESOURCE.IFCBOUNDEDCURVE'] * TYPEOF(Directrix)) = 1);
END_ENTITY;

ENTITY IfcSweptDiskSolidPolygonal
 SUBTYPE OF (
IfcSweptDiskSolid);
  FilletRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
  CorrectRadii : NOT(EXISTS(FilletRadius)) OR (FilletRadius >= SELF\IfcSweptDiskSolid.Radius);
  DirectrixIsPolyline : 'IFCGEOMETRYRESOURCE.IFCPOLYLINE' IN TYPEOF(SELF\IfcSweptDiskSolid.Directrix);
END_ENTITY;

ENTITY IfcSweptSurface
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcSurfaceOfLinearExtrusion, IfcSurfaceOfRevolution))
 SUBTYPE OF (IfcSurface);
  SweptCurve : IfcProfileDef;
  Position : OPTIONAL IfcAxis2Placement3D;
 WHERE
  SweptCurveType : SweptCurve.ProfileType = IfcProfileTypeEnum.Curve;
END_ENTITY;

ENTITY IfcSwitchingDevice
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcSwitchingDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSwitchingDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSwitchingDeviceTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCSWITCHINGDEVICETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSwitchingDeviceType
 SUBTYPE OF (
IfcFlowControllerType);
  PredefinedType : IfcSwitchingDeviceTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSwitchingDeviceTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSwitchingDeviceTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcSystemFurnitureElement
 SUBTYPE OF (
IfcFurnishingElement);
  PredefinedType : OPTIONAL IfcSystemFurnitureElementTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcSystemFurnitureElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSystemFurnitureElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDFACILITIESELEMENTS.IFCSYSTEMFURNITUREELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcSystemFurnitureElementType
 SUBTYPE OF (
IfcFurnishingElementType);
  PredefinedType : OPTIONAL IfcSystemFurnitureElementTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcSystemFurnitureElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcSystemFurnitureElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

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

ENTITY IfcTableColumn;
  Identifier : OPTIONAL
IfcIdentifier;
  Name : OPTIONAL IfcLabel;
  Description : OPTIONAL IfcText;
  Unit : OPTIONAL IfcUnit;
  ReferencePath : OPTIONAL IfcReference;
END_ENTITY;

ENTITY IfcTableRow;
  RowCells : OPTIONAL LIST [1:?] OF
IfcValue;
  IsHeading : OPTIONAL IfcBoolean;
END_ENTITY;

ENTITY IfcTank
 SUBTYPE OF (
IfcFlowStorageDevice);
  PredefinedType : OPTIONAL IfcTankTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTankTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTankTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCTANKTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

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

ENTITY IfcTask
 SUBTYPE OF (
IfcProcess);
  Status : OPTIONAL IfcLabel;
  WorkMethod : OPTIONAL IfcLabel;
  IsMilestone : IfcBoolean;
  Priority : OPTIONAL IfcInteger;
  TaskTime : OPTIONAL IfcTaskTime;
  PredefinedType : OPTIONAL IfcTaskTypeEnum;
 WHERE
  HasName : EXISTS(SELF\IfcRoot.Name);
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTaskTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTaskTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcTaskTime
 SUPERTYPE OF(
IfcTaskTimeRecurring)
 SUBTYPE OF (IfcSchedulingTime);
  DurationType : OPTIONAL IfcTaskDurationEnum;
  ScheduleDuration : OPTIONAL IfcDuration;
  ScheduleStart : OPTIONAL IfcDateTime;
  ScheduleFinish : OPTIONAL IfcDateTime;
  EarlyStart : OPTIONAL IfcDateTime;
  EarlyFinish : OPTIONAL IfcDateTime;
  LateStart : OPTIONAL IfcDateTime;
  LateFinish : OPTIONAL IfcDateTime;
  FreeFloat : OPTIONAL IfcDuration;
  TotalFloat : OPTIONAL IfcDuration;
  IsCritical : OPTIONAL IfcBoolean;
  StatusTime : OPTIONAL IfcDateTime;
  ActualDuration : OPTIONAL IfcDuration;
  ActualStart : OPTIONAL IfcDateTime;
  ActualFinish : OPTIONAL IfcDateTime;
  RemainingTime : OPTIONAL IfcDuration;
  Completion : OPTIONAL IfcPositiveRatioMeasure;
END_ENTITY;

ENTITY IfcTaskTimeRecurring
 SUBTYPE OF (
IfcTaskTime);
  Recurrence : IfcRecurrencePattern;
END_ENTITY;

ENTITY IfcTaskType
 SUBTYPE OF (
IfcTypeProcess);
  PredefinedType : IfcTaskTypeEnum;
  WorkMethod : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTaskTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTaskTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcTypeProcess.ProcessType)) ;
END_ENTITY;

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

ENTITY IfcTendon
 SUBTYPE OF (
IfcReinforcingElement);
  PredefinedType : OPTIONAL IfcTendonTypeEnum;
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  CrossSectionArea : OPTIONAL IfcAreaMeasure;
  TensionForce : OPTIONAL IfcForceMeasure;
  PreStress : OPTIONAL IfcPressureMeasure;
  FrictionCoefficient : OPTIONAL IfcNormalisedRatioMeasure;
  AnchorageSlip : OPTIONAL IfcPositiveLengthMeasure;
  MinCurvatureRadius : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCTENDONTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType)) ;
END_ENTITY;

ENTITY IfcTendonAnchor
 SUBTYPE OF (
IfcReinforcingElement);
  PredefinedType : OPTIONAL IfcTendonAnchorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTendonAnchorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonAnchorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSTRUCTURALELEMENTSDOMAIN.IFCTENDONANCHORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcTendonAnchorType
 SUBTYPE OF (
IfcReinforcingElementType);
  PredefinedType : IfcTendonAnchorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTendonAnchorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonAnchorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTendonType
 SUBTYPE OF (
IfcReinforcingElementType);
  PredefinedType : IfcTendonTypeEnum;
  NominalDiameter : OPTIONAL IfcPositiveLengthMeasure;
  CrossSectionArea : OPTIONAL IfcAreaMeasure;
  SheethDiameter : OPTIONAL IfcPositiveLengthMeasure;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTendonTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTendonTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

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

ENTITY IfcTessellatedItem
 ABSTRACT SUPERTYPE OF(
IfcTessellatedFaceSet)
 SUBTYPE OF (IfcGeometricRepresentationItem);
END_ENTITY;

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

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

ENTITY IfcTextStyle
 SUBTYPE OF (
IfcPresentationStyle);
  TextCharacterAppearance : OPTIONAL IfcTextStyleForDefinedFont;
  TextStyle : OPTIONAL IfcTextStyleTextModel;
  TextFontStyle : IfcTextFontSelect;
  ModelOrDraughting : OPTIONAL IfcBoolean;
END_ENTITY;

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

ENTITY IfcTextStyleForDefinedFont
 SUBTYPE OF (
IfcPresentationItem);
  Colour : IfcColour;
  BackgroundColour : OPTIONAL IfcColour;
END_ENTITY;

ENTITY IfcTextStyleTextModel
 SUBTYPE OF (
IfcPresentationItem);
  TextIndent : OPTIONAL IfcSizeSelect;
  TextAlign : OPTIONAL IfcTextAlignment;
  TextDecoration : OPTIONAL IfcTextDecoration;
  LetterSpacing : OPTIONAL IfcSizeSelect;
  WordSpacing : OPTIONAL IfcSizeSelect;
  TextTransform : OPTIONAL IfcTextTransformation;
  LineHeight : OPTIONAL IfcSizeSelect;
END_ENTITY;

ENTITY IfcTextureCoordinate
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcIndexedTextureMap, IfcTextureCoordinateGenerator, IfcTextureMap))
 SUBTYPE OF (IfcPresentationItem);
  Maps : LIST [1:?] OF IfcSurfaceTexture;
END_ENTITY;

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

ENTITY IfcTextureMap
 SUBTYPE OF (
IfcTextureCoordinate);
  Vertices : LIST [3:?] OF IfcTextureVertex;
  MappedTo : IfcFace;
END_ENTITY;

ENTITY IfcTextureVertex
 SUBTYPE OF (
IfcPresentationItem);
  Coordinates : LIST [2:2] OF IfcParameterValue;
END_ENTITY;

ENTITY IfcTextureVertexList
 SUBTYPE OF (
IfcPresentationItem);
  TexCoordsList : LIST [1:?] OF LIST [2:2] OF IfcParameterValue;
END_ENTITY;

ENTITY IfcTimePeriod;
  StartTime :
IfcTime;
  EndTime : IfcTime;
END_ENTITY;

ENTITY IfcTimeSeries
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcIrregularTimeSeries, IfcRegularTimeSeries));
  Name : IfcLabel;
  Description : OPTIONAL IfcText;
  StartTime : IfcDateTime;
  EndTime : IfcDateTime;
  TimeSeriesDataType : IfcTimeSeriesDataTypeEnum;
  DataOrigin : IfcDataOriginEnum;
  UserDefinedDataOrigin : OPTIONAL IfcLabel;
  Unit : OPTIONAL IfcUnit;
 INVERSE
  HasExternalReference : SET [1:?] OF IfcExternalReferenceRelationship FOR RelatedResourceObjects;
END_ENTITY;

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

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

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

ENTITY IfcTransformer
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcTransformerTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTransformerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTransformerTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCELECTRICALDOMAIN.IFCTRANFORMERTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcTransformerType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcTransformerTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTransformerTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTransformerTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTransportElement
 SUBTYPE OF (
IfcElement);
  PredefinedType : OPTIONAL IfcTransportElementTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTransportElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTransportElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPRODUCTEXTENSION.IFCTRANSPORTELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcTransportElementType
 SUBTYPE OF (
IfcElementType);
  PredefinedType : IfcTransportElementTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTransportElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTransportElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTrapeziumProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  BottomXDim : IfcPositiveLengthMeasure;
  TopXDim : IfcPositiveLengthMeasure;
  YDim : IfcPositiveLengthMeasure;
  TopXOffset : IfcLengthMeasure;
END_ENTITY;

ENTITY IfcTriangulatedFaceSet
 SUBTYPE OF (
IfcTessellatedFaceSet);
  CoordIndex : LIST [1:?] OF LIST [3:3] OF IfcPositiveInteger;
  NormalIndex : OPTIONAL LIST [1:?] OF LIST [3:3] OF IfcPositiveInteger;
 DERIVE
  NumberOfTriangles : IfcInteger := SIZEOF(CoordIndex);
END_ENTITY;

ENTITY IfcTrimmedCurve
 SUBTYPE OF (
IfcBoundedCurve);
  BasisCurve : IfcCurve;
  Trim1 : SET [1:2] OF IfcTrimmingSelect;
  Trim2 : SET [1:2] OF IfcTrimmingSelect;
  SenseAgreement : IfcBoolean;
  MasterRepresentation : IfcTrimmingPreference;
 WHERE
  Trim1ValuesConsistent : (HIINDEX(Trim1) = 1) OR (TYPEOF(Trim1[1]) <> TYPEOF(Trim1[2]));
  Trim2ValuesConsistent : (HIINDEX(Trim2) = 1) OR (TYPEOF(Trim2[1]) <> TYPEOF(Trim2[2]));
  NoTrimOfBoundedCurves : NOT('IFCGEOMETRYRESOURCE.IFCBOUNDEDCURVE' IN TYPEOF(BasisCurve));
END_ENTITY;

ENTITY IfcTubeBundle
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcTubeBundleTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCTUBEBUNDLETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcTubeBundleType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcTubeBundleTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcTubeBundleTypeEnum.USERDEFINED) OR ((PredefinedType = IfcTubeBundleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcTypeObject
 SUPERTYPE OF(ONEOF(
IfcTypeProcess, IfcTypeProduct, IfcTypeResource))
 SUBTYPE OF (IfcObjectDefinition);
  ApplicableOccurrence : OPTIONAL IfcIdentifier;
  HasPropertySets : OPTIONAL SET [1:?] OF IfcPropertySetDefinition;
 INVERSE
  Types : SET [0:1] OF IfcRelDefinesByType FOR RelatingType;
 WHERE
  NameRequired : EXISTS(SELF\IfcRoot.Name);
  UniquePropertySetNames : (NOT(EXISTS(HasPropertySets))) OR IfcUniquePropertySetNames(HasPropertySets);
END_ENTITY;

ENTITY IfcTypeProcess
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcEventType, IfcProcedureType, IfcTaskType))
 SUBTYPE OF (IfcTypeObject);
  Identification : OPTIONAL IfcIdentifier;
  LongDescription : OPTIONAL IfcText;
  ProcessType : OPTIONAL IfcLabel;
 INVERSE
  OperatesOn : SET OF IfcRelAssignsToProcess FOR RelatingProcess;
END_ENTITY;

ENTITY IfcTypeProduct
 SUPERTYPE OF(ONEOF(
IfcDoorStyle, IfcElementType, IfcSpatialElementType, IfcWindowStyle))
 SUBTYPE OF (IfcTypeObject);
  RepresentationMaps : OPTIONAL LIST [1:?] OF UNIQUE IfcRepresentationMap;
  Tag : OPTIONAL IfcLabel;
 INVERSE
  ReferencedBy : SET OF IfcRelAssignsToProduct FOR RelatingProduct;
 WHERE
  ApplicableOccurrence : NOT(EXISTS(SELF\IfcTypeObject.Types[1])) OR (SIZEOF(QUERY(temp <* SELF\IfcTypeObject.Types[1].RelatedObjects | NOT('IFCKERNEL.IFCPRODUCT' IN TYPEOF(temp))) ) = 0);
END_ENTITY;

ENTITY IfcTypeResource
 ABSTRACT SUPERTYPE OF(
IfcConstructionResourceType)
 SUBTYPE OF (IfcTypeObject);
  Identification : OPTIONAL IfcIdentifier;
  LongDescription : OPTIONAL IfcText;
  ResourceType : OPTIONAL IfcLabel;
 INVERSE
  ResourceOf : SET OF IfcRelAssignsToResource FOR RelatingResource;
END_ENTITY;

ENTITY IfcUShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  Depth : IfcPositiveLengthMeasure;
  FlangeWidth : IfcPositiveLengthMeasure;
  WebThickness : IfcPositiveLengthMeasure;
  FlangeThickness : IfcPositiveLengthMeasure;
  FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  FlangeSlope : OPTIONAL IfcPlaneAngleMeasure;
 WHERE
  ValidFlangeThickness : FlangeThickness < (Depth / 2.);
  ValidWebThickness : WebThickness < FlangeWidth;
END_ENTITY;

ENTITY IfcUnitAssignment;
  Units : SET [1:?] OF
IfcUnit;
 WHERE
  WR01 : IfcCorrectUnitAssignment(Units);
END_ENTITY;

ENTITY IfcUnitaryControlElement
 SUBTYPE OF (
IfcDistributionControlElement);
  PredefinedType : OPTIONAL IfcUnitaryControlElementTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcUnitaryControlElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcUnitaryControlElementTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCBUILDINGCONTROLSDOMAIN.IFCUNITARYCONTROLELEMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcUnitaryControlElementType
 SUBTYPE OF (
IfcDistributionControlElementType);
  PredefinedType : IfcUnitaryControlElementTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcUnitaryControlElementTypeEnum.USERDEFINED) OR ((PredefinedType = IfcUnitaryControlElementTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcUnitaryEquipment
 SUBTYPE OF (
IfcEnergyConversionDevice);
  PredefinedType : OPTIONAL IfcUnitaryEquipmentTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCUNITARYEQUIPMENTTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcUnitaryEquipmentType
 SUBTYPE OF (
IfcEnergyConversionDeviceType);
  PredefinedType : IfcUnitaryEquipmentTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcUnitaryEquipmentTypeEnum.USERDEFINED) OR ((PredefinedType = IfcUnitaryEquipmentTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcValve
 SUBTYPE OF (
IfcFlowController);
  PredefinedType : OPTIONAL IfcValveTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcValveTypeEnum.USERDEFINED) OR ((PredefinedType = IfcValveTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCVALVETYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcValveType
 SUBTYPE OF (
IfcFlowControllerType);
  PredefinedType : IfcValveTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcValveTypeEnum.USERDEFINED) OR ((PredefinedType = IfcValveTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcVector
 SUBTYPE OF (
IfcGeometricRepresentationItem);
  Orientation : IfcDirection;
  Magnitude : IfcLengthMeasure;
 DERIVE
  Dim : IfcDimensionCount := Orientation.Dim;
 WHERE
  MagGreaterOrEqualZero : Magnitude >= 0.0;
END_ENTITY;

ENTITY IfcVertex
 SUPERTYPE OF(
IfcVertexPoint)
 SUBTYPE OF (IfcTopologicalRepresentationItem);
END_ENTITY;

ENTITY IfcVertexLoop
 SUBTYPE OF (
IfcLoop);
  LoopVertex : IfcVertex;
END_ENTITY;

ENTITY IfcVertexPoint
 SUBTYPE OF (
IfcVertex);
  VertexGeometry : IfcPoint;
END_ENTITY;

ENTITY IfcVibrationIsolator
 SUBTYPE OF (
IfcElementComponent);
  PredefinedType : OPTIONAL IfcVibrationIsolatorTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcVibrationIsolatorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcVibrationIsolatorTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCHVACDOMAIN.IFCVIBRATIONISOLATORTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcVibrationIsolatorType
 SUBTYPE OF (
IfcElementComponentType);
  PredefinedType : IfcVibrationIsolatorTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcVibrationIsolatorTypeEnum.USERDEFINED) OR ((PredefinedType = IfcVibrationIsolatorTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcVirtualElement
 SUBTYPE OF (
IfcElement);
END_ENTITY;

ENTITY IfcVirtualGridIntersection;
  IntersectingAxes : LIST [2:2] OF UNIQUE
IfcGridAxis;
  OffsetDistances : LIST [2:3] OF IfcLengthMeasure;
END_ENTITY;

ENTITY IfcVoidingFeature
 SUBTYPE OF (
IfcFeatureElementSubtraction);
  PredefinedType : OPTIONAL IfcVoidingFeatureTypeEnum;
 WHERE
  HasObjectType : NOT EXISTS(PredefinedType) OR (PredefinedType <> IfcVoidingFeatureTypeEnum.USERDEFINED) OR EXISTS(SELF\IfcObject.ObjectType);
END_ENTITY;

ENTITY IfcWall
 SUPERTYPE OF(ONEOF(
IfcWallElementedCase, IfcWallStandardCase))
 SUBTYPE OF (IfcBuildingElement);
  PredefinedType : OPTIONAL IfcWallTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWallTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWallTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCWALLTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcWallElementedCase
 SUBTYPE OF (
IfcWall);
 WHERE
  HasDecomposition : HIINDEX(SELF\IfcObjectDefinition.IsDecomposedBy) > 0;
END_ENTITY;

ENTITY IfcWallStandardCase
 SUBTYPE OF (
IfcWall);
 WHERE
  HasMaterialLayerSetUsage : SIZEOF (QUERY(temp <* USEDIN(SELF, 'IFCKERNEL.IFCRELASSOCIATES.RELATEDOBJECTS') | ('IFCPRODUCTEXTENSION.IFCRELASSOCIATESMATERIAL' IN TYPEOF(temp)) AND ('IFCMATERIALRESOURCE.IFCMATERIALLAYERSETUSAGE' IN TYPEOF(temp.RelatingMaterial)) )) = 1;
END_ENTITY;

ENTITY IfcWallType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcWallTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcWallTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWallTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcWasteTerminal
 SUBTYPE OF (
IfcFlowTerminal);
  PredefinedType : OPTIONAL IfcWasteTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWasteTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWasteTerminalTypeEnum.USERDEFINED) AND EXISTS (SELF\IfcObject.ObjectType));
  CorrectTypeAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCPLUMBINGFIREPROTECTIONDOMAIN.IFCWASTETERMINALTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcWasteTerminalType
 SUBTYPE OF (
IfcFlowTerminalType);
  PredefinedType : IfcWasteTerminalTypeEnum;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcWasteTerminalTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWasteTerminalTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcWindow
 SUPERTYPE OF(
IfcWindowStandardCase)
 SUBTYPE OF (IfcBuildingElement);
  OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
  OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
  PredefinedType : OPTIONAL IfcWindowTypeEnum;
  PartitioningType : OPTIONAL IfcWindowTypePartitioningEnum;
  UserDefinedPartitioningType : OPTIONAL IfcLabel;
 WHERE
  CorrectStyleAssigned : (SIZEOF(IsTypedBy) = 0) OR ('IFCSHAREDBLDGELEMENTS.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcObject.IsTypedBy[1].RelatingType));
END_ENTITY;

ENTITY IfcWindowLiningProperties
 SUBTYPE OF (
IfcPreDefinedPropertySet);
  LiningDepth : OPTIONAL IfcPositiveLengthMeasure;
  LiningThickness : OPTIONAL IfcNonNegativeLengthMeasure;
  TransomThickness : OPTIONAL IfcNonNegativeLengthMeasure;
  MullionThickness : OPTIONAL IfcNonNegativeLengthMeasure;
  FirstTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
  SecondTransomOffset : OPTIONAL IfcNormalisedRatioMeasure;
  FirstMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
  SecondMullionOffset : OPTIONAL IfcNormalisedRatioMeasure;
  ShapeAspectStyle : OPTIONAL IfcShapeAspect;
  LiningOffset : OPTIONAL IfcLengthMeasure;
  LiningToPanelOffsetX : OPTIONAL IfcLengthMeasure;
  LiningToPanelOffsetY : OPTIONAL IfcLengthMeasure;
 WHERE
  WR31 : NOT(EXISTS(LiningDepth) AND NOT(EXISTS(LiningThickness)));
  WR32 : NOT(NOT(EXISTS(FirstTransomOffset)) AND EXISTS(SecondTransomOffset));
  WR33 : NOT(NOT(EXISTS(FirstMullionOffset)) AND EXISTS(SecondMullionOffset));
  WR34 : (EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1])) AND ( ('IFCSHAREDBLDGELEMENTS.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1])) OR ('IFCARCHITECTUREDOMAIN.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1])) );
END_ENTITY;

ENTITY IfcWindowPanelProperties
 SUBTYPE OF (
IfcPreDefinedPropertySet);
  OperationType : IfcWindowPanelOperationEnum;
  PanelPosition : IfcWindowPanelPositionEnum;
  FrameDepth : OPTIONAL IfcPositiveLengthMeasure;
  FrameThickness : OPTIONAL IfcPositiveLengthMeasure;
  ShapeAspectStyle : OPTIONAL IfcShapeAspect;
 WHERE
  ApplicableToType : (EXISTS(SELF\IfcPropertySetDefinition.DefinesType[1])) AND ( ('IFCSHAREDBLDGELEMENTS.IFCWINDOWTYPE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1])) OR ('IFCARCHITECTUREDOMAIN.IFCWINDOWSTYLE' IN TYPEOF(SELF\IfcPropertySetDefinition.DefinesType[1])) );
END_ENTITY;

ENTITY IfcWindowStandardCase
 SUBTYPE OF (
IfcWindow);
END_ENTITY;

ENTITY IfcWindowStyle
 SUBTYPE OF (
IfcTypeProduct);
  ConstructionType : IfcWindowStyleConstructionEnum;
  OperationType : IfcWindowStyleOperationEnum;
  ParameterTakesPrecedence : IfcBoolean;
  Sizeable : IfcBoolean;
END_ENTITY;

ENTITY IfcWindowType
 SUBTYPE OF (
IfcBuildingElementType);
  PredefinedType : IfcWindowTypeEnum;
  PartitioningType : IfcWindowTypePartitioningEnum;
  ParameterTakesPrecedence : OPTIONAL IfcBoolean;
  UserDefinedPartitioningType : OPTIONAL IfcLabel;
 WHERE
  CorrectPredefinedType : (PredefinedType <> IfcWindowTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWindowTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcElementType.ElementType));
END_ENTITY;

ENTITY IfcWorkCalendar
 SUBTYPE OF (
IfcControl);
  WorkingTimes : OPTIONAL SET [1:?] OF IfcWorkTime;
  ExceptionTimes : OPTIONAL SET [1:?] OF IfcWorkTime;
  PredefinedType : OPTIONAL IfcWorkCalendarTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkCalendarTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWorkCalendarTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcWorkControl
 ABSTRACT SUPERTYPE OF(ONEOF(
IfcWorkPlan, IfcWorkSchedule))
 SUBTYPE OF (IfcControl);
  CreationDate : IfcDateTime;
  Creators : OPTIONAL SET [1:?] OF IfcPerson;
  Purpose : OPTIONAL IfcLabel;
  Duration : OPTIONAL IfcDuration;
  TotalFloat : OPTIONAL IfcDuration;
  StartTime : IfcDateTime;
  FinishTime : OPTIONAL IfcDateTime;
END_ENTITY;

ENTITY IfcWorkPlan
 SUBTYPE OF (
IfcWorkControl);
  PredefinedType : OPTIONAL IfcWorkPlanTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkPlanTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWorkPlanTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcWorkSchedule
 SUBTYPE OF (
IfcWorkControl);
  PredefinedType : OPTIONAL IfcWorkScheduleTypeEnum;
 WHERE
  CorrectPredefinedType : NOT(EXISTS(PredefinedType)) OR (PredefinedType <> IfcWorkScheduleTypeEnum.USERDEFINED) OR ((PredefinedType = IfcWorkScheduleTypeEnum.USERDEFINED) AND EXISTS(SELF\IfcObject.ObjectType));
END_ENTITY;

ENTITY IfcWorkTime
 SUBTYPE OF (
IfcSchedulingTime);
  RecurrencePattern : OPTIONAL IfcRecurrencePattern;
  Start : OPTIONAL IfcDate;
  Finish : OPTIONAL IfcDate;
END_ENTITY;

ENTITY IfcZShapeProfileDef
 SUBTYPE OF (
IfcParameterizedProfileDef);
  Depth : IfcPositiveLengthMeasure;
  FlangeWidth : IfcPositiveLengthMeasure;
  WebThickness : IfcPositiveLengthMeasure;
  FlangeThickness : IfcPositiveLengthMeasure;
  FilletRadius : OPTIONAL IfcNonNegativeLengthMeasure;
  EdgeRadius : OPTIONAL IfcNonNegativeLengthMeasure;
 WHERE
  ValidFlangeThickness : FlangeThickness < (Depth / 2.);
END_ENTITY;

ENTITY IfcZone
 SUBTYPE OF (
IfcSystem);
  LongName : OPTIONAL IfcLabel;
 WHERE
  WR1 : (SIZEOF(SELF\IfcGroup.IsGroupedBy) = 0) OR (SIZEOF (QUERY (temp <* SELF\IfcGroup.IsGroupedBy[1].RelatedObjects | NOT(('IFCPRODUCTEXTENSION.IFCZONE' IN TYPEOF(temp)) OR ('IFCPRODUCTEXTENSION.IFCSPACE' IN TYPEOF(temp)) OR ('IFCPRODUCTEXTENSION.IFCSPATIALZONE' IN TYPEOF(temp)) ))) = 0);
END_ENTITY;

FUNCTION IfcBaseAxis
  (Dim : INTEGER;
   Axis1, Axis2, Axis3 : IfcDirection)
    : LIST [2:3] OF IfcDirection;

LOCAL
  U : LIST [2:3] OF IfcDirection;
  Factor : REAL;
  D1, D2 : IfcDirection;
END_LOCAL;

  IF (Dim = 3) THEN
    D1 := NVL(IfcNormalise(Axis3), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
    D2 := IfcFirstProjAxis(D1, Axis1);
    U  := [D2, IfcSecondProjAxis(D1, D2, Axis2), D1];
  ELSE
    IF EXISTS(Axis1) THEN
      D1 := IfcNormalise(Axis1);
      U  := [D1, IfcOrthogonalComplement(D1)];
      IF EXISTS(Axis2) THEN
        Factor := IfcDotProduct(Axis2, U[2]);
        IF (Factor < 0.0) THEN
          U[2].DirectionRatios[1] := -U[2].DirectionRatios[1];
          U[2].DirectionRatios[2] := -U[2].DirectionRatios[2];
        END_IF;
      END_IF;
    ELSE
      IF EXISTS(Axis2) THEN
        D1 := IfcNormalise(Axis2);
        U  := [IfcOrthogonalComplement(D1), D1];
        U[1].DirectionRatios[1] := -U[1].DirectionRatios[1];
        U[1].DirectionRatios[2] := -U[1].DirectionRatios[2];
        ELSE
          U := [IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0, 0.0]),
                IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0, 1.0])];
      END_IF;
    END_IF;
  END_IF;
  RETURN(U);
END_FUNCTION;


FUNCTION IfcBooleanChoose
(B : BOOLEAN ;
     Choice1, Choice2 : Generic : Item) : Generic : Item;
  IF B THEN
     RETURN (Choice1);
  ELSE
     RETURN (Choice2);
  END_IF;
END_FUNCTION;


FUNCTION IfcBuild2Axes
  (RefDirection : IfcDirection)
    : LIST [2:2] OF IfcDirection;
LOCAL
  D : IfcDirection := NVL(IfcNormalise(RefDirection),
      IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0]));
END_LOCAL;
  RETURN([D, IfcOrthogonalComplement(D)]);
END_FUNCTION;


FUNCTION IfcBuildAxes
  (Axis, RefDirection : IfcDirection)
    : LIST [3:3] OF IfcDirection;
LOCAL
  D1, D2 : IfcDirection;
END_LOCAL;
  D1 := NVL(IfcNormalise(Axis), IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,0.0,1.0]));
  D2 := IfcFirstProjAxis(D1, RefDirection);
  RETURN ([D2, IfcNormalise(IfcCrossProduct(D1,D2))\IfcVector.Orientation, D1]);
END_FUNCTION;


FUNCTION IfcConsecutiveSegments
  (Segments : LIST [1:?] OF IfcSegmentIndexSelect)
  : BOOLEAN;

LOCAL
  Result : BOOLEAN := TRUE;
END_LOCAL;

  REPEAT i := 1 to (HIINDEX(Segments)-1);
    IF Segments[i][HIINDEX(Segments[i])] <> Segments[i+1][1] THEN
      BEGIN
        Result := FALSE;
        ESCAPE;
      END;
END_IF;
  END_REPEAT;

  RETURN (Result);
END_FUNCTION;


FUNCTION IfcConstraintsParamBSpline
( Degree, UpKnots, UpCp : INTEGER;
  KnotMult : LIST OF INTEGER;
  Knots : LIST OF IfcParameterValue )
: BOOLEAN;


  LOCAL
    Result : BOOLEAN := TRUE;
    K, Sum : INTEGER;
  END_LOCAL;

  (* Find sum of knot multiplicities. *)
  Sum := KnotMult[1];
  REPEAT i := 2 TO UpKnots;
    Sum := Sum + KnotMult[i];
  END_REPEAT;

  (* Check limits holding for all B-spline parametrisations *)
  IF (Degree < 1) OR (UpKnots < 2) OR (UpCp < Degree) OR
    (Sum <> (Degree + UpCp + 2)) THEN
    Result := FALSE;
    RETURN(Result);
  END_IF;

  K := KnotMult[1];
  IF (K < 1) OR (K > Degree + 1) THEN
    Result := FALSE;
    RETURN(Result);
  END_IF;

  REPEAT i := 2 TO UpKnots;
    IF (KnotMult[i] < 1) OR (Knots[i] <= Knots[i-1]) THEN
      Result := FALSE;
      RETURN(Result);
    END_IF;
    K := KnotMult[i];
    IF (i < UpKnots) AND (K > Degree) THEN
      Result := FALSE;
      RETURN(Result);
    END_IF;
    IF (i = UpKnots) AND (K > Degree + 1) THEN
      Result := FALSE;
      RETURN(Result);
    END_IF;
  END_REPEAT;

  RETURN(result);
END_FUNCTION;


FUNCTION IfcConvertDirectionInto2D
    (Direction : IfcDirection)
    : IfcDirection;

  LOCAL
    Direction2D : IfcDirection := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.,1.]);
  END_LOCAL;
  
  Direction2D.DirectionRatios[1] := Direction.DirectionRatios[1];
  Direction2D.DirectionRatios[2] := Direction.DirectionRatios[2];
  
  RETURN (Direction2D);

END_FUNCTION;


FUNCTION IfcCorrectDimensions
(m   : IfcUnitEnum; Dim : IfcDimensionalExponents) : LOGICAL;  
CASE m OF
  LENGTHUNIT : IF
    Dim = (IfcDimensionalExponents (1, 0, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  MASSUNIT : IF
    Dim = (IfcDimensionalExponents (0, 1, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  TIMEUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 1, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICCURRENTUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 1, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  THERMODYNAMICTEMPERATUREUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 1, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  AMOUNTOFSUBSTANCEUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 1, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  LUMINOUSINTENSITYUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  PLANEANGLEUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  SOLIDANGLEUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  AREAUNIT : IF
    Dim = (IfcDimensionalExponents (2, 0, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  VOLUMEUNIT : IF
    Dim = (IfcDimensionalExponents (3, 0, 0, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;

  ABSORBEDDOSEUNIT : IF
    Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  RADIOACTIVITYUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICCAPACITANCEUNIT : IF
    Dim = (IfcDimensionalExponents (-2, -1, 4, 2, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  DOSEEQUIVALENTUNIT : IF
    Dim = (IfcDimensionalExponents (2, 0, -2, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICCHARGEUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 1, 1, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICCONDUCTANCEUNIT : IF
    Dim = (IfcDimensionalExponents (-2, -1, 3, 2, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICVOLTAGEUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -3, -1, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ELECTRICRESISTANCEUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -3, -2, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ENERGYUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -2, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  FORCEUNIT : IF
    Dim = (IfcDimensionalExponents (1, 1, -2, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  FREQUENCYUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, -1, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  INDUCTANCEUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -2, -2, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  ILLUMINANCEUNIT : IF
    Dim = (IfcDimensionalExponents (-2, 0, 0, 0, 0, 0, 1))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  LUMINOUSFLUXUNIT : IF
    Dim = (IfcDimensionalExponents (0, 0, 0, 0, 0, 0, 1))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  MAGNETICFLUXUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -2, -1, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  MAGNETICFLUXDENSITYUNIT : IF
    Dim = (IfcDimensionalExponents (0, 1, -2, -1, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  POWERUNIT : IF
    Dim = (IfcDimensionalExponents (2, 1, -3, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;
  PRESSUREUNIT : IF
    Dim = (IfcDimensionalExponents (-1, 1, -2, 0, 0, 0, 0))
      THEN RETURN(TRUE);
      ELSE RETURN(FALSE);
    END_IF;

  OTHERWISE :
    RETURN (UNKNOWN);
END_CASE;
END_FUNCTION;


FUNCTION IfcCorrectFillAreaStyle
  (Styles : SET[1:?] OF IfcFillStyleSelect)
  :LOGICAL;

LOCAL
   Hatching : INTEGER := 0;
   Tiles    : INTEGER := 0;
   Colour   : INTEGER := 0;
   External : INTEGER := 0;
END_LOCAL;


External := SIZEOF(QUERY(Style <* Styles |
  'IFCPRESENTATIONAPPEARANCERESOURCE.IFCEXTERNALLYDEFINEDHATCHSTYLE' IN
   TYPEOF(Style)));

Hatching  := SIZEOF(QUERY(Style <* Styles |
  'IFCPRESENTATIONAPPEARANCERESOURCE.IFCFILLAREASTYLEHATCHING' IN
   TYPEOF(Style)));

Tiles     := SIZEOF(QUERY(Style <* Styles |
  'IFCPRESENTATIONAPPEARANCERESOURCE.IFCFILLAREASTYLETILES' IN
   TYPEOF(Style)));

Colour    := SIZEOF(QUERY(Style <* Styles |
  'IFCPRESENTATIONAPPEARANCERESOURCE.IFCCOLOUR' IN
   TYPEOF(Style)));


IF (External > 1) THEN
  RETURN (FALSE);
END_IF;


IF ((External = 1) AND ((Hatching > 0) OR (Tiles > 0) OR (Colour > 0))) THEN
  RETURN (FALSE);
END_IF;


IF (Colour > 1) THEN
  RETURN (FALSE);
END_IF;

IF ((Hatching > 0) AND (Tiles >0)) THEN
  RETURN (FALSE);
END_IF;

RETURN(TRUE);
END_FUNCTION;


FUNCTION IfcCorrectLocalPlacement
  (AxisPlacement:IfcAxis2Placement;
   RelPlacement : IfcObjectPlacement):LOGICAL;

  IF (EXISTS(RelPlacement)) THEN
    IF ('IFCGEOMETRICCONSTRAINTRESOURCE.IFCGRIDPLACEMENT' IN TYPEOF(RelPlacement)) THEN
      RETURN(?);
    END_IF;
    IF ('IFCGEOMETRICCONSTRAINTRESOURCE.IFCLOCALPLACEMENT' IN TYPEOF(RelPlacement)) THEN
      IF ('IFCGEOMETRYRESOURCE.IFCAXIS2PLACEMENT2D' IN TYPEOF(AxisPlacement)) THEN
        RETURN(TRUE);
      END_IF;
      IF ('IFCGEOMETRYRESOURCE.IFCAXIS2PLACEMENT3D' IN TYPEOF(AxisPlacement)) THEN
        IF (RelPlacement\IfcLocalPlacement.RelativePlacement.Dim = 3) THEN
          RETURN(TRUE);
        ELSE
          RETURN(FALSE);
        END_IF;
      END_IF;
    END_IF;
  ELSE
    RETURN(TRUE);  
  END_IF;
  RETURN(?);
END_FUNCTION;


FUNCTION IfcCorrectObjectAssignment
  (Constraint: IfcObjectTypeEnum; Objects : SET[1:?] OF IfcObjectDefinition)
  : LOGICAL ;
  
LOCAL
  Count : INTEGER := 0;
END_LOCAL;

    IF NOT(EXISTS(Constraint)) THEN
      RETURN(TRUE);
    END_IF;
  
    CASE Constraint OF
      IfcObjectTypeEnum.NOTDEFINED : RETURN(TRUE);
      IfcObjectTypeEnum.PRODUCT :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCPRODUCT' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.PROCESS :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCPROCESS' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.CONTROL :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCCONTROL' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.RESOURCE :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCRESOURCE' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.ACTOR :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCACTOR' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.GROUP :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.IFCGROUP' IN TYPEOF(temp))));
          RETURN(Count = 0);
        END;
      IfcObjectTypeEnum.PROJECT :
        BEGIN
          Count := SIZEOF(QUERY(temp <* Objects | NOT('IFCKERNEL.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 | ('IFCMEASURERESOURCE.IFCNAMEDUNIT' IN TYPEOF(temp)) AND NOT(temp\IfcNamedUnit.UnitType = IfcUnitEnum.USERDEFINED)));
  DerivedUnitNumber  := SIZEOF(QUERY(temp <* Units | ('IFCMEASURERESOURCE.IFCDERIVEDUNIT' IN TYPEOF(temp)) AND NOT(temp\IfcDerivedUnit.UnitType = IfcDerivedUnitEnum.USERDEFINED)));
  MonetaryUnitNumber := SIZEOF(QUERY(temp <* Units |  'IFCMEASURERESOURCE.IFCMONETARYUNIT' IN TYPEOF(temp)));

  REPEAT i := 1 TO SIZEOF(Units);
    IF (('IFCMEASURERESOURCE.IFCNAMEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i]\IfcNamedUnit.UnitType = IfcUnitEnum.USERDEFINED)) THEN
        NamedUnitNames := NamedUnitNames + Units[i]\IfcNamedUnit.UnitType;
    END_IF;
    IF (('IFCMEASURERESOURCE.IFCDERIVEDUNIT' IN TYPEOF(Units[i])) AND NOT(Units[i]\IfcDerivedUnit.UnitType = IfcDerivedUnitEnum.USERDEFINED)) THEN
        DerivedUnitNames := DerivedUnitNames + Units[i]\IfcDerivedUnit.UnitType;
    END_IF;
  END_REPEAT;

  RETURN((SIZEOF(NamedUnitNames) = NamedUnitNumber) AND (SIZEOF(DerivedUnitNames) = DerivedUnitNumber) AND (MonetaryUnitNumber <= 1));
END_FUNCTION;


FUNCTION IfcCrossProduct
  (Arg1, Arg2 : IfcDirection)
    : IfcVector;
LOCAL
  Mag : REAL;
  Res : IfcDirection;
  V1,V2  : LIST[3:3] OF REAL;
  Result : IfcVector;
END_LOCAL;

  IF (NOT EXISTS (Arg1) OR (Arg1.Dim = 2)) OR (NOT EXISTS (Arg2) OR (Arg2.Dim = 2)) THEN
    RETURN(?);
  ELSE
    BEGIN
      V1  := IfcNormalise(Arg1)\IfcDirection.DirectionRatios;
      V2  := IfcNormalise(Arg2)\IfcDirection.DirectionRatios;
      Res := IfcRepresentationItem() || IfcGeometricRepresentationItem ()
             || IfcDirection([(V1[2]*V2[3] - V1[3]*V2[2]), (V1[3]*V2[1] - V1[1]*V2[3]), (V1[1]*V2[2] - V1[2]*V2[1])]);
      Mag := 0.0;
      REPEAT i := 1 TO 3;
        Mag := Mag + Res.DirectionRatios[i]*Res.DirectionRatios[i];
      END_REPEAT;
      IF (Mag > 0.0) THEN
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Res, SQRT(Mag));
      ELSE
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(Arg1, 0.0);
      END_IF;
      RETURN(Result);
    END;
  END_IF;
END_FUNCTION;


FUNCTION IfcCurveDim
(Curve : IfcCurve)
       : IfcDimensionCount;

  IF ('IFCGEOMETRYRESOURCE.IFCLINE' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcLine.Pnt.Dim);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCCONIC' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcConic.Position.Dim);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCPOLYLINE' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcPolyline.Points[1].Dim);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCTRIMMEDCURVE' IN TYPEOF(Curve))
    THEN RETURN(IfcCurveDim(Curve\IfcTrimmedCurve.BasisCurve));
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCCOMPOSITECURVE' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcCompositeCurve.Segments[1].Dim);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCBSPLINECURVE' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcBSplineCurve.ControlPointsList[1].Dim);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCOFFSETCURVE2D' IN TYPEOF(Curve))
    THEN RETURN(2);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCOFFSETCURVE3D' IN TYPEOF(Curve))
    THEN RETURN(3);
  END_IF;
  IF ('IFCGEOMETRYRESOURCE.IFCPCURVE' IN TYPEOF(Curve))
    THEN RETURN(3);
  END_IF;
  IF ('IFC4.IFCINDEXEDPOLYCURVE' IN TYPEOF(Curve))
    THEN RETURN(Curve\IfcIndexedPolyCurve.Points.Dim);
  END_IF;
RETURN (?);
END_FUNCTION;


FUNCTION IfcCurveWeightsPositive
( B: IfcRationalBSplineCurveWithKnots)
: BOOLEAN;

  LOCAL
    Result : BOOLEAN := TRUE;
  END_LOCAL;

  REPEAT i := 0 TO B.UpperIndexOnControlPoints;
    IF B.Weights[i] <= 0.0  THEN
      Result := FALSE;
      RETURN(Result);
    END_IF;
  END_REPEAT;
  RETURN(Result);
END_FUNCTION;


FUNCTION IfcDeriveDimensionalExponents
    (UnitElements : SET [1:?] OF IfcDerivedUnitElement)
    : IfcDimensionalExponents;  
    LOCAL
    Result : IfcDimensionalExponents :=
            IfcDimensionalExponents(0, 0, 0, 0, 0, 0, 0);  
    END_LOCAL;
    REPEAT i := LOINDEX(UnitElements) TO HIINDEX(UnitElements);
        Result.LengthExponent := Result.LengthExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.LengthExponent);
        Result.MassExponent := Result.MassExponent  +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.MassExponent);
        Result.TimeExponent := Result.TimeExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.TimeExponent);
        Result.ElectricCurrentExponent := Result.ElectricCurrentExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.ElectricCurrentExponent);
        Result.ThermodynamicTemperatureExponent := Result.ThermodynamicTemperatureExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.ThermodynamicTemperatureExponent);
        Result.AmountOfSubstanceExponent := Result.AmountOfSubstanceExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.AmountOfSubstanceExponent);
        Result.LuminousIntensityExponent := Result.LuminousIntensityExponent +
          (UnitElements[i].Exponent *
           UnitElements[i].Unit.Dimensions.LuminousIntensityExponent);
    END_REPEAT;  
    RETURN (Result);
END_FUNCTION;


FUNCTION IfcDimensionsForSiUnit
(n : IfcSiUnitName )     : IfcDimensionalExponents;
  CASE n OF
    METRE          : RETURN (IfcDimensionalExponents
                             (1, 0, 0, 0, 0, 0, 0));
    SQUARE_METRE   : RETURN (IfcDimensionalExponents
                             (2, 0, 0, 0, 0, 0, 0));
    CUBIC_METRE    : RETURN (IfcDimensionalExponents
                             (3, 0, 0, 0, 0, 0, 0));
    GRAM           : RETURN (IfcDimensionalExponents
                             (0, 1, 0, 0, 0, 0, 0));
    SECOND         : RETURN (IfcDimensionalExponents
                             (0, 0, 1, 0, 0, 0, 0));
    AMPERE         : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 1, 0, 0, 0));
    KELVIN         : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 1, 0, 0));
    MOLE           : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 1, 0));
    CANDELA        : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 0, 1));
    RADIAN         : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 0, 0));
    STERADIAN      : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 0, 0));
    HERTZ          : RETURN (IfcDimensionalExponents
                             (0, 0, -1, 0, 0, 0, 0));
    NEWTON         : RETURN (IfcDimensionalExponents
                             (1, 1, -2, 0, 0, 0, 0));
    PASCAL         : RETURN (IfcDimensionalExponents
                             (-1, 1, -2, 0, 0, 0, 0));
    JOULE          : RETURN (IfcDimensionalExponents
                             (2, 1, -2, 0, 0, 0, 0));
    WATT           : RETURN (IfcDimensionalExponents
                             (2, 1, -3, 0, 0, 0, 0));
    COULOMB        : RETURN (IfcDimensionalExponents
                             (0, 0, 1, 1, 0, 0, 0));
    VOLT           : RETURN (IfcDimensionalExponents
                             (2, 1, -3, -1, 0, 0, 0));
    FARAD          : RETURN (IfcDimensionalExponents
                             (-2, -1, 4, 2, 0, 0, 0));
    OHM            : RETURN (IfcDimensionalExponents
                             (2, 1, -3, -2, 0, 0, 0));
    SIEMENS        : RETURN (IfcDimensionalExponents
                             (-2, -1, 3, 2, 0, 0, 0));
    WEBER          : RETURN (IfcDimensionalExponents
                             (2, 1, -2, -1, 0, 0, 0));
    TESLA          : RETURN (IfcDimensionalExponents
                             (0, 1, -2, -1, 0, 0, 0));
    HENRY          : RETURN (IfcDimensionalExponents
                             (2, 1, -2, -2, 0, 0, 0));
    DEGREE_CELSIUS : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 1, 0, 0));
    LUMEN          : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 0, 1));
    LUX            : RETURN (IfcDimensionalExponents
                             (-2, 0, 0, 0, 0, 0, 1));
    BECQUEREL      : RETURN (IfcDimensionalExponents
                             (0, 0, -1, 0, 0, 0, 0));
    GRAY           : RETURN (IfcDimensionalExponents
                             (2, 0, -2, 0, 0, 0, 0));
    SIEVERT        : RETURN (IfcDimensionalExponents
                             (2, 0, -2, 0, 0, 0, 0));
    OTHERWISE      : RETURN (IfcDimensionalExponents
                             (0, 0, 0, 0, 0, 0, 0));
  END_CASE;
END_FUNCTION;


FUNCTION IfcDotProduct
  (Arg1, Arg2 : IfcDirection)
    : REAL;
LOCAL
  Scalar : REAL;
  Vec1, Vec2 : IfcDirection;
  Ndim   : INTEGER;
END_LOCAL;

  IF NOT EXISTS (Arg1) OR NOT EXISTS (Arg2) THEN
    Scalar := ?;
  ELSE
    IF (Arg1.Dim <> Arg2.Dim) THEN
      Scalar := ?;
    ELSE
      BEGIN
        Vec1 := IfcNormalise(Arg1);
        Vec2 := IfcNormalise(Arg2);
        Ndim := Arg1.Dim;
        Scalar := 0.0;
        REPEAT i := 1 TO Ndim;
          Scalar := Scalar + Vec1.DirectionRatios[i]*Vec2.DirectionRatios[i];
        END_REPEAT;
      END;
    END_IF;
  END_IF;
  RETURN (Scalar);
END_FUNCTION;


FUNCTION IfcFirstProjAxis
  (ZAxis, Arg : IfcDirection) : IfcDirection;
LOCAL
  XAxis : IfcDirection;
  V     : IfcDirection;
  Z     : IfcDirection;
  XVec  : IfcVector;
END_LOCAL;

  IF (NOT EXISTS(ZAxis)) THEN
    RETURN (?) ;
  ELSE
    Z := IfcNormalise(ZAxis);
    IF NOT EXISTS(Arg) THEN
      IF (Z.DirectionRatios <> [1.0,0.0,0.0]) THEN
        V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.0,0.0,0.0]);
      ELSE
        V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
      END_IF;
    ELSE
      IF (Arg.Dim <> 3) THEN
        RETURN (?) ;
      END_IF;
      IF ((IfcCrossProduct(Arg,Z).Magnitude) = 0.0) THEN
        RETURN (?);
      ELSE
        V := IfcNormalise(Arg);
      END_IF;
    END_IF;
    XVec  := IfcScalarTimesVector(IfcDotProduct(V, Z), Z);
    XAxis := IfcVectorDifference(V, XVec).Orientation;
    XAxis := IfcNormalise(XAxis);
  END_IF;
  RETURN(XAxis);
END_FUNCTION;


FUNCTION IfcGetBasisSurface
(C : IfcCurveOnSurface) : SET[0:2] OF IfcSurface;

  LOCAL
    Surfs : SET[0:2] OF IfcSurface;
    N : INTEGER;
  END_LOCAL;

  Surfs := [];
  IF 'IFCGEOMETRYRESOURCE.IFCPCURVE' IN TYPEOF (C) THEN
    Surfs := [C\IfcPCurve.BasisSurface];
  ELSE
    IF 'IFCGEOMETRYRESOURCE.IFCCOMPOSITECURVEONSURFACE' IN TYPEOF (C) THEN

    (* For an IfcCompositeCurveOnSurface the BasisSurface is the intersection
       of the BasisSurface of all the segments. *)

    N := SIZEOF(C\IfcCompositeCurve.Segments);
    Surfs := IfcGetBasisSurface(C\IfcCompositeCurve.Segments[1].ParentCurve);
    
      IF N > 1 THEN
        REPEAT i := 2 TO N;
          Surfs := Surfs * IfcGetBasisSurface(C\IfcCompositeCurve.Segments[1].ParentCurve);
        END_REPEAT;
      END_IF;
    END_IF;
  END_IF;
  RETURN(Surfs);
END_FUNCTION;


FUNCTION IfcListToArray
(Lis : LIST [0:?] OF GENERIC : T;
       Low,U : INTEGER) : ARRAY OF GENERIC : T;
   LOCAL
     N   : INTEGER;
     Res : ARRAY [Low:U] OF GENERIC : T;
   END_LOCAL;
      
   N := SIZEOF(Lis);
   IF (N <> (U-Low +1)) THEN
     RETURN(?);
   ELSE
     Res := [Lis[1] : N];
     REPEAT i := 2 TO N;
       Res[Low+i-1] := Lis[i];
     END_REPEAT;
     RETURN(Res);
   END_IF;
END_FUNCTION;


FUNCTION IfcLoopHeadToTail
(ALoop : IfcEdgeLoop) : LOGICAL;
   LOCAL
     N : INTEGER;
     P : LOGICAL := TRUE;
   END_LOCAL;
    
     N := SIZEOF (ALoop.EdgeList);
     REPEAT i := 2 TO N;
       P := P AND (ALoop.EdgeList[i-1].EdgeEnd :=:
                   ALoop.EdgeList[i].EdgeStart);
     END_REPEAT;    
     RETURN (P);
END_FUNCTION;


FUNCTION IfcMakeArrayOfArray
(Lis : LIST[1:?] OF LIST [1:?] OF GENERIC : T;
Low1, U1, Low2, U2 : INTEGER):
ARRAY [Low1:U1] OF ARRAY [Low2:U2] OF GENERIC : T;

  LOCAL
    Res : ARRAY[Low1:U1] OF ARRAY [Low2:U2] OF GENERIC : T;
  END_LOCAL;

  (* Check input dimensions for consistency *)
  IF (U1-Low1+1) <> SIZEOF(Lis) THEN
    RETURN (?);
  END_IF;
  IF (U2 - Low2 + 1 ) <> SIZEOF(Lis[1]) THEN
    RETURN (?) ;
  END_IF;

  (* Initialise Res with values from Lis[1] *)
  Res := [IfcListToArray(Lis[1], Low2, U2) : (U1-Low1 + 1)];
  REPEAT i := 2 TO HIINDEX(Lis);
    IF (U2-Low2+1) <> SIZEOF(Lis[i]) THEN
      RETURN (?);
    END_IF;
    Res[Low1+i-1] := IfcListToArray(Lis[i], Low2, U2);
  END_REPEAT;
  RETURN (Res);
END_FUNCTION;


FUNCTION IfcMlsTotalThickness
(LayerSet : IfcMaterialLayerSet) : IfcLengthMeasure;
  LOCAL
    Max : IfcLengthMeasure := LayerSet.MaterialLayers[1].LayerThickness;    
  END_LOCAL;

  IF SIZEOF(LayerSet.MaterialLayers) > 1 THEN
    REPEAT i := 2 TO HIINDEX(LayerSet.MaterialLayers);
       Max := Max + LayerSet.MaterialLayers[i].LayerThickness;
    END_REPEAT;
  END_IF;
  RETURN (Max);
END_FUNCTION;


FUNCTION IfcNormalise
  (Arg : IfcVectorOrDirection)
    : IfcVectorOrDirection;
LOCAL
  Ndim : INTEGER;
  V    : IfcDirection
         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]);
  Vec  : IfcVector
         := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (
            IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]), 1.);
  Mag  : REAL;
  Result : IfcVectorOrDirection
         := V;
END_LOCAL;

  IF NOT EXISTS (Arg) THEN
    RETURN (?);
  ELSE
    IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg) THEN
      BEGIN
        Ndim := Arg\IfcVector.Dim;
V.DirectionRatios := Arg\IfcVector.Orientation.DirectionRatios;
        Vec.Magnitude := Arg\IfcVector.Magnitude;
Vec.Orientation := V;
        IF Arg\IfcVector.Magnitude = 0.0 THEN
          RETURN(?);
        ELSE
          Vec.Magnitude := 1.0;
        END_IF;
      END;
    ELSE
      BEGIN
        Ndim := Arg\IfcDirection.Dim;
        V.DirectionRatios := Arg\IfcDirection.DirectionRatios;
      END;
    END_IF;

    Mag := 0.0;
      REPEAT i := 1 TO Ndim;
        Mag := Mag + V.DirectionRatios[i]*V.DirectionRatios[i];
      END_REPEAT;
    IF Mag > 0.0 THEN
      Mag := SQRT(Mag);
      REPEAT i := 1 TO Ndim;
        V.DirectionRatios[i] := V.DirectionRatios[i]/Mag;
      END_REPEAT;
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(arg) THEN
        Vec.Orientation := V;
        Result := Vec;
      ELSE
        Result := V;
      END_IF;
    ELSE
      RETURN(?);
    END_IF;
  END_IF;
  RETURN (Result);
END_FUNCTION;


FUNCTION IfcOrthogonalComplement
  (Vec : IfcDirection)
    : IfcDirection;
LOCAL
  Result : IfcDirection ;
END_LOCAL;
  IF NOT EXISTS (Vec) OR (Vec.Dim <> 2) THEN
    RETURN(?);
  ELSE
    Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([-Vec.DirectionRatios[2], Vec.DirectionRatios[1]]);
    RETURN(Result);
  END_IF;
END_FUNCTION;


FUNCTION IfcPathHeadToTail
(APath : IfcPath) : LOGICAL;
   LOCAL
     N : INTEGER := 0;
     P : LOGICAL := UNKNOWN;
   END_LOCAL;
     N := SIZEOF (APath.EdgeList);
   REPEAT i := 2 TO N;
      P := P AND (APath.EdgeList[i-1].EdgeEnd :=:
                  APath.EdgeList[i].EdgeStart);
   END_REPEAT;
   RETURN (P);
END_FUNCTION;


FUNCTION IfcPointListDim
(PointList : IfcCartesianPointList)
           : IfcDimensionCount;

  IF ('IFC4.IFCCARTESIANPOINTLIST2D' IN TYPEOF(PointList))
    THEN RETURN(2);
  END_IF;    
  IF ('IFC4.IFCCARTESIANPOINTLIST3D' IN TYPEOF(PointList))
    THEN RETURN(3);
  END_IF;    
  RETURN (?);
END_FUNCTION;


FUNCTION IfcSameAxis2Placement
  (ap1, ap2 : IfcAxis2Placement; Epsilon : REAL)
  : LOGICAL ;

  RETURN (IfcSameDirection(ap1.P[1],ap2.P[1],Epsilon) AND
          IfcSameDirection(ap1.P[2],ap2.P[2],Epsilon) AND
          IfcSameCartesianPoint(ap1.Location,ap1.Location,Epsilon));
END_FUNCTION;


FUNCTION IfcSameCartesianPoint
(cp1, cp2 : IfcCartesianPoint; Epsilon : REAL)
: LOGICAL;
  
  LOCAL
    cp1x : REAL := cp1.Coordinates[1];
    cp1y : REAL := cp1.Coordinates[2];
    cp1z : REAL := 0;
    cp2x : REAL := cp2.Coordinates[1];
    cp2y : REAL := cp2.Coordinates[2];
    cp2z : REAL := 0;
  END_LOCAL;

  IF (SIZEOF(cp1.Coordinates) > 2) THEN
    cp1z := cp1.Coordinates[3];
  END_IF;

  IF (SIZEOF(cp2.Coordinates) > 2) THEN
    cp2z := cp2.Coordinates[3];
  END_IF;

  RETURN (IfcSameValue(cp1x,cp2x,Epsilon) AND
          IfcSameValue(cp1y,cp2y,Epsilon) AND
          IfcSameValue(cp1z,cp2z,Epsilon));
END_FUNCTION;


FUNCTION IfcSameDirection
(dir1, dir2 : IfcDirection; Epsilon : REAL)
: LOGICAL;
  LOCAL
    dir1x : REAL := dir1.DirectionRatios[1];
    dir1y : REAL := dir1.DirectionRatios[2];
    dir1z : REAL := 0;
    dir2x : REAL := dir2.DirectionRatios[1];
    dir2y : REAL := dir2.DirectionRatios[2];
    dir2z : REAL := 0;
  END_LOCAL;

  IF (SIZEOF(dir1.DirectionRatios) > 2) THEN
    dir1z := dir1.DirectionRatios[3];
  END_IF;

  IF (SIZEOF(dir2.DirectionRatios) > 2) THEN
    dir2z := dir2.DirectionRatios[3];
  END_IF;
  
  RETURN (IfcSameValue(dir1x,dir2x,Epsilon) AND
          IfcSameValue(dir1y,dir2y,Epsilon) AND
          IfcSameValue(dir1z,dir2z,Epsilon));

END_FUNCTION;


FUNCTION IfcSameValidPrecision
   (Epsilon1, Epsilon2 : REAL) : LOGICAL ;
  LOCAL
    ValidEps1, ValidEps2 : REAL;
    DefaultEps           : REAL := 0.000001;
    DerivationOfEps      : REAL := 1.001;
    UpperEps             : REAL := 1.0;
  END_LOCAL;
  
    ValidEps1 := NVL(Epsilon1, DefaultEps);
    ValidEps2 := NVL(Epsilon2, DefaultEps);
    RETURN ((0.0 < ValidEps1) AND (ValidEps1 <= (DerivationOfEps * ValidEps2)) AND
            (ValidEps2 <= (DerivationOfEps * ValidEps1)) AND (ValidEps2 < UpperEps));

END_FUNCTION;


FUNCTION IfcSameValue
(Value1, Value2 : REAL; Epsilon : REAL)
: LOGICAL;
  LOCAL
    ValidEps    : REAL;
    DefaultEps  : REAL := 0.000001;
  END_LOCAL;
  
  ValidEps := NVL(Epsilon, DefaultEps);
  RETURN ((Value1 + ValidEps > Value2) AND (Value1 < Value2 + ValidEps));
END_FUNCTION;


FUNCTION IfcScalarTimesVector
  (Scalar : REAL; Vec : IfcVectorOrDirection)
    : IfcVector;
LOCAL
  V : IfcDirection;
  Mag : REAL;
  Result : IfcVector;
END_LOCAL;

  IF NOT EXISTS (Scalar) OR NOT EXISTS (Vec) THEN
    RETURN (?) ;
  ELSE
    IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF (Vec) THEN
      V := Vec\IfcVector.Orientation;
      Mag := Scalar * Vec\IfcVector.Magnitude;
    ELSE
      V := Vec;
      Mag := Scalar;
    END_IF;
    IF (Mag < 0.0 ) THEN
      REPEAT i := 1 TO SIZEOF(V.DirectionRatios);
        V.DirectionRatios[i] := -V.DirectionRatios[i];
      END_REPEAT;
      Mag := -Mag;
    END_IF;
    Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector(IfcNormalise(V), Mag);
  END_IF;
  RETURN (Result);
END_FUNCTION;


FUNCTION IfcSecondProjAxis
  (ZAxis, XAxis, Arg: IfcDirection)
    : IfcDirection;
LOCAL
  YAxis : IfcVector;
  V     : IfcDirection;
  Temp  : IfcVector;
END_LOCAL;

  IF NOT EXISTS(Arg) THEN
    V := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0,1.0,0.0]);
  ELSE
    V := Arg;
  END_IF;
  Temp  := IfcScalarTimesVector(IfcDotProduct(V, ZAxis), ZAxis);
  YAxis := IfcVectorDifference(V, Temp);
  Temp  := IfcScalarTimesVector(IfcDotProduct(V, XAxis), XAxis);
  YAxis := IfcVectorDifference(YAxis, Temp);
  YAxis := IfcNormalise(YAxis);
  RETURN(YAxis.Orientation);
END_FUNCTION;


FUNCTION IfcShapeRepresentationTypes
(RepType : IfcLabel; Items : SET OF IfcRepresentationItem) : LOGICAL;
    
    LOCAL
      Count : INTEGER := 0;
    END_LOCAL;

    CASE RepType OF
    'Point' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCPOINT' IN TYPEOF(temp))));
      END;

    'PointCloud' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCCARTESIANPOINTLIST3D' IN TYPEOF(temp))));
      END;

    'Curve' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCCURVE' IN TYPEOF(temp))));
      END;

    'Curve2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCCURVE' IN TYPEOF(temp))
                 AND (temp\IfcCurve.Dim = 2)));
      END;

    'Curve3D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCCURVE' IN TYPEOF(temp))
                 AND (temp\IfcCurve.Dim = 3)));
      END;

    'Surface' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCSURFACE' IN TYPEOF(temp))));
      END;

    'Surface2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCSURFACE' IN TYPEOF(temp))
                 AND (temp\IfcSurface.Dim = 2)));
      END;

    'Surface3D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCSURFACE' IN TYPEOF(temp))
                 AND (temp\IfcSurface.Dim = 3)));
      END;

    'FillArea' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCANNOTATIONFILLAREA' IN TYPEOF(temp))));
      END;

    'Text' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCTEXTLITERAL' IN TYPEOF(temp))));
      END;

    'AdvancedSurface' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | 'IFCGEOMETRYRESOURCE.IFCBSPLINESURFACE' IN TYPEOF(temp)));
      END;

    'Annotation2D' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (
                  SIZEOF(TYPEOF(temp) * [
                   'IFCGEOMETRYRESOURCE.IFCPOINT',
                   'IFCGEOMETRYRESOURCE.IFCCURVE',
                   'IFCGEOMETRICMODELRESOURCE.IFCGEOMETRICCURVESET',
                   'IFCPRESENTATIONDEFINITIONRESOURCE.IFCANNOTATIONFILLAREA',
                   'IFCPRESENTATIONDEFINITIONRESOURCE.IFCTEXTLITERAL']) = 1)
                 ));
      END;

    'GeometricSet' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCGEOMETRICSET' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IFCPOINT' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IFCCURVE' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IFCSURFACE' IN TYPEOF(temp))));
      END;

    'GeometricCurveSet' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCGEOMETRICCURVESET' IN TYPEOF(temp))
                 OR ('IFCGEOMETRICMODELRESOURCE.IFCGEOMETRICSET' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IFCPOINT' IN TYPEOF(temp))
                 OR ('IFCGEOMETRYRESOURCE.IFCCURVE' IN TYPEOF(temp))));
         REPEAT i:=1 TO HIINDEX(Items);  
           IF ('IFCGEOMETRYRESOURCE.IFCGEOMETRICSET' IN TYPEOF(Items[i]))
           THEN
             IF (SIZEOF(QUERY(temp <* Items[i]\IfcGeometricSet.Elements | 'IFCGEOMETRYRESOURCE.IFCSURFACE' IN TYPEOF(temp))) > 0)
             THEN
               Count := Count - 1;
             END_IF;
           END_IF;
         END_REPEAT;
      END;

    'Tessellation' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | 'IFCGEOMETRICMODELRESOURCE.IFCTESSELLATEDITEM' IN TYPEOF(temp)));
      END;

    'SurfaceOrSolidModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCTESSELLATEDITEM',
                   'IFCGEOMETRICMODELRESOURCE.IFCSHELLBASEDSURFACEMODEL',
                   'IFCGEOMETRICMODELRESOURCE.IFCFACEBASEDSURFACEMODEL',
                   'IFCGEOMETRICMODELRESOURCE.IFCSOLIDMODEL'] * TYPEOF(temp)) >= 1
                 ));      
      END;

    'SurfaceModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCTESSELLATEDITEM',
                   'IFCGEOMETRICMODELRESOURCE.IFCSHELLBASEDSURFACEMODEL',
                   'IFCGEOMETRICMODELRESOURCE.IFCFACEBASEDSURFACEMODEL'] * TYPEOF(temp)) >= 1
                 ));      
      END;

    'SolidModel' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCSOLIDMODEL' IN TYPEOF(temp))));            
      END;

    'SweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | (SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCEXTRUDEDAREASOLID',
                   'IFCGEOMETRICMODELRESOURCE.IFCREVOLVEDAREASOLID'] * TYPEOF(temp)) >= 1
                   ) AND (SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCEXTRUDEDAREASOLIDTAPERED',
                   'IFCGEOMETRICMODELRESOURCE.IFCREVOLVEDAREASOLIDTAPERED'] * TYPEOF(temp)) = 0
                   )
                 ));                            
      END;

    'AdvancedSweptSolid' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCSWEPTAREASOLID',
                   'IFCGEOMETRICMODELRESOURCE.IFCSWEPTDISKSOLID'] *  TYPEOF(temp)) >= 1
                 ));      
      END;

    'CSG' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCBOOLEANRESULT',
                   'IFCGEOMETRICMODELRESOURCE.IFCCSGPRIMITIVE3D',
                   'IFCGEOMETRICMODELRESOURCE.IFCCSGSOLID'] *  TYPEOF(temp)) >= 1
                 ));            
      END;

    'Clipping' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | SIZEOF([
                   'IFCGEOMETRICMODELRESOURCE.IFCCSGSOLID',
                   'IFCGEOMETRICMODELRESOURCE.IFCBOOLEANCLIPPINGRESULT'] * TYPEOF(temp)) >= 1
                 ));
      END;

    'Brep' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCFACETEDBREP' IN TYPEOF(temp))));      
      END;

    'AdvancedBrep' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCMANIFOLDSOLIDBREP' IN TYPEOF(temp))));      
      END;

    'BoundingBox' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCBOUNDINGBOX' IN TYPEOF(temp))));
        IF (SIZEOF(Items) > 1)
        THEN
          Count := 0;
        END_IF;   
      END;

    'SectionedSpine' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRICMODELRESOURCE.IFCSECTIONEDSPINE' IN TYPEOF(temp))));      
      END;

    'LightSource' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCPRESENTATIONORGANIZATIONRESOURCE.IFCLIGHTSOURCE' IN TYPEOF(temp))));      
      END;

    'MappedRepresentation' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items | ('IFCGEOMETRYRESOURCE.IFCMAPPEDITEM' IN TYPEOF(temp))));  
      END;

     OTHERWISE : RETURN(?);
    END_CASE;
    RETURN (Count = SIZEOF(Items));
END_FUNCTION;


FUNCTION IfcSurfaceWeightsPositive
( B: IfcRationalBSplineSurfaceWithKnots)
: BOOLEAN;

  LOCAL
    Result : BOOLEAN := TRUE;
  END_LOCAL;

  REPEAT i := 0 TO B\IfcBSplineSurface.UUpper;
    REPEAT j := 0 TO B\IfcBSplineSurface.VUpper;
      IF (B.Weights[i][j] <= 0.0) THEN
        Result := FALSE;
        RETURN(Result);
      END_IF;
    END_REPEAT;
  END_REPEAT;
  RETURN(Result);
END_FUNCTION;


FUNCTION IfcTaperedSweptAreaProfiles
(StartArea, EndArea : IfcProfileDef)
: LOGICAL;

LOCAL
   Result : LOGICAL := FALSE;
END_LOCAL;
   
IF ('IFCPROFILERESOURCE.IFCPARAMETERIZEDPROFILEDEF' IN TYPEOF(StartArea)) THEN
   IF ('IFCPROFILERESOURCE.IFCDERIVEDPROFILEDEF' IN TYPEOF(EndArea)) THEN
      Result := (StartArea :=: EndArea\IfcDerivedProfileDef.ParentProfile);
   ELSE
      Result := (TYPEOF(StartArea) = TYPEOF(EndArea));
   END_IF;
ELSE
   IF ('IFCPROFILERESOURCE.IFCDERIVEDPROFILEDEF' IN TYPEOF(EndArea)) THEN
      Result := (StartArea :=: EndArea\IfcDerivedProfileDef.ParentProfile);
   ELSE
      Result := FALSE;
   END_IF;
END_IF;

RETURN(Result);
END_FUNCTION;


FUNCTION IfcTopologyRepresentationTypes
(RepType : IfcLabel; Items : SET OF IfcRepresentationItem) : LOGICAL;
    
    LOCAL
      Count : INTEGER := 0;
    END_LOCAL;

    CASE RepType OF
    'Vertex' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items |
                  ('IFCTOPOLOGYRESOURCE.IFCVERTEX' IN TYPEOF(temp))));
      END;
    'Edge' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items |
                  ('IFCTOPOLOGYRESOURCE.IFCEDGE' IN TYPEOF(temp))));
      END;
    'Path' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items |
                  ('IFCTOPOLOGYRESOURCE.IFCPATH' IN TYPEOF(temp))));
      END;
    'Face' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items |
                  ('IFCTOPOLOGYRESOURCE.IFCFACE' IN TYPEOF(temp))));
      END;
    'Shell' :
      BEGIN
        Count := SIZEOF(QUERY(temp <* Items |
                  ('IFCTOPOLOGYRESOURCE.IFCOPENSHELL' IN TYPEOF(temp))
                    OR ('IFCTOPOLOGYRESOURCE.IFCCLOSEDSHELL' IN TYPEOF(temp))));
      END;
    'Undefined': RETURN(TRUE);
     OTHERWISE : RETURN(?);
    END_CASE;
    RETURN (Count = SIZEOF(Items));
END_FUNCTION;


FUNCTION IfcUniqueDefinitionNames
(Relations : SET [1:?] OF IfcRelDefinesByProperties)
:LOGICAL;

LOCAL
  Definition : IfcPropertySetDefinitionSelect;
  DefinitionSet : IfcPropertySetDefinitionSet;
  Properties : SET OF IfcPropertySetDefinition := [];
  Result : LOGICAL;
END_LOCAL;

IF SIZEOF(Relations) = 0 THEN
  RETURN(TRUE);
END_IF;

REPEAT i:=1 TO HIINDEX(Relations);
  Definition := Relations[i].RelatingPropertyDefinition;
  IF 'IFC4.IFCPROPERTYSETDEFINITION' IN TYPEOF(Definition) THEN
    Properties := Properties + Definition;
  ELSE
    IF 'IFC4.IFCPROPERTYSETDEFINITIONSET' IN TYPEOF(Definition) THEN
      BEGIN
        DefinitionSet := Definition;
        REPEAT j:= 1 TO HIINDEX(DefinitionSet);
          Properties := Properties + DefinitionSet[j];
        END_REPEAT;
      END;
END_IF;
  END_IF;
END_REPEAT;

Result := IfcUniquePropertySetNames(Properties);
RETURN (Result);
END_FUNCTION;


FUNCTION IfcUniquePropertyName
(Properties : SET [1:?] OF IfcProperty)
:LOGICAL;

LOCAL
   Names : SET OF IfcIdentifier := [];
END_LOCAL;

REPEAT i:=1 TO HIINDEX(Properties);
   Names := Names + Properties[i].Name;
END_REPEAT;

RETURN (SIZEOF(Names) = SIZEOF(Properties));   

END_FUNCTION;


FUNCTION IfcUniquePropertySetNames
(Properties : SET [1:?] OF IfcPropertySetDefinition)
:LOGICAL;

LOCAL
  Names : SET OF IfcLabel := [];
  Unnamed : INTEGER := 0;
END_LOCAL;

REPEAT i:=1 TO HIINDEX(Properties);
  IF 'IFC4.IFCPROPERTYSET' IN TYPEOF(Properties[i]) THEN
    Names := Names + Properties[i]\IfcRoot.Name;
  ELSE
    Unnamed := Unnamed + 1;
  END_IF;
END_REPEAT;

RETURN (SIZEOF(Names) + Unnamed = SIZEOF(Properties));
END_FUNCTION;


FUNCTION IfcUniquePropertyTemplateNames
(Properties : SET [1:?] OF IfcPropertyTemplate)
:LOGICAL;

LOCAL
  Names : SET OF IfcLabel := [];
END_LOCAL;

REPEAT i:=1 TO HIINDEX(Properties);
  Names := Names + Properties[i].Name;
END_REPEAT;
RETURN (SIZEOF(Names) = SIZEOF(Properties));
END_FUNCTION;


FUNCTION IfcUniqueQuantityNames
(Properties : SET [1:?] OF IfcPhysicalQuantity)
:LOGICAL;

LOCAL
  Names : SET OF IfcLabel := [];
END_LOCAL;

REPEAT i:=1 TO HIINDEX(Properties);
  Names := Names + Properties[i].Name;
END_REPEAT;
RETURN (SIZEOF(Names) = SIZEOF(Properties));
END_FUNCTION;


FUNCTION IfcVectorDifference
  (Arg1, Arg2 : IfcVectorOrDirection)
    : IfcVector;
LOCAL
  Result : IfcVector;
  Res, Vec1, Vec2 : IfcDirection;
  Mag, Mag1, Mag2 : REAL;
  Ndim : INTEGER;
END_LOCAL;

  IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
    RETURN (?) ;
  ELSE
    BEGIN
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg1) THEN
        Mag1 := Arg1\IfcVector.Magnitude;
        Vec1 := Arg1\IfcVector.Orientation;
      ELSE
        Mag1 := 1.0;
        Vec1 := Arg1;
      END_IF;
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg2) THEN
        Mag2 := Arg2\IfcVector.Magnitude;
        Vec2 := Arg2\IfcVector.Orientation;
      ELSE
        Mag2 := 1.0;
        Vec2 := Arg2;
      END_IF;
      Vec1 := IfcNormalise (Vec1);
      Vec2 := IfcNormalise (Vec2);
      Ndim := SIZEOF(Vec1.DirectionRatios);
      Mag  := 0.0;
      Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);

      REPEAT i := 1 TO Ndim;
        Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] - Mag2*Vec2.DirectionRatios[i];
        Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
      END_REPEAT;

      IF (Mag > 0.0 ) THEN
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
      ELSE
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
      END_IF;
    END;
  END_IF;
  RETURN (Result);
END_FUNCTION;


FUNCTION IfcVectorSum
  (Arg1, Arg2 : IfcVectorOrDirection)
    : IfcVector;
LOCAL
  Result : IfcVector;
  Res, Vec1, Vec2 : IfcDirection;
  Mag, Mag1, Mag2 : REAL;
  Ndim : INTEGER;
END_LOCAL;

  IF ((NOT EXISTS (Arg1)) OR (NOT EXISTS (Arg2))) OR (Arg1.Dim <> Arg2.Dim) THEN
    RETURN (?) ;
  ELSE
    BEGIN
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg1) THEN
        Mag1 := Arg1\IfcVector.Magnitude;
        Vec1 := Arg1\IfcVector.Orientation;
      ELSE
        Mag1 := 1.0;
        Vec1 := Arg1;
      END_IF;
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg2) THEN
        Mag2 := Arg2\IfcVector.Magnitude;
        Vec2 := Arg2\IfcVector.Orientation;
      ELSE
        Mag2 := 1.0;
        Vec2 := Arg2;
      END_IF;
      Vec1 := IfcNormalise (Vec1);
      Vec2 := IfcNormalise (Vec2);
      Ndim := SIZEOF(Vec1.DirectionRatios);
      Mag  := 0.0;
      Res  := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([0.0:Ndim]);

      REPEAT i := 1 TO Ndim;
        Res.DirectionRatios[i] := Mag1*Vec1.DirectionRatios[i] + Mag2*Vec2.DirectionRatios[i];
        Mag := Mag + (Res.DirectionRatios[i]*Res.DirectionRatios[i]);
      END_REPEAT;

      IF (Mag > 0.0 ) THEN
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Res, SQRT(Mag));
      ELSE
        Result := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector( Vec1, 0.0);
      END_IF;
    END;
  END_IF;
  RETURN (Result);
END_FUNCTION;


RULE IfcRepresentationContextSameWCS FOR ( IfcGeometricRepresentationContext );
LOCAL
  IsDifferent  : LOGICAL := FALSE;
END_LOCAL;
  IF (SIZEOF(IfcGeometricRepresentationContext) > 1)
  THEN
    REPEAT i := 2 TO HIINDEX(IfcGeometricRepresentationContext);
      IF (IfcGeometricRepresentationContext[1].WorldCoordinateSystem :<>: IfcGeometricRepresentationContext[i].WorldCoordinateSystem)
      THEN
        IsDifferent := (NOT(IfcSameValidPrecision(IfcGeometricRepresentationContext[1].Precision,
                                                  IfcGeometricRepresentationContext[i].Precision)))
                    OR (NOT(IfcSameAxis2Placement(IfcGeometricRepresentationContext[1].WorldCoordinateSystem,
                                                  IfcGeometricRepresentationContext[i].WorldCoordinateSystem,
                                                  IfcGeometricRepresentationContext[1].Precision)));
        IF (IsDifferent = TRUE) THEN
          ESCAPE;
        END_IF;
      END_IF;
    END_REPEAT;
  END_IF;
    WHERE
     WR1 : IsDifferent = FALSE
END_RULE;


RULE IfcSingleProjectInstance FOR ( IfcProject );
    WHERE
     WR1 : SIZEOF(IfcProject) <= 1
END_RULE;


END_SCHEMA;