import ifctester import ifctester.ids import ifcopenshell #x = ifctester.ids.open('/home/dion/ids.xml') #x = ifctester.ids.open('/home/dion/IDS_ArcDox.xml') # fmt: off # pylint: skip-file specs = ifctester.ids.Ids( title="Minimum digital delivery requirements", copyright="Lendlease 2022", version="0.0.1", description="These requirements are part of minimum digital quality standards required by Lendlease.", author="dion.moult@lendlease.com", date="2022-01-01", purpose="Minimum Requirements", ) ##### ##### spec = ifctester.ids.Specification(name="Project metadata", ifcVersion=["IFC2X3", "IFC4"], identifier="MR.1", description="For client submittal, project archival, benchmarking, and identification of projects in databases and directories, all deliverables must contain basic identification and categorisation information.", instructions="The project manager shall determine the project metadata at the start of the project. All deliverables are to include this metadata exactly as specified.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCPROJECT")) spec.requirements.append(ifctester.ids.Attribute(name="Name", value="PROJECT_CODE", instructions="The project manager shall confirm the short project code with the client based on their real estate portfolio naming scheme.")) spec.requirements.append(ifctester.ids.Attribute(name="LongName", value="PROJECT_LONGNAME", instructions="The project manager shall confirm the full project name as specified on contractual documents.")) spec.requirements.append(ifctester.ids.Attribute(name="Description", value="PROJECT_DESCRIPTION", instructions="The description shall provide a one sentence summary of the project.")) restriction = ifctester.ids.Restriction(options={"enumeration": ["Residential", "Commercial", "Health", "Defence", "Education", "Scitech", "Transport", "Civic", "Mixed"]}) spec.requirements.append(ifctester.ids.Attribute(name="ObjectType", value=restriction)) restriction = ifctester.ids.Restriction(options={"enumeration": ["Planning", "Design", "Construction", "Commissioning", "Handover"]}) spec.requirements.append(ifctester.ids.Attribute(name="Phase", value=restriction)) ##### ##### spec = ifctester.ids.Specification(name="Coordinate reference systems", ifcVersion=["IFC4"], description="To prevent errors during surveying, setout, model federation, and to ensure that projects can be confidently reused in the future or displayed on GIS systems, the coordinate system must be specified.", instructions="The surveyor is responsible for nominating an appropriate coordinate reference system. All disciplines are responsible for ensuring their models match the nominated coordinate data.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCPROJECTEDCRS")) spec.requirements.append(ifctester.ids.Attribute( name="Name", value="EPSG:28356", instructions="The code must match the EPSG registry code")) spec.requirements.append(ifctester.ids.Attribute( name="VerticalDatum", value="EPSG:5711", instructions="Where the projected CRS WKT does not nominate the vertical datum, the vertical datum code must also be provided from the EPSG registry.")) ##### ##### spec = ifctester.ids.Specification(name="Local engineering coordinates", ifcVersion=["IFC4"], description="For vertical construction projects, only the surveyor and civil engineer will be permitted to submit models using map coordinates, where the distance between points on the design are measured using map distances. All other disciplines should provide models using local engineering coordinates, where the distance between points on the design are measured using surface distances. To ensure map and surface distances are not erroneously mixed, to make it easy to shift coordinates should surveying errors occur, and also to ensure that geometry can be displayed in any 3D system, small local engineering coordinates must be used, with a conversion to map coordinates.", instructions="The architect is responsible for nominating a local project origin, which must be at a surveyed point. The surveyor is responsible for determining the helmert transformation from local engineering coordinates to map coordinates. All other disciplines must follow suit and include the map conversion data.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCMAPCONVERSION")) spec.requirements.append(ifctester.ids.Attribute(name="Eastings", value="123456789", instructions="The eastings to offset the origin by, provided in project length units.")) spec.requirements.append(ifctester.ids.Attribute(name="Northings", value="12345679", instructions="The northings to offset the origin by, provided in project length units.")) spec.requirements.append(ifctester.ids.Attribute(name="OrthogonalHeight", value="0", instructions="The orthogonal height must always be zero, such that the local engineering Z height matches the Australian Height Datum level.")) spec.requirements.append(ifctester.ids.Attribute(name="XAxisAbscissa", value="1", instructions="All models must have the positive Y axis as project north. The X axis abscissa and ordinate will determine the rotation from project to grid north.")) spec.requirements.append(ifctester.ids.Attribute(name="XAxisOrdinate", value="0", instructions="All models must have the positive Y axis as project north. The X axis abscissa and ordinate will determine the rotation from project to grid north.")) spec.requirements.append(ifctester.ids.Attribute(name="Scale", value="1", instructions="The combined scale factor provided as an approximated constant for the extents of the site, such that the scale can convert the design in surface distances to grid distances.")) ##### ##### spec = ifctester.ids.Specification(name="Grid axes", ifcVersion=["IFC4"], description="Setout and grids are typically rarely changed. To help reconcile coordinate inconsistencies and minimise the risk of unintended changes to grids, a setout model must be provided separately to discipline models. This model shall contain only grids and site boundaries and other surveyed landmarks. Where there are multiple grids, they must be logically named.", instructions="The architect is responsible for providing this model.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCGRIDAXIS")) restriction = ifctester.ids.Restriction(options={"pattern": "[A-Z0-9][A-Z0-9]?"}) spec.requirements.append(ifctester.ids.Attribute(name="AxisTag", value=restriction, instructions="The grids shall be named following the naming scheme of A, B, C, 1, 2, 3, etc.")) ##### ##### spec = ifctester.ids.Specification(name="Site naming", ifcVersion=["IFC4"], description="Sites must be named consistently throughout all models so that sites can be identified. All models must have only one site with a consistent name as a requirement for facility management deliverables such as COBie and integration into building management systems. Site naming is also a requirement for future data lookups when the project is archived or submitted to the client.", instructions="The architect is responsible for providing site names. Site short names and full names must be agreed by the client based on their real estate portfolio, and if the site is broken up into subzones. Where no site naming exists, the site name shall match the address as specified on contracts. All drawings, schedules, and other documents must also use these names exactly such that a plaintext search will yield correct results.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCSITE")) spec.requirements.append(ifctester.ids.Attribute(name="Name", value="123 Foo St")) ##### ##### spec = ifctester.ids.Specification(name="Building naming", ifcVersion=["IFC4"], description="Buildings must be named consistently throughout all models so that buildings can be identified. All models must have only one building with a consistent name as a requirement for facility management deliverables such as COBie and integration into building management systems. Building naming is also a requirement for future data lookups when the project is archived or submitted to the client.", instructions="The architect is responsible for providing building names. Building short names and full names must be agreed by the client based on their real estate portfolio and naming scheme for the site, compount, campus, defence base, or other building collection. All drawings, schedules, and other documents must also use these names exactly such that a plaintext search will yield correct results.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCBUILDING")) spec.requirements.append(ifctester.ids.Attribute(name="Name", value="B01")) spec.requirements.append(ifctester.ids.Attribute(name="LongName", value="Building 01")) ##### ##### spec = ifctester.ids.Specification(name="Building storey naming", ifcVersion=["IFC4"], description="Building storeys must be named consistently throughout all models so that models can be federated and storeys consistently identified. The ability to federate based on storey naming is a requirement for facility management deliverables such as COBie and integration into building management systems. To a lesser extent, proper naming of storeys makes it possible for consistent grouping of clashes, filtering of models during coordination, or identifiying locations on drawings and schedules.", instructions="The architect is responsible for providing storeys and storey names. All other disciplines must follow these names. No fake storeys or storeys for the purposes of modeling software limitations are allowed to be submitted. All drawings, schedules, and other documents must also use these names exactly such that a plaintext search will yield correct results.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCBUILDINGSTOREY")) restriction = ifctester.ids.Restriction(options={"pattern": "((B|L)[0-9]{2}|G|LG|UG)"}) spec.requirements.append(ifctester.ids.Attribute(name="Name", value=restriction, instructions="Valid examples include G, LG, UG, B01, B02, L01, L02, and L12.")) restriction = ifctester.ids.Restriction(options={"pattern": "((BASEMENT|LEVEL) [0-9]{2}|GROUND|UPPER GROUND|LOWER GROUND)"}) spec.requirements.append(ifctester.ids.Attribute(name="LongName", value=restriction, instructions="Valid examples include GROUND, LOWER GROUND, UPPER GROUND, BASEMENT 01, BASEMENT 02, LEVEL 01, LEVEL 02, and LEVEL 12.")) ##### ##### spec = ifctester.ids.Specification(name="Building geocoding", ifcVersion=["IFC4"], description="Geocoding information must be provided for buildings to integrate into real estate portfolio databases or GIS systems. Note that this is not a requirement for facility management deliverables.", instructions="Architects are responsible for providing geocoding data to be confirmed by the surveyor and client. All other documents must also use these names exactly such that a plaintext search will yield correct results.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCBUILDING")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_Address", name="AddressLines", value="123 Foo St", datatype="IfcLabel")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_Address", name="Town", value="Sydney", datatype="IfcLabel")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_Address", name="Region", value="NSW", datatype="IfcLabel")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_Address", name="PostalCode", value="2000", datatype="IfcLabel")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_Address", name="Country", value="AU", datatype="IfcLabel")) ##### ##### spec = ifctester.ids.Specification(name="Building storey levels", ifcVersion=["IFC4"], description="Building storey levels must be provided clearly with no confusion between SSL and FFL. Explicit levels minimise the risk of confusion in reading drawings and also ensures that work and cost breakdowns can be sorted or generated.", instructions="The structural engineer is responsible for providing SSL data. The architect is responsible for providing FFL data. All levels are to be provided in project length units with consideration of the coordinate reference system. Where the level varies across a storey, the most prominent level may be shown. Levels on drawings, schedules, or other documents must be explicit in whether it is referencing an SSL or FFL.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCBUILDINGSTOREY")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_BuildingStoreyCommon", name="ElevationOfSSLRelative", datatype="IfcLengthMeasure")) spec.requirements.append(ifctester.ids.Property(propertySet="EPset_BuildingStoreyCommon", name="ElevationOfFFLRelative", datatype="IfcLengthMeasure")) spec = ifctester.ids.Specification(name="Space identification", ifcVersion=["IFC4"], description="Every space should have data to identify what and where it is", instructions="Architects are responsible for providing this information.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCSPACE")) spec.requirements.append(ifctester.ids.Attribute(name="Name")) spec.requirements.append(ifctester.ids.Property(propertySet="LL_SpaceIdentification", name="BuildingName", datatype="IfcLabel", instructions="This should match the name of the building as shown on drawings.")) spec.requirements.append(ifctester.ids.Property(propertySet="LL_SpaceIdentification", name="UnitName", datatype="IfcLabel")) restriction = ifctester.ids.Restriction(options={"enumeration": ["UNIT", "BALCONY", "PRIVATEOPENSPACE", "F&B", "SHOP", "KIOSK", "OFFICE", "CIVIC"]}) spec.requirements.append(ifctester.ids.Property(propertySet="LL_SpaceIdentification", name="OccupancySubType", value=restriction, datatype="IfcLabel")) spec = ifctester.ids.Specification(name="Space quantification", ifcVersion=["IFC4"], description="Every space should be quantified", instructions="Architects are responsible for providing this information.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCSPACE")) spec.requirements.append(ifctester.ids.Property(propertySet="Qto_SpaceBaseQuantities", name="GrossFloorArea", datatype="IfcAreaMeasure", instructions="Early stage feasibility areas should be gross areas and should include walls")) ##### ##### spec = ifctester.ids.Specification(name="Material categorisations", ifcVersion=["IFC4"], description="All materials must be assigned to a category so that the building model may be filtered by material. This filtering is necessary for life cycle analysis, costing, and automated CG visualisations.", instructions="All disciplines are responsible for ensuring that material categories are correct in their model, but typically this requirement applies to architectural and structural models only.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCMATERIAL")) restriction = ifctester.ids.Restriction(options={"enumeration": ["concrete", "steel", "aluminium", "block", "brick", "stone", "wood", "glass", "gypsum", "plastic", "earth", "other"]}) spec.requirements.append(ifctester.ids.Attribute(name="Category", value=restriction)) ##### ##### spec = ifctester.ids.Specification(name="Generic elements", ifcVersion=["IFC4"], description="All elements must be assigned to the most relevant IFC class for identification. No \"generic elements\" are allowed. This is a requirement for facility management deliverables such as COBie, almost all automated processes in coordination, costing, scheduling, energy analysis, etc, or determining whether other requirements apply to an element.", instructions="All disciplines are required to ensure their elements use the most appropriate IFC class.") specs.specifications.append(spec) spec.applicability.append(ifctester.ids.Entity(name="IFCBUILDINGELEMENTPROXYTYPE")) restriction = ifctester.ids.Restriction(options={"enumeration": ["PROVISIONFORVOID", "PROVISIONFORSPACE"]}) spec.requirements.append(ifctester.ids.Attribute(name="PredefinedType", value=restriction)) ##### ##### specs.to_xml("/home/dion/ids-minimal.ids")