├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── custom.yml ├── README.md ├── attribute-facet.md ├── classification-facet.md ├── developer-guide.md ├── entity-facet.md ├── ids-diagram.png ├── ids-logo.png ├── ids-metadata.md ├── ids-structure.png ├── material-facet.md ├── material-facet.png ├── restrictions.md ├── specifications.md ├── testcases-attribute.md ├── testcases-classification.md ├── testcases-entity.md └── testcases-material.md /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.yml: -------------------------------------------------------------------------------- 1 | name: Feature Request 2 | description: Suggest an idea for this project 3 | labels: 'Feature' 4 | body: 5 | - type: dropdown 6 | id: download 7 | attributes: 8 | label: How did you download the software? 9 | options: 10 | - Homebrew 11 | - MacPorts 12 | - apt-get 13 | - Built from source 14 | validations: 15 | required: true 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Information Delivery Specifications 2 | 3 | ![IDS Logo](ids-logo.png) 4 | 5 | **Information Delivery Specifications (IDS)** is a buildingSMART standard for specifying and checking simple information requirements from IFC models. It is designed as a free, lightweight, standardised approach to model checking. 6 | 7 | ## Introduction 8 | 9 | An IDS is a file format ending in `.ids` containing a list of information **Specifications**. For example, a single **Specification** might say that "_all walls must have a fire rating property_". Model authors receiving an IDS file can use it to ensure all required information is provided for each **Specification**. Model recipients may use the IDS file to check whether the IFC model meets all of the **Specifications**. Reports may also be generated to list the results of **Specification** compliance checks. 10 | 11 | ![IDS Diagram](ids-diagram.png) 12 | 13 | IDS file creation tools and model checking tools are provided by many [software vendors](https://technical.buildingsmart.org/resources/software-implementations/). You can write your own customised IDS **Specifications** from scratch or start from a [public IDS template](todo). Any IFC model produced from any software can be checked by an IDS file. 14 | 15 | ## Beginners tutorial 16 | 17 | 1. [Download and install your favourite software](https://technical.buildingsmart.org/resources/software-implementations/) that supports IDS from the software vendors directory. There is software available for Windows, Mac, and Linux. 18 | 2. [Download a sample IDS file](todo). This IDS file has two **Specifications**. The first specifies that _the project name should be TEST_. The second specifies that _all walls must have a fire rating property_. 19 | 3. [Download a sample IFC model to check](todo). This IFC model has "TEST" as the project name, which satisfies the first **Specification**. However, some walls have a fire rating property, and others do not. 20 | 4. Load both the IDS and the IFC in your software, and begin the checking process. 21 | 22 | That's it! You may also find more sample IDS templates in the [buildingSMART IDS Template Directory](todo) and more sample IFC models in the [buildingSMART IFC model directory](todo). 23 | 24 | If you need help, please feel free to ask for help on the [buildingSMART Forums](https://forums.buildingsmart.org/). 25 | 26 | ## Begin learning about IDS 27 | 28 | 1. [How does a **Specification** work?](specifications.md) 29 | 1. [Guidelines on specifying good **Specification** metadata](ids-metadata.md) 30 | 1. [Learn how to specify **Complex Restrictions**](restrictions.md) 31 | 1. [Learn how to use the **Entity Facet**](entity-facet.md) 32 | 1. [Learn how to use the **Attribute Facet**](attribute-facet.md) 33 | 1. [Learn how to use the **Classification Facet**](classification-facet.md) 34 | 1. [Learn how to use the **Property Facet**](todo) 35 | 1. [Learn how to use the **Material Facet**](material-facet.md) 36 | 1. [Learn how to use the **Parts Facet**](todo) 37 | 1. [Are you a software developer? Read the developer guide!](developer-guide.md) 38 | -------------------------------------------------------------------------------- /attribute-facet.md: -------------------------------------------------------------------------------- 1 | # Attribute facet 2 | 3 | Every entity in an IFC model has a list of standardised **Atributes**. **Attributes** are a limited set of fundamental data (usually less than 10) associated with all IFC entities. These are fixed by the IFC standard and cannot be customised. 4 | 5 | Here are some common attributes and what they mean: 6 | 7 | - **GlobalId**: a unique ID for the element useful for computer geeks 8 | - **Name**: a short name, code, number, or label to identify the object for a human. If you had to annotate the object on a drawing or a schedule, the Name is what you should see. For example, a pump Name might be P-10-A. 9 | - **Description**: typically the longer form of the name, written to be descriptive and readable for humans. For example a pump Description might be Water Suction Pump. 10 | - **Tag**: this is an ID that may link it back to another BIM application. For example if the IFC model was produced using Revit or ArchiCAD, it might hold the Revit or ArchiCAD element ID. 11 | 12 | Information that is not critical to the definition of the IFC entity is stored as a **Property**, not an **Attribute**. For more information view the documentation on the [**Property Facet**](property-facet.md). 13 | 14 | For this reason, **Attributes** are a good way to specify an **Applicability** to specific elements, or specify a **Requirement** that certain elements shall be identified, named, or described in a particular way. 15 | 16 | To see what **Attributes** are available for an IFC class and what their potential values may be, you will need to check the IFC documentation. Here is how you might find a list of valid **Attributes** for the IFC4X3 schema. The instructions will be similar for all IFC versions. 17 | 18 | 1. Browse to the documentation page for the IFC class you are specifying. For example, [this is the IfcWall documentation page](http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWall.htm). 19 | 2. Scroll down to the **Attributes** section of the documentation. Note that by default, not all attributes are shown. Press "_Click to show hidden inherited attributes_" to show all attributes. For IFC4, click on the "_Attribute inheritance_" text header to toggle a table for all attributes. 20 | 3. The **Attributes** table will show the **Name** of each **Attribute**. Note that **Attributes** which do not have a number next to them and are in italics are not allowed to be specified. Only enumerated **Attributes** may be specified. For example, you may specify the **Name** attribute for an IfcWall, but you may not specify **ConnectedTo**. 21 | 22 | Instead of checking the documentation, your IDS authoring software may help you to shortlist valid **Attributes**. 23 | 24 | Following naming conventions and accurately describing elements are critical to many usecases in the AECO industry. For this reason, it is very common to use the **Attribute Facet** in both the **Applicability** and **Requirements** section of **Specifications**. 25 | 26 | ## Parameters 27 | 28 | Parameter | Required | Restrictions Allowed | Allowed Values | Meaning 29 | --- | --- | --- | --- | --- 30 | **Name** | ✔️ | ✔️ | A valid attribute name from the IFC schema. | The attribute must exist and have a non-empty value. 31 | **Value** | ❌ | ✔️ | Any value appropriate to the data type of the attribute | The value of the attribute must match exactly. To specify numbers, you must use a dot as the decimal separator, and not use a thousands separator (e.g. `4.2` is valid, but `1.234,5` is invalid). Scientific notation is allowed (e.g. `1e3` to represent `1000`). To specify true or false, you must specify `TRUE` or `FALSE` as uppercase characters. 32 | 33 | ## Examples 34 | 35 | Applicability Intention | Requirement Intention | Facet Definition 36 | --- | --- | --- 37 | Any entity with a Name of "ABC123" | The entity (e.g. Project) must be named "ABC123" | Name="Name", value="ABC123" 38 | Any entity (but typically IfcMapConversion) with an Easting of 312345 | The entity (e.g. IfcMapConversion) must be geolocated such that the origin is at the Easting of 312345 | Name="Easting", value="312345" 39 | Any entity with a name starting with "WT" followed by 2 digits, such as WT01, WT02, etc. | The element must have the naming scheme of WT01, WT02, etc | Name="Name", Value="WT[0-9]{2}" 40 | Any entity with a non-empty Description | The entity must have a description | Name="Description" 41 | Any entity (typically an IfcTask) with a Status set to either "NOTSTARTED", "STARTED", or "COMPLETED" | The entity Status (e.g. for an IfcTask) must be filled out with either "NOTSTARTED", "STARTED", or "COMPLETED" | Name="Status", Value=["NOTSTARTED", "STARTED", "COMPLETED"] 42 | Any entity (typically an IfcTaskTime) with a DurationType set to WORKTIME (i.e. based on a calendar) | The duration type (e.g. for an IfcTaskTime) must be based on a calendar, not elapsed time | Name="DurationType", Value="WORKTIME" 43 | -------------------------------------------------------------------------------- /classification-facet.md: -------------------------------------------------------------------------------- 1 | # Classification facet 2 | 3 | A **Classification System** is a defined hierarchy to categorise elements. An example popular **System** is "Uniclass 2015". Within a **System**, there is a hierarchy of short **Reference** codes that categorise elements in increasing levels of specificity, such as "EF_25_10" and "EF_25_10_25". Any object in IFC model can have a **Classification Reference**. 4 | 5 | The **Classification Facet** is different to the **Entity Facet**. The **Entity Facet** is restricted to built-in IFC classes and predefined types, which may also function as a method of **Classification**. In contrast, a **System** specified in the **Classification Facet** refers to a third party, non-IFC **System**. 6 | 7 | IFC models keep track of **Classification** names, dates, versions, and other data to uniquely identify the **System**, and may even store the hierarchy of **References**. For this reason, **Classification** requirements should use the **Classification Facet**, as opposed to the **Property Facet**. 8 | 9 | **Classifications** are a great way to identify **Applicable** entities, or **Require** that entities should follow a nominated **Classification** system by a workflow, such as in an asset management system, work breakdown structure, or coordination requirement. 10 | 11 | ## Parameters 12 | 13 | Parameter | Required | Restrictions Allowed | Allowed Values | Meaning 14 | --- | --- | --- | --- | --- 15 | **System** | ❌ | ✔️ | The name of the **Classification System** | The element must be classified with a reference that is part of a classification system with this name 16 | **Value** | ❌ | ✔️ | The value of a **Refeference** code in the **Classification System** | The element must be classified with a **Reference** which has a code that matches this value. The value is typically a short code with a separating character that denotes the level of classification 17 | 18 | If no parameters are specified, then it means that any **Classification** should be present, regardless of **System** name or **Reference** code. 19 | 20 | ## Examples 21 | 22 | Applicability Intention | Requirement Intention | Facet Definition 23 | --- | --- | --- 24 | Any classified element | The entity must be classified | No parameters 25 | Any entity classified using OmniClass | The entity must be classified using OmniClass | System="OmniClass" 26 | Any entity classified with either OmniClass or Uniclass 2015 | The entity must be classified using either OmniClass or Uniclass 2015 | System=["OmniClass", "Uniclass 2015"] 27 | Any entity with a classification reference of "EF_25_10_25" | The element (e.g. a wall) must be classified using the reference "EF_25_10_25" | Value="EF_25_10_25" 28 | Any element with a Uniclass 2015 classification reference starting with EF_25_10 | The entity (e.g. a wall) must use Uniclass 2015 and have are reference starting with EF_25_10 | System="Uniclass 2015", Value="EF_25_10.*" 29 | -------------------------------------------------------------------------------- /developer-guide.md: -------------------------------------------------------------------------------- 1 | # Developer guide 2 | 3 | **Warning: IDS is not yet formally released.** 4 | 5 | An IDS file is simply an XML file, with its schema defined in XSD. You may open any existing IDS file and inspect its contents to get a feel for how an IDS is structured. 6 | 7 | An IDS is considered valid if it passes the XSD-based validation check. All sample IDS files available in the buildingSMART directory of public IDS templates are guaranteed to be valid. 8 | 9 | - [Download the latest IDS v0.6 XSD schema](https://github.com/buildingSMART/IDS/blob/master/Development/0.6/ids_06.xsd) 10 | - [Download sample IDS files from the directory of public IDS templates](todo) 11 | 12 | There are many freely available online tools and programming libraries that can perform XSD validation. Here is [one such XSD validation tool](https://www.liquid-technologies.com/online-xsd-validator) to save you an online search. 13 | 14 | ## Authoring IDS 15 | 16 | If you are writing software to read and author IDS files only, you **must** meet the following criteria: 17 | 18 | - All IDS software must read and write valid IDS files only. 19 | - No proprietary extensions are allowed. If auxiliary systems (e.g. additional loaded metadata) are used to augment IDS or the correlating IFC model, they should be made clear to the user that it is external to IDS. 20 | - No data loss shall occur. Loading an IDS and saving the IDS shall preserve all of its information. Minor syntax formatting changes are allowed, so long as the data remains unchanged. 21 | - Your software should pass all test cases in the [Authoring Testcases](todo) document. 22 | 23 | In addition, it is highly recommended to also provide the following features for users: 24 | 25 | - When users write an IFC class in an **Entity Facet**, your interface should restrict allowable values to valid IFC class names in the selected IFC schema for the specification. Autocompletion is recommended. 26 | - When users write a predefined type in an **Entity Facet**, your interface should recommend allowable values based on the nominated IFC class. However, it should still allow users to write a custom predefined type. Autocompletion is recommended. 27 | - When users have already specified an **Entity Facet** and are creating an **Attribute Facet**, your interface should restrict allowable values based on the nominated IFC class. Your interface should also guide the user to use the right data type based on the nominated attribute name. 28 | - When users have already specified an **Entity Facet** and are creating a **Property Facet**, your interface should recommend allowable property sets based on the nominated IFC class and predefined type. However, it should also allow users to write a custom property set name. If a standardised (e.g. `Pset_` or `Qto_`) property set is nominated, your interface should restrict the allowable property names and recommend the appropriate data type to be used. 29 | - You may also choose to preload standardised classification names for commonly known systems, as well as the classification references to prevent spelling errors. You may choose to use this [IFC directory for classification systems](https://github.com/Moult/ifcclassification). 30 | - When users are nominating a **Material Facet**, your interface should recommend the IFC recommended material categories (one of 'concrete', 'steel', 'aluminium', 'block', 'brick', 'stone', 'wood', 'glass', 'gypsum', 'plastic', or 'earth') 31 | 32 | ## Checking IDS against IFC 33 | 34 | Any software implementing IDS checking **must** comply with the following test suites. 35 | 36 | - Overall integration testscases (todo) 37 | - [Entity testcases](testcases-entity.md) 38 | - [Attribute testcases](testcases-attribute.md) 39 | - [Classification testcases](testcases-classification.md) 40 | - [Property testcases](testcases-property.md) 41 | - [Material testcases](testcases-material.md) 42 | - [Part testcases](testcases-parts.md) 43 | 44 | ## Generating reports from IDS results 45 | 46 | TODO: specify rules about BCF 47 | 48 | ## Handling IFC compatibility 49 | 50 | If the software is not capable of parsing the specified IFC version nominated by the IDS specification, then the user should be made aware of the limitation. 51 | 52 | ## Handling different IDS versions 53 | 54 | IDS is not yet formally released and so there is no guarantee of vendor support for any IDS version. 55 | 56 | ## Available developer libraries 57 | 58 | To help you get started with development, here is a directory of IDS libraries that you may use in your application. Please feel free to [submit your library](https://github.com/buildingSMART/IDS/pulls). 59 | 60 | Language | License | Library 61 | --- | --- | --- 62 | C# | ? | [XBim](todo) 63 | Python | LGPL-3.0-or-later | [IfcOpenShell](todo) 64 | ? | ? | ODA? 65 | Javascript | ? | Something or other 66 | 67 | ## More reading 68 | 69 | - [Add your implementation to the software vendors directory](https://technical.buildingsmart.org/resources/software-implementations/) 70 | - [Make a suggestion for improvement](https://github.com/buildingSMART/IDS/issues) 71 | -------------------------------------------------------------------------------- /entity-facet.md: -------------------------------------------------------------------------------- 1 | # Entity facet 2 | 3 | Every entity in an IFC model has an "IFC Class" **Name**. For example, wall entities will have an IFC class of IfcWall, and door entities will have an IFC class of IfcDoor. Entities that don't represent individual building elements will also have a class. For example, the project has a class of IfcProject, window types have a class of IfcWindowType, and cost items have a class of IfcCostItem. 4 | 5 | Classes aren’t just for categorising entities. They also indicate what types of properties and relationships it is allowed to have. For example, an IfcWall class can have a fire rating property, but an IfcGrid class cannot. 6 | 7 | Different IFC schemas have different IFC classes. More recent IFC schemas contain richer and more diverse IFC classes, which you can compare here: 8 | 9 | - [IFC4X3 list of IFC class names](http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/annex-b1.html) 10 | - [IFC4 list of IFC class names](https://standards.buildingsmart.org/IFC/RELEASE/IFC4/ADD2_TC1/HTML/link/alphabeticalorder-entities.htm) 11 | - [IFC2X3 list of IFC class names](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/alphabeticalorder_entities.htm) 12 | 13 | Some entities may also optionally have a **Predefined Type**. This is a further level of entity categorisation in addition to the IFC Class **Name**. For example, an IfcWall may have a **Predefined Type** of SHEAR, or PARTITIONING. Whereas the IFC Class **Name** is specified by the IFC standard, the **Predefined Type** may also contain custom values by the user. 14 | 15 | The IFC schema documentation contains a list of standard predefined types. Here is how you might find a list of valid **Predefined Types** for the IFC4X3 schema. The instructions will be similar for all IFC versions. 16 | 17 | 1. Browse to the documentation page for the IFC class you are specifying. You can get there from the list of IFC class names above. For example, [this is the IfcWall documentation page](http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWall.htm). 18 | 2. Scroll down to the **Attributes** section of the documentation and find the **PredefinedType** attribute. 19 | 3. Click on the enumeration link next to the **PredefinedType** attribute to view the list of valid values. For example, for an IfcWall, you will click the link to bring you to [the documentation for IfcWallTypeEnum](http://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcWallTypeEnum.htm). 20 | 4. A list of valid **Predefined Types** are shown in a table. 21 | 22 | Choosing from the list of standardised **Predefined Types** is highly recommended. However, if they do not apply to your project you may specify any custom value. For example, you may specify "RADIATIONBARRIER" as a custom **PredefinedType** for an **IfcWall**. 23 | 24 | One of the most important aspects of writing a specification is to ensure that it applies to the appropriate IFC class. Typically, every single **Specification** will have an **Entity Facet** used in its **Applicability** section. 25 | 26 | ## Parameters 27 | 28 | Parameter | Required | Restrictions Allowed | Allowed Values | Meaning 29 | --- | --- | --- | --- | --- 30 | **Name** | ✔️ | ✔️ | A valid IFC class from the IFC schema. | The IFC Class must match exactly 31 | **Predefined Type** | ❌ | ✔️ | A valid predefined type from the IFC schema, or any custom text value. | The IFC Predefined Type must match exactly 32 | 33 | ## Examples 34 | 35 | Applicability Intention | Requirement Intention | Facet Definition 36 | --- | --- | --- 37 | All partition walls | Must be a partition wall | Name="IFCWALL", PredefinedType="PARTITIONING" 38 | All floor slabs | Must be a floor slab | Name="IFCSLAB", PredefinedType="FLOOR" 39 | All door types, such that may be documented in a door types schedule | Must be a door type | Name="IFCDOORTYPE" 40 | All type elements | Must be a type element | Name="IFC.*TYPE" 41 | All building storeys | Must be a building storey | Name="IFCBUILDINGSTOREY" 42 | All related documents, such as drawings, schedules, manuals, and specifications | Must be a document | Name="IFCDOCUMENTINFORMATION" 43 | All distribution systems, such as hot water systems, electrical circuits, etc | Must be a system | Name="IFCSYSTEM" 44 | All construction tasks, such as in construction scheduling in a work breakdown structure | Must be a construction task | Name="IFCTASK", PredefinedType="CONSTRUCTION" 45 | -------------------------------------------------------------------------------- /ids-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Moult/tmp-ids-spec/7f98ad2ca3d2da4841725ff6dfe6d8e56b6fedbf/ids-diagram.png -------------------------------------------------------------------------------- /ids-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Moult/tmp-ids-spec/7f98ad2ca3d2da4841725ff6dfe6d8e56b6fedbf/ids-logo.png -------------------------------------------------------------------------------- /ids-metadata.md: -------------------------------------------------------------------------------- 1 | # Guide to effective IDS metadata 2 | 3 | IDS is designed to be readable by both humans and computers. Just as it is important to precisely and accurately describe **Specifications** to computers, it is equally important to describe the purpose, intentions, and utility of the **Specifications** to recipients of the IDS. This is achieved by filling out **Specification** metadata. When model authors, designers, engineers, clients, consultants, and other stakeholders clearly understand why information is needed, who it benefits, and when it will be used, it will help guarantee that requirements are met effectively. 4 | 5 | ## IDS metadata 6 | 7 | Each `.ids` file has basic metadata that are common to all **Specifications** listed inside the IDS. 8 | 9 | Name | Description | Examples 10 | --- | --- | --- 11 | Title | The document title of the IDS, used to refer to the IDS as a whole | "Minimum delivery requirements" or "Costing Requirements" 12 | Copyright | The copyright owner of the IDS | "Example Company Pty Ltd" or "Government Department X" 13 | Version | The version of the IDS, to keep track of changes that have been made. Semantic versioning is recommended where versioning follows the naming scheme of X.Y, where Y represents a minor change, such as changes in metadata, description, or spelling errors, and X represents a major change, where models that used to pass or fail in a previous version may yield a different result. | "1.0" or "2.1" 14 | Author | The author of the IDS, provided as an email contact address | "john@doe.com" 15 | Date | The date the IDS was published | "2022-01-01" 16 | Description | A short one or two sentence description of what the IDS achieves | "Minimum requirements for all OpenBIM projects to ensure basic coordination and data scheduling can be done by all stakeholders" or "Specifies required properties that have a large impact on the accuracy of cost estimation and quantities that are necessary for automated model-based quantity take-off". 17 | Purpose | ? | ? 18 | Milestone | Which project milestone the IDS should be satisfied in | "Design", "Construction", or "Comissioning" 19 | 20 | ## Specification metadata 21 | 22 | Each **Specification** has metadata to help describe the goals and instructions of how to achieve it. 23 | 24 | Name | Description | Examples 25 | --- | --- | --- 26 | Name | A short name of what information is being specified | "Wall type naming conventions" or "Concrete quantity take-off dimensions" 27 | Description | Describe why the requirement is important to the project. The person reading the description should understand why the information provides value, which workflows it helps to achieve, and what project benefits will be sacrificed if the requirements are not met. | "Basic properties that have significant impacts on costing, detailing, and building renovations must be included to minimise construction risk." 28 | Instructions | Provide instructions on who is responsible to provide the information and details on how it is achieved, such as guidelines on how a naming convention works, how to choose an appropriate value, or what to do in edge-cases | "Architects and code consultants are responsible for providing this information. Where there are multiple values, the dominant value shall be indicated." 29 | -------------------------------------------------------------------------------- /ids-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Moult/tmp-ids-spec/7f98ad2ca3d2da4841725ff6dfe6d8e56b6fedbf/ids-structure.png -------------------------------------------------------------------------------- /material-facet.md: -------------------------------------------------------------------------------- 1 | # Material facet 2 | 3 | Elements (e.g. walls, doors, windows, etc) in IFC and element types (e.g. wall types, door types, window types, etc) may have a **Material** associated with it. These **Materials** are typically specified as construction materials, as opposed to chemical **Materials**. For example, concrete of two different grades are considered two separate **Materials**. 4 | 5 | In the simplest case, an element may have a single **Material**. For example, a chair may be made from a "wood" material. The **Material Facet** lets you filter by elements having this **Material**. 6 | 7 | An element may also have multiple **Materials** in three possible scenarios: 8 | 9 | - **Layered materials**: an element (e.g. a wall or slab) is parametrically defined in terms of material layers with a thickness (e.g. stud layer, insulation layer, and gypsum layer). Each layer may have a different **Material**. 10 | - **Profiled materials**: an element (e.g. a column or beam) is parametrically defined in terms of a profile (e.g. C-profile, Z-profile, or I-profile) extruded along a path. Composite columns and beams may have multiple profiles from different **Materials**. 11 | - **Constituent materials**: an element (e.g. a window, or slab) where portions of the element are made out of different **Materials** (e.g. the window glazing and the window frame) or mixed (e.g. a concrete slab may be composed of a percentage of cement, aggregate, etc) 12 | 13 | ![Material Facet](material-facet.png) 14 | 15 | The **Material Facet** lets you filter elements where one of their **Materials** matches your specified **Material**. 16 | 17 | Many disciplines, such as costing, scheduling, sustainability analysis, or construction trade packages depend on correct **Material** association. The **Material Facet** is especially useful for domain specific information **Specifications**. 18 | 19 | ## Parameters 20 | 21 | Parameter | Required | Restrictions Allowed | Allowed Values | Meaning 22 | --- | --- | --- | --- | --- 23 | **Value** | ❌ | ✔️ | Any material name or material category. The material name is typically specific to the project or local convention. The material category is recommended to be one of 'concrete', 'steel', 'aluminium', 'block', 'brick', 'stone', 'wood', 'glass', 'gypsum', 'plastic', or 'earth'. | The element must be made out of a **Material** with the specified name or category. If there are multiple **Materials**, then any **Material**, **Layer**, **Profile** or **Constituent** with that name or category will also satisfy the requirement. 24 | 25 | If no parameters are specified, then it means that any **Material** should be present, regardless of name or category. 26 | 27 | ## Examples 28 | 29 | Applicabiity Intention | Requirement Intention | Facet Definition 30 | --- | --- | --- 31 | Any entity with a material | The entity must have a material | No parameters 32 | All entities made from wood | The entity must be made out of wood | Value="wood" 33 | All entities made from brick | The entity must be made out of brick | Value="brick" 34 | All entities made from either concrete or steel | The entity (e.g. foundation piles) must be made of either concrete or steel | Value=["concrete", "steel"] 35 | Any entities with a material named with a code starting with "CON" followed by 2 digits, like CON01, CON02, etc | The entity shall have a material with the naming scheme of "CON" followed by two digits, such as CON01, CON02, etc. | Value="CON[0-9]{2}" 36 | -------------------------------------------------------------------------------- /material-facet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Moult/tmp-ids-spec/7f98ad2ca3d2da4841725ff6dfe6d8e56b6fedbf/material-facet.png -------------------------------------------------------------------------------- /restrictions.md: -------------------------------------------------------------------------------- 1 | # Complex restrictions 2 | 3 | When specifying a **Facet Parameter**, you may either specify a **Simple Value** or a **Complex Restriction**. A **Simple Value** may be text, a number, or a boolean (TRUE / FALSE). In contrast, a **Complex Restriction** may represent pick lists of valid values, naming schemes and conventions, numeric ranges, or more. A restriction may be specified in six different ways: 4 | 5 | - Enumeration 6 | - Pattern 7 | - Bounds 8 | - Length 9 | - Total digits 10 | - Fraction digits 11 | 12 | ## Enumeration 13 | 14 | An **Enumeration** restriction means that the value must be one of a list of allowed values. For example, you might want to specify that a material may be either "concrete" or "steel". 15 | 16 | Numbers may also be specified as a list. For example, you may specify that a concrete strength grade may be either "25", "30", "35, or "40". If the user has the value of "30", then that will comply with your **Enumeration**. However, if they choose "31", then it does not. 17 | 18 | Booleans may also be specified, such as "TRUE" or "FALSE". However, it is generally meaningless to specify a boolean as an enumeration because the nature of a boolean implies that the user always has to choose either "TRUE" or "FALSE". 19 | 20 | Note that even if you specify a list of allowed values, the user can still only choose one value from that list. 21 | 22 | ## Pattern 23 | 24 | A **Pattern** restriction represents a naming convention or naming scheme. For example, if you want to specify that door types must be named using the convention DT01, DT02, DT03, etc, you can create a pattern defining that the letters "DT" should be first, followed by two numbers. 25 | 26 | Computers have a special way of defining patterns of text called **Regex**. It uses special symbols to tell the computer to expect numbers, letters, or any character. You may already be familiar with computer patterns using the "`*`" character as a wildcard. For example, you might say that the pattern "`DT*`" can be satisfied by the values "`DTA`", "`DTB`", or even "`DT01`". **Regex** is a bit more complex, but in exchange, you can be more specific about the rules in your pattern. Investing in learning **Regex** is highly recommended, given the importance of naming conventions in the AEC industry. 27 | 28 | Here are some common examples you can use: 29 | 30 | Pattern | Description | Example values that meet the pattern criteria | Example values that fail the pattern 31 | --- | --- | --- | --- 32 | `DT01` | When only letters and numbers are used with no symbols, then the pattern is equivalent to an exact match | "`DT01`" | Anything other than "`DT01`" will fail. 33 | `DT_ABC-01` | Apart from letters and numbers, the "`_`" and "`-`" symbols have no special meaning, so this pattern is also equivalent to an exact match. | "`DT_ABC-01`" | Anything other than "`DT_ABC-01`" will fail. 34 | `DT.` | The "`.`" symbol is a wildcard for any _single_ character. | "`DT1`", "`DT2`", "`DTA`", "`DTX`", "`DT+`", etc | "`DT01`" will not match because it has multiple characters after "`DT`". "`ADT1`" will not match because it starts with "`A`", not "`DT`". 35 | `DT..` | When the "`.`" wildcard symbol is used multiple times, each time represents another _single_ character. | "`DT01`", "`DT02`", "`DTAB`", "`DTXY`", "`DT++`", etc | "`DT1`" will not match because it doesn't have two characters after "`DT`". 36 | `DT.*` | When the "`*`" symbol is used after the "`.`" symbol to create "`.*`", it is a wildcard for any number of characters, not just a single character. So anything starting with `DT` will match, regardless of what characters are after it. | "`DT1`", "`DT02`", "`DTA`", "`DTXYZ`", "`DT+1-BC=123`", etc | Anything that doesn't start with "`DT`" will fail, such as "`ADT`", "`ABC-DT01`", etc. 37 | `.*DT.*` | This time, the "`.*`" symbol combination is used both before and after the text "`DT`", meaning that any number of characters (including zero characters) can occur before or after the text "`DT`". | "`DT`" matches because it technically has zero characters before and after it (tricky, isn't it?). "`DT1`", "`ADT`", "`ADT1`", "`ABCDT01`", and "`ABC-DT-01`" all match. | Anything which doesn't contain "`DT`" will fail, such as "`ADIT`", "`TD`", or "`D-T`". 38 | `DT[0-9]` | The "`[0-9]`" symbol combination means that any _single_ digit between 0 and 9 is allowed after the text "`DT`". | "`DT0`", "`DT1`", "`DT2`" up to "`DT9`" will all match | Anything which doesn't have _only_ a single digit after "`DT`" will fail, like "`DT`", "`DTA`", and "`DT123`" 39 | `DT[0-9]*` | When the "`*`" symbol is used after the "`[0-9]`" symbol to create "`[0-9]*`", it means that you can have any number of digits (including zero!) after the text "`DT`". | "`DT`", "`DT1`", "`DT12`", "`DT012345`", etc will match | Any value which has a non-digit after "`DT`" will fail, like "`DTABC`", "`DT01A`", "DTA1B2", etc. 40 | `DT[0-9]{2}` | This time, instead of adding the "`*`" symbol, we add the "`{2}`" symbol, which means that you want exactly two digits after "`DT`". | "`DT01`", "`DT24`", "`DT99`", etc all match | Anything other than 2 digits will fail, like "`DTA`", "`DT0`", or "`DT123`". 41 | 42 | **Regex** is a well-established methodology and can achieve very advanced pattern matching, but can take a while to fully learn its capabilities. As a result, only a few basic examples are shown here. Teaching the full capabilities is outside the scope of the IDS documentation. To make full use of it, there are plenty of online tutorials and resources: 43 | 44 | - [Beginners Regex tutorial](https://regexone.com/) 45 | - [Online Regex testing website](https://regex101.com/) 46 | 47 | ## Bounds 48 | 49 | A **Bounds** restriction allows you to specify that the value is a number and has to fall within a range of values. You can specify either a minimum, maximum, or both. You can also specify whether the minimum or maximum is inclusive (e.g. `>=` and `<=`) or exclusive (e.g. `>` and `<`). For example, you might specify that a value needs to be "more than 3" and "less than or equal to 10". 50 | 51 | ## Length 52 | 53 | A **Length** restriction specifies the exact number of characters allowed in a value. For example, if you specify a length of 3, then values that are three characters long, like "`ABC`" or "`123`", will meet your requirement. Other values, like "`AB`" or "`ABC123`" will not meet your requirement. 54 | 55 | Note that it is also possible to achieve the same effect by specifying a **Pattern**, such as "`.{3}`", however, the **Length** restriction is simpler and quicker to compute. 56 | 57 | ## Total digits 58 | 59 | A **Total Digits** restriction specifies the total number of digits allowed in a value, regardless of negative signs or decimal points. For example, a **Total Digits** of 3 mean that "`123`", "`-123`", and "`1.23`" all meet the requirement. 60 | 61 | ## Fraction digits 62 | 63 | A **Fraction Digits** restriction specifies the precision of the digits allowed after the decimal point. For example, a value of 3 means that "`12`", "`12.3`", "`12.34`", and "`12.345`" are all allowed, since they have three or less digits after the decimal point. However, "`12.3456`" is not allowed. Note that "`12.3450`", "`12.34500`", etc are all equivalent to "`12.345`", so they are also allowed. However, "`12.3450001`" is not equivalent so it is not allowed. 64 | -------------------------------------------------------------------------------- /specifications.md: -------------------------------------------------------------------------------- 1 | # How do specifications work? 2 | 3 | A **Specification** is designed to be easy for humans to understand. However, **Specifications** are also highly structured so that computer software may automatically and accurately check information requirements with no ambiguity. Every **Specification** has three parts: 4 | 5 | 1. **Description**: a description of why the **Specification** is important to your project and instructions of how to achieve it. This part is designed for humans to read and understand why information is being requested. 6 | 2. **Applicability**: which type of objects the **Specification** applies to. There are many different types of objects in IFC models, such as walls, doors, and windows, but each **Specification** will only apply to certain objects. 7 | 3. **Requirements**: what information is required for the objects specified in part 2, such as required properties or classifications. 8 | 9 | For example, the **Specification** of "_all walls must have a fire rating property_" is structured like so: 10 | 11 | 1. **Description**: wall fire ratings are critical for building code compliance 12 | 2. **Applicability**: this specification applies to all wall objects 13 | 3. **Requirements**: the aforementioned wall objects must have a fire rating property 14 | 15 | ## How specifications can describe information 16 | 17 | **Applicability** and **Requirements** are described using **Facets**. A **Facet** describes information that a single entity (e.g. wall, door, etc) in your model may have. A **Facet** describes its information precisely using fixed **Facet Parameters** so that computers can understand exactly what information you are after. 18 | 19 | When a **Facet** is used in the **Applicability** section, the **Facet** describes information that an entity needs to have for the **Specification** to be **Applicable** to the entity. 20 | 21 | When a **Facet** is used in the **Requirements** section, the **Facet** describes information that an entity needs to have to comply with the **Specification**. 22 | 23 | ![IDS Structure](ids-structure.png) 24 | 25 | There are five different **Facets** of information: 26 | 27 | Facet Type | Facet Parameters | Example applicability | Example requirement 28 | --- | --- | --- | --- 29 | **Entity** | **IFC Class** and **Predefined Type** | Applies to "IfcWall" with predefined type of "SHEAR" | Must be an "IfcWall" with a predefined type of "SHEAR" 30 | **Attribute** | **Name** and **Value** | Applies to elements with the attribute "Name" having the value "W01" | Must have the attribute "Name" with the value "W01" 31 | **Classification** | **System** and **Value** | Applies to elements classified under "Uniclass 2015" as "EF_25_10_25" | Must have a "Uniclass 2015" classification reference of "EF_25_10_25" 32 | **Property** | **Property Set**, **Name**, and **Value** | Applies to elements with a property set of "Pset_WallCommon" with a "LoadBearing" property set to "TRUE" | Must have a "Pset_WallCommon" property set with a "LoadBearing" property set to "TRUE" 33 | **Material** | **Value** | Applies to "concrete" elements | Must have a "concrete" material 34 | **Parts** | **Entity** and **Relationship** | Applies to elements that are "contained in" an "IfcSpace" | Must be "contained in" an "IfcSpace" 35 | 36 | You can combine multiple **Facets** together in either the **Applicability** or **Requirements** section to describe a wide variety of **Specifications**. Some **Facets** may have optional **Facet Parameters**. For example, if you want to specify that a property should exist, but not the exact value, you may omit the value parameter of the **Property Facet**. 37 | 38 | You may also specify a list of valid values, or a range of numbers, or text pattern for some **Facet Parameters**. These are known as **Complex Restrictions**. For example, you would use a **Complex Restriction** to specify that a fire rating property must choose from either the value "0HR", "1HR", or "2HR" only. 39 | 40 | Here are a few examples to whet your appetite: 41 | 42 | Description | Applicability | Requirements 43 | --- | --- | --- 44 | External load bearing walls need to have a fire rating property for code compliance | | 45 | Bedrooms should have a minimum area of 10m2 | | 46 | All brick wall types must be classified and follow the approved naming convention | | 47 | 48 | To see the full capabilities of what each information each **Facet** can specify, see the sections below for more detail. 49 | 50 | ## Required and optional specifications 51 | 52 | Each **Specification** may also specify whether it is **Required**, **Optional**, or **Prohibited**. Given the example **Specification** of "_all walls must have a fire rating property_" this is the interpretation: 53 | 54 | Type | Meaning | Example 55 | --- | --- | --- 56 | **Required** | The specified information _must_ be found in the IFC model | The model must have walls, and they must all have a fire rating property 57 | **Optional** | If there are elements in the IFC model that are applicable to the **Specification**, then the **Requirements** must be satisfied | The model may or may not have walls. If they do, then they must have a fire rating property 58 | **Prohibited** | The specified information _must not_ be found in the IFC model | The model should not have any walls that have a fire rating property. Walls without a fire rating property are allowed. Other non-wall elements with a fire rating property are also allowed. 59 | 60 | ## IFC schema support 61 | 62 | Each **Specification** may specify the IFC schema(s) that it applies to. If a model does not match the schema(s), the **Specification** will not apply and will not be audited. The supported IFC schemas are: 63 | 64 | - IFC4X3 65 | - IFC4 66 | - IFC2X3 67 | 68 | IDS assumes that the provided IFC model only contains valid data. If the model has syntax errors or IFC schema validation errors, then the model may not be able to be audited. It is the responsibility of the IFC authoring software to ensure that the produced IFCs are valid. 69 | 70 | ## Advanced information requirements 71 | 72 | The first version of IDS targets basic information and relationships in IFC that are common to all disciplines. More advanced information requirements are currently out of scope for IDS. For example, geometry checks, checks that rely on calculated or dynamic values, checks that reference data outside the IFC model, or use domain specific IFC relationships are not possible. Here are some types of advanced requirements that you will need other tools to help audit: 73 | 74 | - There must be no clashes between structural beams and pipes 75 | - All walls need to be 3m away from the site boundary 76 | - The total area of all office spaces must be more than 300m2 77 | - The names of all door types must be unique 78 | - All pumps need to have a nominated supplier and manufacturer 79 | - All air handling units must have sensors assigned with trigger events 80 | - Saturday and sunday must be a holiday in all work schedules 81 | - All models shall load in under 3 minutes by major software vendors 82 | - Associated drawings in the model must match the latest revisions in the CDE 83 | - All rebar should be modeled as parametric swept disks 84 | - The model must match the as-built state of construction 85 | -------------------------------------------------------------------------------- /testcases-attribute.md: -------------------------------------------------------------------------------- 1 | # Attribute testcases 2 | 3 | These testcases are designed to help describe behaviour in edge cases and ambiguities. All valid IDS implementations must demonstrate identical behaviour to these test cases. 4 | 5 | ## [FAIL] Invalid attribute names always fail 6 | 7 | ~~~xml 8 | 9 | 10 | Foobar 11 | 12 | 13 | ~~~ 14 | 15 | ~~~lua 16 | #1=IFCWALL('2Vizz8yS5EywnDdJXdANpX',$,$,$,$,$,$,$,$); /* Testcase */ 17 | ~~~ 18 | 19 | [Sample IDS](fail-invalid_attribute_names_always_fail.ids) - [Sample IFC: 1](fail-invalid_attribute_names_always_fail.ifc) 20 | 21 | ## [PASS] Attributes with a string value should pass 22 | 23 | ~~~xml 24 | 25 | 26 | Name 27 | 28 | 29 | ~~~ 30 | 31 | ~~~lua 32 | #1=IFCWALL('2YoHMx0RP22grn0OrtIn6U',$,'Foobar',$,$,$,$,$,$); /* Testcase */ 33 | ~~~ 34 | 35 | [Sample IDS](pass-attributes_with_a_string_value_should_pass.ids) - [Sample IFC: 1](pass-attributes_with_a_string_value_should_pass.ifc) 36 | 37 | ## [FAIL] Attributes with null values always fail 38 | 39 | ~~~xml 40 | 41 | 42 | Name 43 | 44 | 45 | ~~~ 46 | 47 | ~~~lua 48 | #1=IFCWALL('1ci2Eqgw502hXqDUvVQB7I',$,$,$,$,$,$,$,$); /* Testcase */ 49 | ~~~ 50 | 51 | [Sample IDS](fail-attributes_with_null_values_always_fail.ids) - [Sample IFC: 1](fail-attributes_with_null_values_always_fail.ifc) 52 | 53 | ## [FAIL] Attributes with empty strings always fail 54 | 55 | ~~~xml 56 | 57 | 58 | Name 59 | 60 | 61 | ~~~ 62 | 63 | ~~~lua 64 | #1=IFCWALL('2fsMZ$JM5ARQN6EjgQfWPI',$,'',$,$,$,$,$,$); /* Testcase */ 65 | ~~~ 66 | 67 | [Sample IDS](fail-attributes_with_empty_strings_always_fail.ids) - [Sample IFC: 1](fail-attributes_with_empty_strings_always_fail.ifc) 68 | 69 | ## [PASS] Attributes with a zero number have meaning and should pass 70 | 71 | ~~~xml 72 | 73 | 74 | CountValue 75 | 76 | 77 | ~~~ 78 | 79 | ~~~lua 80 | #1=IFCQUANTITYCOUNT('Foobar',$,$,0.,$); /* Testcase */ 81 | ~~~ 82 | 83 | [Sample IDS](pass-attributes_with_a_zero_number_have_meaning_and_should_pass.ids) - [Sample IFC: 1](pass-attributes_with_a_zero_number_have_meaning_and_should_pass.ifc) 84 | 85 | ## [PASS] Attributes with a boolean true should pass 86 | 87 | ~~~xml 88 | 89 | 90 | IsCritical 91 | 92 | 93 | ~~~ 94 | 95 | ~~~lua 96 | #1=IFCTASKTIME($,$,$,$,$,$,$,$,$,$,$,$,$,.T.,$,$,$,$,$,$); /* Testcase */ 97 | ~~~ 98 | 99 | [Sample IDS](pass-attributes_with_a_boolean_true_should_pass.ids) - [Sample IFC: 1](pass-attributes_with_a_boolean_true_should_pass.ifc) 100 | 101 | ## [PASS] Attributes with a boolean false should pass 102 | 103 | ~~~xml 104 | 105 | 106 | IsCritical 107 | 108 | 109 | ~~~ 110 | 111 | ~~~lua 112 | #1=IFCTASKTIME($,$,$,$,$,$,$,$,$,$,$,$,$,.F.,$,$,$,$,$,$); /* Testcase */ 113 | ~~~ 114 | 115 | [Sample IDS](pass-attributes_with_a_boolean_false_should_pass.ids) - [Sample IFC: 1](pass-attributes_with_a_boolean_false_should_pass.ifc) 116 | 117 | ## [FAIL] Attributes with an empty list always fail 118 | 119 | ~~~xml 120 | 121 | 122 | RelatingPriorities 123 | 124 | 125 | ~~~ 126 | 127 | ~~~lua 128 | #1=IFCWALL('1LJR0ZrUjDZv98VLM0xduS',$,$,$,$,$,$,$,$); 129 | #2=IFCWALL('3YGPmGrGn0ueGPV1wEaQ6C',$,$,$,$,$,$,$,$); 130 | #3=IFCRELCONNECTSPATHELEMENTS('0_LnguD312iOhijq9hoWj$',$,$,$,$,#1,#2,(),(),.ATSTART.,.ATEND.); /* Testcase */ 131 | ~~~ 132 | 133 | [Sample IDS](fail-attributes_with_an_empty_list_always_fail.ids) - [Sample IFC: 3](fail-attributes_with_an_empty_list_always_fail.ifc) 134 | 135 | ## [FAIL] Attributes with an empty set always fail 136 | 137 | ~~~xml 138 | 139 | 140 | LayerStyles 141 | 142 | 143 | ~~~ 144 | 145 | ~~~lua 146 | #1=IFCCARTESIANPOINT((0.,0.,0.)); 147 | #2=IFCPRESENTATIONLAYERWITHSTYLE('Foo',$,(#1),$,.T.,.F.,.F.,()); /* Testcase */ 148 | ~~~ 149 | 150 | [Sample IDS](fail-attributes_with_an_empty_set_always_fail.ids) - [Sample IFC: 2](fail-attributes_with_an_empty_set_always_fail.ifc) 151 | 152 | ## [FAIL] Attributes with a logical unknown always fail 153 | 154 | ~~~xml 155 | 156 | 157 | LayerOn 158 | 159 | 160 | ~~~ 161 | 162 | ~~~lua 163 | #1=IFCCARTESIANPOINT((0.,0.,0.)); 164 | #2=IFCPRESENTATIONLAYERWITHSTYLE('Foo',$,(#1),$,.U.,.F.,.F.,()); /* Testcase */ 165 | ~~~ 166 | 167 | [Sample IDS](fail-attributes_with_a_logical_unknown_always_fail.ids) - [Sample IFC: 2](fail-attributes_with_a_logical_unknown_always_fail.ifc) 168 | 169 | ## [PASS] Attributes with a zero duration should pass 170 | 171 | ~~~xml 172 | 173 | 174 | ScheduleDuration 175 | 176 | 177 | ~~~ 178 | 179 | ~~~lua 180 | #1=IFCTASKTIME($,$,$,$,'P0D',$,$,$,$,$,$,$,$,$,$,$,$,$,$,$); /* Testcase */ 181 | ~~~ 182 | 183 | [Sample IDS](pass-attributes_with_a_zero_duration_should_pass.ids) - [Sample IFC: 1](pass-attributes_with_a_zero_duration_should_pass.ifc) 184 | 185 | ## [PASS] Attributes referencing an object should pass 186 | 187 | ~~~xml 188 | 189 | 190 | TaskTime 191 | 192 | 193 | ~~~ 194 | 195 | ~~~lua 196 | #1=IFCTASKTIME($,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$); 197 | #2=IFCTASK('2AgPEiBgr0C9W_mzgojk4i',$,$,$,$,$,$,$,$,.T.,$,#1,$); /* Testcase */ 198 | ~~~ 199 | 200 | [Sample IDS](pass-attributes_referencing_an_object_should_pass.ids) - [Sample IFC: 2](pass-attributes_referencing_an_object_should_pass.ifc) 201 | 202 | ## [PASS] Attributes with a select referencing an object should pass 203 | 204 | ~~~xml 205 | 206 | 207 | DiffuseColour 208 | 209 | 210 | ~~~ 211 | 212 | ~~~lua 213 | #1=IFCCOLOURRGB($,1.,1.,1.); 214 | #2=IFCCOLOURRGB($,1.,1.,1.); 215 | #3=IFCSURFACESTYLERENDERING(#1,$,#2,$,$,$,$,$,.FLAT.); /* Testcase */ 216 | ~~~ 217 | 218 | [Sample IDS](pass-attributes_with_a_select_referencing_an_object_should_pass.ids) - [Sample IFC: 3](pass-attributes_with_a_select_referencing_an_object_should_pass.ifc) 219 | 220 | ## [PASS] Attributes with a select referencing a primitive should pass 221 | 222 | ~~~xml 223 | 224 | 225 | DiffuseColour 226 | 227 | 228 | ~~~ 229 | 230 | ~~~lua 231 | #1=IFCCOLOURRGB($,1.,1.,1.); 232 | #2=IFCSURFACESTYLERENDERING(#1,$,IFCNORMALISEDRATIOMEASURE(0.5),$,$,$,$,$,.FLAT.); /* Testcase */ 233 | ~~~ 234 | 235 | [Sample IDS](pass-attributes_with_a_select_referencing_a_primitive_should_pass.ids) - [Sample IFC: 2](pass-attributes_with_a_select_referencing_a_primitive_should_pass.ifc) 236 | 237 | ## [FAIL] Inverse attributes cannot be checked and always fail 238 | 239 | ~~~xml 240 | 241 | 242 | EngagedIn 243 | 244 | 245 | ~~~ 246 | 247 | ~~~lua 248 | #1=IFCPERSON($,$,$,$,$,$,$,$); /* Testcase */ 249 | #2=IFCORGANIZATION($,'Foo',$,$,$); 250 | #3=IFCPERSONANDORGANIZATION(#1,#2,$); 251 | ~~~ 252 | 253 | [Sample IDS](fail-inverse_attributes_cannot_be_checked_and_always_fail.ids) - [Sample IFC: 1](fail-inverse_attributes_cannot_be_checked_and_always_fail.ifc) 254 | 255 | ## [FAIL] Derived attributes cannot be checked and always fail 256 | 257 | ~~~xml 258 | 259 | 260 | Dim 261 | 262 | 263 | ~~~ 264 | 265 | ~~~lua 266 | #1=IFCCARTESIANPOINT((0.,0.,0.)); /* Testcase */ 267 | ~~~ 268 | 269 | [Sample IDS](fail-derived_attributes_cannot_be_checked_and_always_fail.ids) - [Sample IFC: 1](fail-derived_attributes_cannot_be_checked_and_always_fail.ifc) 270 | 271 | ## [PASS] Attributes should check strings case sensitively 1/2 272 | 273 | ~~~xml 274 | 275 | 276 | Name 277 | 278 | 279 | Foobar 280 | 281 | 282 | ~~~ 283 | 284 | ~~~lua 285 | #1=IFCWALL('0BArK75T91pOs4E733AGKY',$,'Foobar',$,$,$,$,$,$); /* Testcase */ 286 | ~~~ 287 | 288 | [Sample IDS](pass-attributes_should_check_strings_case_sensitively_1_2.ids) - [Sample IFC: 1](pass-attributes_should_check_strings_case_sensitively_1_2.ifc) 289 | 290 | ## [FAIL] Attributes should check strings case sensitively 2/2 291 | 292 | ~~~xml 293 | 294 | 295 | Name 296 | 297 | 298 | Foobar 299 | 300 | 301 | ~~~ 302 | 303 | ~~~lua 304 | #1=IFCWALL('07qJ4oMzbDUuaz1lpex9Xf',$,'foobar',$,$,$,$,$,$); /* Testcase */ 305 | ~~~ 306 | 307 | [Sample IDS](fail-attributes_should_check_strings_case_sensitively_2_2.ids) - [Sample IFC: 1](fail-attributes_should_check_strings_case_sensitively_2_2.ifc) 308 | 309 | ## [PASS] Non-ascii characters are treated without encoding 310 | 311 | ~~~xml 312 | 313 | 314 | Name 315 | 316 | 317 | 318 | 319 | 320 | ~~~ 321 | 322 | ~~~lua 323 | #1=IFCWALL('3Ivie0$SL3APN75VSARxgf',$,'\X2\266B\X0\',$,$,$,$,$,$); /* Testcase */ 324 | ~~~ 325 | 326 | [Sample IDS](pass-non_ascii_characters_are_treated_without_encoding.ids) - [Sample IFC: 1](pass-non_ascii_characters_are_treated_without_encoding.ifc) 327 | 328 | ## [FAIL] Value checks always fail for objects 329 | 330 | ~~~xml 331 | 332 | 333 | TaskTime 334 | 335 | 336 | Foobar 337 | 338 | 339 | ~~~ 340 | 341 | ~~~lua 342 | #1=IFCTASKTIME($,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$); 343 | #2=IFCTASK('2LnkknVZ552f8PLYvQaN6O',$,$,$,$,$,$,$,$,.F.,$,#1,$); /* Testcase */ 344 | ~~~ 345 | 346 | [Sample IDS](fail-value_checks_always_fail_for_objects.ids) - [Sample IFC: 2](fail-value_checks_always_fail_for_objects.ifc) 347 | 348 | ## [FAIL] Value checks always fail for selects 349 | 350 | ~~~xml 351 | 352 | 353 | DiffuseColour 354 | 355 | 356 | Foobar 357 | 358 | 359 | ~~~ 360 | 361 | ~~~lua 362 | #1=IFCCOLOURRGB($,1.,1.,1.); 363 | #2=IFCSURFACESTYLERENDERING(#1,$,IFCNORMALISEDRATIOMEASURE(0.5),$,$,$,$,$,.FLAT.); /* Testcase */ 364 | ~~~ 365 | 366 | [Sample IDS](fail-value_checks_always_fail_for_selects.ids) - [Sample IFC: 2](fail-value_checks_always_fail_for_selects.ifc) 367 | 368 | ## [FAIL] Value checks always fail for lists 369 | 370 | ~~~xml 371 | 372 | 373 | Coordinates 374 | 375 | 376 | Foobar 377 | 378 | 379 | ~~~ 380 | 381 | ~~~lua 382 | #1=IFCCARTESIANPOINT((0.,0.,0.)); /* Testcase */ 383 | ~~~ 384 | 385 | [Sample IDS](fail-value_checks_always_fail_for_lists.ids) - [Sample IFC: 1](fail-value_checks_always_fail_for_lists.ifc) 386 | 387 | ## [PASS] GlobalIds are treated as strings and not expanded 388 | 389 | ~~~xml 390 | 391 | 392 | GlobalId 393 | 394 | 395 | 1GOZ_Gs8n8_9EopghtCeh9 396 | 397 | 398 | ~~~ 399 | 400 | ~~~lua 401 | #1=IFCWALL('1GOZ_Gs8n8_9EopghtCeh9',$,$,$,$,$,$,$,$); /* Testcase */ 402 | ~~~ 403 | 404 | [Sample IDS](pass-globalids_are_treated_as_strings_and_not_expanded.ids) - [Sample IFC: 1](pass-globalids_are_treated_as_strings_and_not_expanded.ifc) 405 | 406 | ## [FAIL] IDS does not handle string truncation such as for identifiers 407 | 408 | ~~~xml 409 | 410 | 411 | Identification 412 | 413 | 414 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345_extra_characters 415 | 416 | 417 | ~~~ 418 | 419 | ~~~lua 420 | #1=IFCPERSON('123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345',$,$,$,$,$,$,$); /* Testcase */ 421 | ~~~ 422 | 423 | [Sample IDS](fail-ids_does_not_handle_string_truncation_such_as_for_identifiers.ids) - [Sample IFC: 1](fail-ids_does_not_handle_string_truncation_such_as_for_identifiers.ifc) 424 | 425 | ## [PASS] Numeric values are checked using type casting 1/4 426 | 427 | ~~~xml 428 | 429 | 430 | RefractionIndex 431 | 432 | 433 | 42 434 | 435 | 436 | ~~~ 437 | 438 | ~~~lua 439 | #1=IFCSURFACESTYLEREFRACTION(42.,$); /* Testcase */ 440 | ~~~ 441 | 442 | [Sample IDS](pass-numeric_values_are_checked_using_type_casting_1_4.ids) - [Sample IFC: 1](pass-numeric_values_are_checked_using_type_casting_1_4.ifc) 443 | 444 | ## [PASS] Numeric values are checked using type casting 2/4 445 | 446 | ~~~xml 447 | 448 | 449 | RefractionIndex 450 | 451 | 452 | 42. 453 | 454 | 455 | ~~~ 456 | 457 | ~~~lua 458 | #1=IFCSURFACESTYLEREFRACTION(42.,$); /* Testcase */ 459 | ~~~ 460 | 461 | [Sample IDS](pass-numeric_values_are_checked_using_type_casting_2_4.ids) - [Sample IFC: 1](pass-numeric_values_are_checked_using_type_casting_2_4.ifc) 462 | 463 | ## [PASS] Numeric values are checked using type casting 3/4 464 | 465 | ~~~xml 466 | 467 | 468 | RefractionIndex 469 | 470 | 471 | 42.0 472 | 473 | 474 | ~~~ 475 | 476 | ~~~lua 477 | #1=IFCSURFACESTYLEREFRACTION(42.,$); /* Testcase */ 478 | ~~~ 479 | 480 | [Sample IDS](pass-numeric_values_are_checked_using_type_casting_3_4.ids) - [Sample IFC: 1](pass-numeric_values_are_checked_using_type_casting_3_4.ifc) 481 | 482 | ## [FAIL] Numeric values are checked using type casting 4/4 483 | 484 | ~~~xml 485 | 486 | 487 | RefractionIndex 488 | 489 | 490 | 42 491 | 492 | 493 | ~~~ 494 | 495 | ~~~lua 496 | #1=IFCSURFACESTYLEREFRACTION(42.3,$); /* Testcase */ 497 | ~~~ 498 | 499 | [Sample IDS](fail-numeric_values_are_checked_using_type_casting_4_4.ids) - [Sample IFC: 1](fail-numeric_values_are_checked_using_type_casting_4_4.ifc) 500 | 501 | ## [FAIL] Only specifically formatted numbers are allowed 1/4 502 | 503 | ~~~xml 504 | 505 | 506 | RefractionIndex 507 | 508 | 509 | 42,3 510 | 511 | 512 | ~~~ 513 | 514 | ~~~lua 515 | #1=IFCSURFACESTYLEREFRACTION(42.3,$); /* Testcase */ 516 | ~~~ 517 | 518 | [Sample IDS](fail-only_specifically_formatted_numbers_are_allowed_1_4.ids) - [Sample IFC: 1](fail-only_specifically_formatted_numbers_are_allowed_1_4.ifc) 519 | 520 | ## [FAIL] Only specifically formatted numbers are allowed 2/4 521 | 522 | ~~~xml 523 | 524 | 525 | RefractionIndex 526 | 527 | 528 | 123,4.5 529 | 530 | 531 | ~~~ 532 | 533 | ~~~lua 534 | #1=IFCSURFACESTYLEREFRACTION(1234.5,$); /* Testcase */ 535 | ~~~ 536 | 537 | [Sample IDS](fail-only_specifically_formatted_numbers_are_allowed_2_4.ids) - [Sample IFC: 1](fail-only_specifically_formatted_numbers_are_allowed_2_4.ifc) 538 | 539 | ## [PASS] Only specifically formatted numbers are allowed 3/4 540 | 541 | ~~~xml 542 | 543 | 544 | RefractionIndex 545 | 546 | 547 | 1.2345e3 548 | 549 | 550 | ~~~ 551 | 552 | ~~~lua 553 | #1=IFCSURFACESTYLEREFRACTION(1234.5,$); /* Testcase */ 554 | ~~~ 555 | 556 | [Sample IDS](pass-only_specifically_formatted_numbers_are_allowed_3_4.ids) - [Sample IFC: 1](pass-only_specifically_formatted_numbers_are_allowed_3_4.ifc) 557 | 558 | ## [PASS] Only specifically formatted numbers are allowed 4/4 559 | 560 | ~~~xml 561 | 562 | 563 | RefractionIndex 564 | 565 | 566 | 1.2345E3 567 | 568 | 569 | ~~~ 570 | 571 | ~~~lua 572 | #1=IFCSURFACESTYLEREFRACTION(1234.5,$); /* Testcase */ 573 | ~~~ 574 | 575 | [Sample IDS](pass-only_specifically_formatted_numbers_are_allowed_4_4.ids) - [Sample IFC: 1](pass-only_specifically_formatted_numbers_are_allowed_4_4.ifc) 576 | 577 | ## [PASS] Integers follow the same rules as numbers 578 | 579 | ~~~xml 580 | 581 | 582 | NumberOfRisers 583 | 584 | 585 | 42 586 | 587 | 588 | ~~~ 589 | 590 | ~~~lua 591 | #1=IFCSTAIRFLIGHT('0LY0GOwf53iPTW9nTOuVIu',$,$,$,$,$,$,$,42,$,$,$,$); /* Testcase */ 592 | ~~~ 593 | 594 | [Sample IDS](pass-integers_follow_the_same_rules_as_numbers.ids) - [Sample IFC: 1](pass-integers_follow_the_same_rules_as_numbers.ifc) 595 | 596 | ## [PASS] Integers follow the same rules as numbers 2/2 597 | 598 | ~~~xml 599 | 600 | 601 | NumberOfRisers 602 | 603 | 604 | 42.0 605 | 606 | 607 | ~~~ 608 | 609 | ~~~lua 610 | #1=IFCSTAIRFLIGHT('0wXBDJqhPAg9ltN6CuDcyo',$,$,$,$,$,$,$,42,$,$,$,$); /* Testcase */ 611 | ~~~ 612 | 613 | [Sample IDS](pass-integers_follow_the_same_rules_as_numbers_2_2.ids) - [Sample IFC: 1](pass-integers_follow_the_same_rules_as_numbers_2_2.ifc) 614 | 615 | ## [PASS] Integers are always floored when cast 1/2 616 | 617 | ~~~xml 618 | 619 | 620 | NumberOfRisers 621 | 622 | 623 | 42.3 624 | 625 | 626 | ~~~ 627 | 628 | ~~~lua 629 | #1=IFCSTAIRFLIGHT('0kWhBUS05BQ8qLePZ4VnJG',$,$,$,$,$,$,$,42,$,$,$,$); /* Testcase */ 630 | ~~~ 631 | 632 | [Sample IDS](pass-integers_are_always_floored_when_cast_1_2.ids) - [Sample IFC: 1](pass-integers_are_always_floored_when_cast_1_2.ifc) 633 | 634 | ## [PASS] Integers are always floored when cast 2/2 635 | 636 | ~~~xml 637 | 638 | 639 | NumberOfRisers 640 | 641 | 642 | 42.7 643 | 644 | 645 | ~~~ 646 | 647 | ~~~lua 648 | #1=IFCSTAIRFLIGHT('0DvrLfJ19ASRBx2Vl6hxIS',$,$,$,$,$,$,$,42,$,$,$,$); /* Testcase */ 649 | ~~~ 650 | 651 | [Sample IDS](pass-integers_are_always_floored_when_cast_2_2.ids) - [Sample IFC: 1](pass-integers_are_always_floored_when_cast_2_2.ifc) 652 | 653 | ## [PASS] Integers are always floored when cast 2/2 654 | 655 | ~~~xml 656 | 657 | 658 | NumberOfRisers 659 | 660 | 661 | 42.7 662 | 663 | 664 | ~~~ 665 | 666 | ~~~lua 667 | #1=IFCSTAIRFLIGHT('2LTNU5djTBSvAKqQzo3AVk',$,$,$,$,$,$,$,42,$,$,$,$); /* Testcase */ 668 | ~~~ 669 | 670 | [Sample IDS](pass-integers_are_always_floored_when_cast_2_2.ids) - [Sample IFC: 1](pass-integers_are_always_floored_when_cast_2_2.ifc) 671 | 672 | ## [FAIL] Booleans must be specified as uppercase strings 1/3 673 | 674 | ~~~xml 675 | 676 | 677 | IsMilestone 678 | 679 | 680 | TRUE 681 | 682 | 683 | ~~~ 684 | 685 | ~~~lua 686 | #1=IFCTASK('0b3YzCGv9F3e4eLk$EXZoA',$,$,$,$,$,$,$,$,.F.,$,$,$); /* Testcase */ 687 | ~~~ 688 | 689 | [Sample IDS](fail-booleans_must_be_specified_as_uppercase_strings_1_3.ids) - [Sample IFC: 1](fail-booleans_must_be_specified_as_uppercase_strings_1_3.ifc) 690 | 691 | ## [PASS] Booleans must be specified as uppercase strings 2/3 692 | 693 | ~~~xml 694 | 695 | 696 | IsMilestone 697 | 698 | 699 | FALSE 700 | 701 | 702 | ~~~ 703 | 704 | ~~~lua 705 | #1=IFCTASK('0b3YzCGv9F3e4eLk$EXZoA',$,$,$,$,$,$,$,$,.F.,$,$,$); /* Testcase */ 706 | ~~~ 707 | 708 | [Sample IDS](pass-booleans_must_be_specified_as_uppercase_strings_2_3.ids) - [Sample IFC: 1](pass-booleans_must_be_specified_as_uppercase_strings_2_3.ifc) 709 | 710 | ## [FAIL] Booleans must be specified as uppercase strings 2/3 711 | 712 | ~~~xml 713 | 714 | 715 | IsMilestone 716 | 717 | 718 | False 719 | 720 | 721 | ~~~ 722 | 723 | ~~~lua 724 | #1=IFCTASK('0b3YzCGv9F3e4eLk$EXZoA',$,$,$,$,$,$,$,$,.F.,$,$,$); /* Testcase */ 725 | ~~~ 726 | 727 | [Sample IDS](fail-booleans_must_be_specified_as_uppercase_strings_2_3.ids) - [Sample IFC: 1](fail-booleans_must_be_specified_as_uppercase_strings_2_3.ifc) 728 | 729 | ## [PASS] Dates are treated as strings 1/2 730 | 731 | ~~~xml 732 | 733 | 734 | EditionDate 735 | 736 | 737 | 2022-01-01 738 | 739 | 740 | ~~~ 741 | 742 | ~~~lua 743 | #1=IFCCLASSIFICATION($,$,'2022-01-01','Name',$,$,$); /* Testcase */ 744 | ~~~ 745 | 746 | [Sample IDS](pass-dates_are_treated_as_strings_1_2.ids) - [Sample IFC: 1](pass-dates_are_treated_as_strings_1_2.ifc) 747 | 748 | ## [FAIL] Dates are treated as strings 1/2 749 | 750 | ~~~xml 751 | 752 | 753 | EditionDate 754 | 755 | 756 | 2022-01-01 757 | 758 | 759 | ~~~ 760 | 761 | ~~~lua 762 | #1=IFCCLASSIFICATION($,$,'2022-01-01+00:00','Name',$,$,$); /* Testcase */ 763 | ~~~ 764 | 765 | [Sample IDS](fail-dates_are_treated_as_strings_1_2.ids) - [Sample IFC: 1](fail-dates_are_treated_as_strings_1_2.ifc) 766 | 767 | ## [FAIL] Durations are treated as strings 1/2 768 | 769 | ~~~xml 770 | 771 | 772 | ScheduleDuration 773 | 774 | 775 | PT16H 776 | 777 | 778 | ~~~ 779 | 780 | ~~~lua 781 | #1=IFCCLASSIFICATION($,$,'PT16H','Name',$,$,$); /* Testcase */ 782 | ~~~ 783 | 784 | [Sample IDS](fail-durations_are_treated_as_strings_1_2.ids) - [Sample IFC: 1](fail-durations_are_treated_as_strings_1_2.ifc) 785 | 786 | ## [FAIL] Durations are treated as strings 2/2 787 | 788 | ~~~xml 789 | 790 | 791 | ScheduleDuration 792 | 793 | 794 | PT16H 795 | 796 | 797 | ~~~ 798 | 799 | ~~~lua 800 | #1=IFCCLASSIFICATION($,$,'P2D','Name',$,$,$); /* Testcase */ 801 | ~~~ 802 | 803 | [Sample IDS](fail-durations_are_treated_as_strings_2_2.ids) - [Sample IFC: 1](fail-durations_are_treated_as_strings_2_2.ifc) 804 | 805 | ## [PASS] Name restrictions may be used 1/4 806 | 807 | ~~~xml 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | ~~~ 816 | 817 | ~~~lua 818 | #1=IFCMATERIALLAYER($,1.,$,$,$,$,$); 819 | #2=IFCMATERIALLAYERSET((#1),'Foo',$); /* Testcase */ 820 | ~~~ 821 | 822 | [Sample IDS](pass-name_restrictions_may_be_used_1_4.ids) - [Sample IFC: 2](pass-name_restrictions_may_be_used_1_4.ifc) 823 | 824 | ## [PASS] Name restrictions may be used 2/4 825 | 826 | ~~~xml 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | ~~~ 835 | 836 | ~~~lua 837 | #1=IFCMATERIALCONSTITUENTSET('Foo',$,$); /* Testcase */ 838 | ~~~ 839 | 840 | [Sample IDS](pass-name_restrictions_may_be_used_2_4.ids) - [Sample IFC: 1](pass-name_restrictions_may_be_used_2_4.ifc) 841 | 842 | ## [FAIL] Name restrictions may be used 3/4 843 | 844 | ~~~xml 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | ~~~ 854 | 855 | ~~~lua 856 | #1=IFCWALL('2TtYib0dnCUQqDHjptwLX4',$,'Foo',$,$,$,$,$,$); /* Testcase */ 857 | ~~~ 858 | 859 | [Sample IDS](fail-name_restrictions_may_be_used_3_4.ids) - [Sample IFC: 1](fail-name_restrictions_may_be_used_3_4.ifc) 860 | 861 | ## [PASS] Name restrictions may be used 4/4 862 | 863 | ~~~xml 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | ~~~ 873 | 874 | ~~~lua 875 | #1=IFCWALL('1S8xApCET8w9S760omQPYs',$,'Foo','Bar',$,$,$,$,$); /* Testcase */ 876 | ~~~ 877 | 878 | [Sample IDS](pass-name_restrictions_may_be_used_4_4.ids) - [Sample IFC: 1](pass-name_restrictions_may_be_used_4_4.ifc) 879 | 880 | ## [PASS] Value restrictions may be used 1/3 881 | 882 | ~~~xml 883 | 884 | 885 | Name 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | ~~~ 895 | 896 | ~~~lua 897 | #1=IFCWALL('0QW83E8dL3ihw4AYsj9Qcm',$,'Foo',$,$,$,$,$,$); /* Testcase */ 898 | ~~~ 899 | 900 | [Sample IDS](pass-value_restrictions_may_be_used_1_3.ids) - [Sample IFC: 1](pass-value_restrictions_may_be_used_1_3.ifc) 901 | 902 | ## [PASS] Value restrictions may be used 2/3 903 | 904 | ~~~xml 905 | 906 | 907 | Name 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | ~~~ 917 | 918 | ~~~lua 919 | #1=IFCWALL('2XcEfWCIb3KOOEdE5i6uaB',$,'Bar',$,$,$,$,$,$); /* Testcase */ 920 | ~~~ 921 | 922 | [Sample IDS](pass-value_restrictions_may_be_used_2_3.ids) - [Sample IFC: 1](pass-value_restrictions_may_be_used_2_3.ifc) 923 | 924 | ## [FAIL] Value restrictions may be used 3/3 925 | 926 | ~~~xml 927 | 928 | 929 | Name 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | ~~~ 939 | 940 | ~~~lua 941 | #1=IFCWALL('10NZQ5P352j96tQXmOHhdS',$,'Foobar',$,$,$,$,$,$); /* Testcase */ 942 | ~~~ 943 | 944 | [Sample IDS](fail-value_restrictions_may_be_used_3_3.ids) - [Sample IFC: 1](fail-value_restrictions_may_be_used_3_3.ifc) 945 | 946 | ## [FAIL] Attributes are not inherited by the occurrence 947 | 948 | ~~~xml 949 | 950 | 951 | Name 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | ~~~ 961 | 962 | ~~~lua 963 | #1=IFCWALL('2bHWSH6Dn0CgF1Ba5F96IO',$,$,$,$,$,$,$,$); /* Testcase */ 964 | #2=IFCWALLTYPE('0bNYnETIr2RvLs0fl0B14I',$,$,'Foobar',$,$,$,$,$,.ELEMENTEDWALL.); 965 | #3=IFCRELDEFINESBYTYPE('0dwZ8uEv58l8K8nI41pgtF',$,$,$,(#1),#2); 966 | ~~~ 967 | 968 | [Sample IDS](fail-attributes_are_not_inherited_by_the_occurrence.ids) - [Sample IFC: 1](fail-attributes_are_not_inherited_by_the_occurrence.ifc) 969 | 970 | ## [PASS] Typecast checking may also occur within enumeration restrictions 971 | 972 | ~~~xml 973 | 974 | 975 | RefractionIndex 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | ~~~ 984 | 985 | ~~~lua 986 | #1=IFCSURFACESTYLEREFRACTION(42.,$); /* Testcase */ 987 | ~~~ 988 | 989 | [Sample IDS](pass-typecast_checking_may_also_occur_within_enumeration_restrictions.ids) - [Sample IFC: 1](pass-typecast_checking_may_also_occur_within_enumeration_restrictions.ifc) 990 | 991 | ## [PASS] Strict numeric checking may be done with a bounds restriction 992 | 993 | ~~~xml 994 | 995 | 996 | RefractionIndex 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | ~~~ 1006 | 1007 | ~~~lua 1008 | #1=IFCSURFACESTYLEREFRACTION(42.,$); /* Testcase */ 1009 | ~~~ 1010 | 1011 | [Sample IDS](pass-strict_numeric_checking_may_be_done_with_a_bounds_restriction.ids) - [Sample IFC: 1](pass-strict_numeric_checking_may_be_done_with_a_bounds_restriction.ifc) 1012 | -------------------------------------------------------------------------------- /testcases-classification.md: -------------------------------------------------------------------------------- 1 | # Classification testcases 2 | 3 | These testcases are designed to help describe behaviour in edge cases and ambiguities. All valid IDS implementations must demonstrate identical behaviour to these test cases. 4 | 5 | ## [FAIL] A classification facet with no data matches any classification 1/2 6 | 7 | ~~~xml 8 | 9 | ~~~ 10 | 11 | ~~~lua 12 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 13 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 14 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 15 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); /* Testcase */ 16 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 17 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 18 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 19 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 20 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 21 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 22 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 23 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 24 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 25 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 26 | ~~~ 27 | 28 | [Sample IDS](fail-a_classification_facet_with_no_data_matches_any_classification_1_2.ids) - [Sample IFC: 4](fail-a_classification_facet_with_no_data_matches_any_classification_1_2.ifc) 29 | 30 | ## [PASS] A classification facet with no data matches any classification 2/2 31 | 32 | ~~~xml 33 | 34 | ~~~ 35 | 36 | ~~~lua 37 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 38 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 39 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 40 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 41 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 42 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 43 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 44 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 45 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 46 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 47 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 48 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 49 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 50 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 51 | ~~~ 52 | 53 | [Sample IDS](pass-a_classification_facet_with_no_data_matches_any_classification_2_2.ids) - [Sample IFC: 5](pass-a_classification_facet_with_no_data_matches_any_classification_2_2.ifc) 54 | 55 | ## [PASS] Values should match exactly if lightweight classifications are used 56 | 57 | ~~~xml 58 | 59 | 60 | 1 61 | 62 | 63 | ~~~ 64 | 65 | ~~~lua 66 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 67 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 68 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 69 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 70 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 71 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 72 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 73 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 74 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 75 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 76 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 77 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 78 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 79 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 80 | ~~~ 81 | 82 | [Sample IDS](pass-values_should_match_exactly_if_lightweight_classifications_are_used.ids) - [Sample IFC: 5](pass-values_should_match_exactly_if_lightweight_classifications_are_used.ifc) 83 | 84 | ## [PASS] Values match subreferences if full classifications are used (e.g. EF_25_10 should match EF_25_10_25, EF_25_10_30, etc) 85 | 86 | ~~~xml 87 | 88 | 89 | 2 90 | 91 | 92 | ~~~ 93 | 94 | ~~~lua 95 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 96 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 97 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 98 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 99 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 100 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 101 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 102 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 103 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 104 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 105 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); /* Testcase */ 106 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 107 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 108 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 109 | ~~~ 110 | 111 | [Sample IDS](pass-values_match_subreferences_if_full_classifications_are_used__e_g__ef_25_10_should_match_ef_25_10_25__ef_25_10_30__etc_.ids) - [Sample IFC: 11](pass-values_match_subreferences_if_full_classifications_are_used__e_g__ef_25_10_should_match_ef_25_10_25__ef_25_10_30__etc_.ifc) 112 | 113 | ## [PASS] Systems should match exactly 1/5 114 | 115 | ~~~xml 116 | 117 | 118 | Foobar 119 | 120 | 121 | ~~~ 122 | 123 | ~~~lua 124 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); /* Testcase */ 125 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 126 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 127 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 128 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 129 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 130 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 131 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 132 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 133 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 134 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 135 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 136 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 137 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 138 | ~~~ 139 | 140 | [Sample IDS](pass-systems_should_match_exactly_1_5.ids) - [Sample IFC: 1](pass-systems_should_match_exactly_1_5.ifc) 141 | 142 | ## [FAIL] Systems should match exactly 2/5 143 | 144 | ~~~xml 145 | 146 | 147 | Foobar 148 | 149 | 150 | ~~~ 151 | 152 | ~~~lua 153 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 154 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 155 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 156 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); /* Testcase */ 157 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 158 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 159 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 160 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 161 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 162 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 163 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 164 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 165 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 166 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 167 | ~~~ 168 | 169 | [Sample IDS](fail-systems_should_match_exactly_2_5.ids) - [Sample IFC: 4](fail-systems_should_match_exactly_2_5.ifc) 170 | 171 | ## [PASS] Systems should match exactly 3/5 172 | 173 | ~~~xml 174 | 175 | 176 | Foobar 177 | 178 | 179 | ~~~ 180 | 181 | ~~~lua 182 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 183 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 184 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 185 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 186 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 187 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 188 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 189 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 190 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 191 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 192 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 193 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 194 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 195 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 196 | ~~~ 197 | 198 | [Sample IDS](pass-systems_should_match_exactly_3_5.ids) - [Sample IFC: 5](pass-systems_should_match_exactly_3_5.ifc) 199 | 200 | ## [PASS] Systems should match exactly 4/5 201 | 202 | ~~~xml 203 | 204 | 205 | Foobar 206 | 207 | 208 | ~~~ 209 | 210 | ~~~lua 211 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 212 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 213 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 214 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 215 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 216 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 217 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 218 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); /* Testcase */ 219 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 220 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 221 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 222 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 223 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 224 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 225 | ~~~ 226 | 227 | [Sample IDS](pass-systems_should_match_exactly_4_5.ids) - [Sample IFC: 8](pass-systems_should_match_exactly_4_5.ifc) 228 | 229 | ## [PASS] Systems should match exactly 5/5 230 | 231 | ~~~xml 232 | 233 | 234 | Foobar 235 | 236 | 237 | ~~~ 238 | 239 | ~~~lua 240 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 241 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 242 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 243 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 244 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 245 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 246 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 247 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 248 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 249 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 250 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); /* Testcase */ 251 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 252 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 253 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 254 | ~~~ 255 | 256 | [Sample IDS](pass-systems_should_match_exactly_5_5.ids) - [Sample IFC: 11](pass-systems_should_match_exactly_5_5.ifc) 257 | 258 | ## [PASS] Restrictions can be used for values 1/3 259 | 260 | ~~~xml 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | ~~~ 269 | 270 | ~~~lua 271 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 272 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 273 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 274 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 275 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 276 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 277 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 278 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 279 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 280 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 281 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 282 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 283 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 284 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 285 | ~~~ 286 | 287 | [Sample IDS](pass-restrictions_can_be_used_for_values_1_3.ids) - [Sample IFC: 5](pass-restrictions_can_be_used_for_values_1_3.ifc) 288 | 289 | ## [PASS] Restrictions can be used for values 2/3 290 | 291 | ~~~xml 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | ~~~ 300 | 301 | ~~~lua 302 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 303 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 304 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 305 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 306 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 307 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 308 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 309 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); /* Testcase */ 310 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 311 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 312 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 313 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 314 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 315 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 316 | ~~~ 317 | 318 | [Sample IDS](pass-restrictions_can_be_used_for_values_2_3.ids) - [Sample IFC: 8](pass-restrictions_can_be_used_for_values_2_3.ifc) 319 | 320 | ## [FAIL] Restrictions can be used for values 3/3 321 | 322 | ~~~xml 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | ~~~ 331 | 332 | ~~~lua 333 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 334 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 335 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 336 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 337 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 338 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 339 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 340 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 341 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 342 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 343 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); /* Testcase */ 344 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 345 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 346 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 347 | ~~~ 348 | 349 | [Sample IDS](fail-restrictions_can_be_used_for_values_3_3.ids) - [Sample IFC: 11](fail-restrictions_can_be_used_for_values_3_3.ifc) 350 | 351 | ## [FAIL] Restrictions can be used for systems 1/2 352 | 353 | ~~~xml 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | ~~~ 362 | 363 | ~~~lua 364 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 365 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 366 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 367 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); /* Testcase */ 368 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 369 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 370 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 371 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 372 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 373 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 374 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 375 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 376 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 377 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 378 | ~~~ 379 | 380 | [Sample IDS](fail-restrictions_can_be_used_for_systems_1_2.ids) - [Sample IFC: 4](fail-restrictions_can_be_used_for_systems_1_2.ifc) 381 | 382 | ## [PASS] Restrictions can be used for systems 2/2 383 | 384 | ~~~xml 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | ~~~ 393 | 394 | ~~~lua 395 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 396 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 397 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 398 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 399 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 400 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 401 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 402 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 403 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 404 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 405 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 406 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 407 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 408 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 409 | ~~~ 410 | 411 | [Sample IDS](pass-restrictions_can_be_used_for_systems_2_2.ids) - [Sample IFC: 5](pass-restrictions_can_be_used_for_systems_2_2.ifc) 412 | 413 | ## [PASS] Both system and value must match (all, not any) if specified 1/2 414 | 415 | ~~~xml 416 | 417 | 418 | 1 419 | 420 | 421 | Foobar 422 | 423 | 424 | ~~~ 425 | 426 | ~~~lua 427 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 428 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 429 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 430 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 431 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); /* Testcase */ 432 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 433 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 434 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 435 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 436 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 437 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 438 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 439 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 440 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 441 | ~~~ 442 | 443 | [Sample IDS](pass-both_system_and_value_must_match__all__not_any__if_specified_1_2.ids) - [Sample IFC: 5](pass-both_system_and_value_must_match__all__not_any__if_specified_1_2.ifc) 444 | 445 | ## [FAIL] Both system and value must match (all, not any) if specified 2/2 446 | 447 | ~~~xml 448 | 449 | 450 | 1 451 | 452 | 453 | Foobar 454 | 455 | 456 | ~~~ 457 | 458 | ~~~lua 459 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 460 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 461 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 462 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 463 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 464 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 465 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 466 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); /* Testcase */ 467 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 468 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8),#9); 469 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 470 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 471 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 472 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11),#12); 473 | ~~~ 474 | 475 | [Sample IDS](fail-both_system_and_value_must_match__all__not_any__if_specified_2_2.ids) - [Sample IFC: 8](fail-both_system_and_value_must_match__all__not_any__if_specified_2_2.ifc) 476 | 477 | ## [PASS] Occurrences override the type classification per system 1/3 478 | 479 | ~~~xml 480 | 481 | 482 | 11 483 | 484 | 485 | ~~~ 486 | 487 | ~~~lua 488 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 489 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 490 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 491 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 492 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 493 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 494 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 495 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 496 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 497 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8,#16),#9); 498 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 499 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 500 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 501 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11,#17),#12); 502 | #16=IFCWALL('1kMmos_gT3tfAYnna3_nxC',$,$,$,$,$,$,$,$); /* Testcase */ 503 | #17=IFCWALLTYPE('0IXylVDbn64fZ8Hl539Mt0',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); 504 | #18=IFCRELDEFINESBYTYPE('3cAzW6JrbF0A1Ico3iXFmg',$,$,$,(#16),#17); 505 | #19=IFCCLASSIFICATION($,$,$,'Foobaz',$,$,$); 506 | #20=IFCRELASSOCIATESCLASSIFICATION('0DQ_5wcY93x97$qQl2K$e4',$,$,$,(#1),#19); 507 | #21=IFCCLASSIFICATIONREFERENCE($,'X',$,#19,$,$); 508 | #22=IFCRELASSOCIATESCLASSIFICATION('1PiiZ7sI119fVll5yYq110',$,$,$,(#17),#21); 509 | ~~~ 510 | 511 | [Sample IDS](pass-occurrences_override_the_type_classification_per_system_1_3.ids) - [Sample IFC: 16](pass-occurrences_override_the_type_classification_per_system_1_3.ifc) 512 | 513 | ## [FAIL] Occurrences override the type classification per system 2/3 514 | 515 | ~~~xml 516 | 517 | 518 | 22 519 | 520 | 521 | ~~~ 522 | 523 | ~~~lua 524 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 525 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 526 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 527 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 528 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 529 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 530 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 531 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 532 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 533 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8,#16),#9); 534 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 535 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 536 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 537 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11,#17),#12); 538 | #16=IFCWALL('1kMmos_gT3tfAYnna3_nxC',$,$,$,$,$,$,$,$); /* Testcase */ 539 | #17=IFCWALLTYPE('0IXylVDbn64fZ8Hl539Mt0',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); 540 | #18=IFCRELDEFINESBYTYPE('3cAzW6JrbF0A1Ico3iXFmg',$,$,$,(#16),#17); 541 | #19=IFCCLASSIFICATION($,$,$,'Foobaz',$,$,$); 542 | #20=IFCRELASSOCIATESCLASSIFICATION('0DQ_5wcY93x97$qQl2K$e4',$,$,$,(#1),#19); 543 | #21=IFCCLASSIFICATIONREFERENCE($,'X',$,#19,$,$); 544 | #22=IFCRELASSOCIATESCLASSIFICATION('1PiiZ7sI119fVll5yYq110',$,$,$,(#17),#21); 545 | ~~~ 546 | 547 | [Sample IDS](fail-occurrences_override_the_type_classification_per_system_2_3.ids) - [Sample IFC: 16](fail-occurrences_override_the_type_classification_per_system_2_3.ifc) 548 | 549 | ## [PASS] Occurrences override the type classification per system 3/3 550 | 551 | ~~~xml 552 | 553 | 554 | X 555 | 556 | 557 | ~~~ 558 | 559 | ~~~lua 560 | #1=IFCPROJECT('09waczB0TB$hP3cVMWKh6v',$,$,$,$,$,$,$,$); 561 | #2=IFCCLASSIFICATION($,$,$,'Foobar',$,$,$); 562 | #3=IFCRELASSOCIATESCLASSIFICATION('0fShJTRKP9SPlVzqIn__dg',$,$,$,(#1),#2); 563 | #4=IFCWALL('1Ev6VPwkb8DxG$KvUQ61Tj',$,$,$,$,$,$,$,$); 564 | #5=IFCWALL('3IpqHJLorDWOMZfkAsnFyj',$,$,$,$,$,$,$,$); 565 | #6=IFCCLASSIFICATIONREFERENCE($,'1',$,#2,$,$); 566 | #7=IFCRELASSOCIATESCLASSIFICATION('0ySnj2nlzA1PPRHJQQKB8o',$,$,$,(#5),#6); 567 | #8=IFCWALL('3z07og1cf0tRksLXTFwrha',$,$,$,$,$,$,$,$); 568 | #9=IFCCLASSIFICATIONREFERENCE($,'11',$,#2,$,$); 569 | #10=IFCRELASSOCIATESCLASSIFICATION('3r2bqqaZXEE9_leqfSfwZw',$,$,$,(#8,#16),#9); 570 | #11=IFCWALL('3$KOb38H15zuNJocC0Evl1',$,$,$,$,$,$,$,$); 571 | #12=IFCCLASSIFICATIONREFERENCE($,'22',$,#13,$,$); 572 | #13=IFCCLASSIFICATIONREFERENCE($,'2',$,#2,$,$); 573 | #15=IFCRELASSOCIATESCLASSIFICATION('3BndngXerCqR2YTUUqxbaP',$,$,$,(#11,#17),#12); 574 | #16=IFCWALL('1kMmos_gT3tfAYnna3_nxC',$,$,$,$,$,$,$,$); /* Testcase */ 575 | #17=IFCWALLTYPE('0IXylVDbn64fZ8Hl539Mt0',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); 576 | #18=IFCRELDEFINESBYTYPE('3cAzW6JrbF0A1Ico3iXFmg',$,$,$,(#16),#17); 577 | #19=IFCCLASSIFICATION($,$,$,'Foobaz',$,$,$); 578 | #20=IFCRELASSOCIATESCLASSIFICATION('0DQ_5wcY93x97$qQl2K$e4',$,$,$,(#1),#19); 579 | #21=IFCCLASSIFICATIONREFERENCE($,'X',$,#19,$,$); 580 | #22=IFCRELASSOCIATESCLASSIFICATION('1PiiZ7sI119fVll5yYq110',$,$,$,(#17),#21); 581 | ~~~ 582 | 583 | [Sample IDS](pass-occurrences_override_the_type_classification_per_system_3_3.ids) - [Sample IFC: 16](pass-occurrences_override_the_type_classification_per_system_3_3.ifc) 584 | -------------------------------------------------------------------------------- /testcases-entity.md: -------------------------------------------------------------------------------- 1 | # Entity testcases 2 | 3 | These testcases are designed to help describe behaviour in edge cases and ambiguities. All valid IDS implementations must demonstrate identical behaviour to these test cases. 4 | 5 | ## [FAIL] Invalid entities always fail 6 | 7 | ~~~xml 8 | 9 | 10 | IFCRABBIT 11 | 12 | 13 | ~~~ 14 | 15 | ~~~lua 16 | #1=IFCWALL('0PN66raHH4QQ1g$6zEGrRU',$,$,$,$,$,$,$,$); /* Testcase */ 17 | ~~~ 18 | 19 | [Sample IDS](fail-invalid_entities_always_fail.ids) - [Sample IFC: 1](fail-invalid_entities_always_fail.ifc) 20 | 21 | ## [PASS] A matching entity should pass 22 | 23 | ~~~xml 24 | 25 | 26 | IFCWALL 27 | 28 | 29 | ~~~ 30 | 31 | ~~~lua 32 | #1=IFCWALL('1aR5Hnwcz98OES8HsBjdSG',$,$,$,$,$,$,$,$); /* Testcase */ 33 | ~~~ 34 | 35 | [Sample IDS](pass-a_matching_entity_should_pass.ids) - [Sample IFC: 1](pass-a_matching_entity_should_pass.ifc) 36 | 37 | ## [PASS] An matching entity should pass regardless of predefined type 38 | 39 | ~~~xml 40 | 41 | 42 | IFCWALL 43 | 44 | 45 | ~~~ 46 | 47 | ~~~lua 48 | #1=IFCWALL('1hle$JuvfBpAV2if17caId',$,$,$,$,$,$,$,.SOLIDWALL.); /* Testcase */ 49 | ~~~ 50 | 51 | [Sample IDS](pass-an_matching_entity_should_pass_regardless_of_predefined_type.ids) - [Sample IFC: 1](pass-an_matching_entity_should_pass_regardless_of_predefined_type.ifc) 52 | 53 | ## [FAIL] An entity not matching the specified class should fail 54 | 55 | ~~~xml 56 | 57 | 58 | IFCWALL 59 | 60 | 61 | ~~~ 62 | 63 | ~~~lua 64 | #1=IFCSLAB('2oTmJMZhDEsfN6jMl0vh4m',$,$,$,$,$,$,$,$); /* Testcase */ 65 | ~~~ 66 | 67 | [Sample IDS](fail-an_entity_not_matching_the_specified_class_should_fail.ids) - [Sample IFC: 1](fail-an_entity_not_matching_the_specified_class_should_fail.ifc) 68 | 69 | ## [FAIL] Subclasses are not considered as matching 70 | 71 | ~~~xml 72 | 73 | 74 | IFCWALL 75 | 76 | 77 | ~~~ 78 | 79 | ~~~lua 80 | #1=IFCWALLSTANDARDCASE('3fmNQdmkH1T82kcVuxDl1D',$,$,$,$,$,$,$,$); /* Testcase */ 81 | ~~~ 82 | 83 | [Sample IDS](fail-subclasses_are_not_considered_as_matching.ids) - [Sample IFC: 1](fail-subclasses_are_not_considered_as_matching.ifc) 84 | 85 | ## [FAIL] Entities must be specified as uppercase strings 86 | 87 | ~~~xml 88 | 89 | 90 | IfcWall 91 | 92 | 93 | ~~~ 94 | 95 | ~~~lua 96 | #1=IFCWALL('0$sTjqhFX3lhre0RoDE16J',$,$,$,$,$,$,$,$); /* Testcase */ 97 | ~~~ 98 | 99 | [Sample IDS](fail-entities_must_be_specified_as_uppercase_strings.ids) - [Sample IFC: 1](fail-entities_must_be_specified_as_uppercase_strings.ifc) 100 | 101 | ## [PASS] A matching predefined type should pass 102 | 103 | ~~~xml 104 | 105 | 106 | IFCWALL 107 | 108 | 109 | SOLIDWALL 110 | 111 | 112 | ~~~ 113 | 114 | ~~~lua 115 | #1=IFCWALL('2Hl5xImwXDLOXfUVghElTR',$,$,$,$,$,$,$,.SOLIDWALL.); /* Testcase */ 116 | ~~~ 117 | 118 | [Sample IDS](pass-a_matching_predefined_type_should_pass.ids) - [Sample IFC: 1](pass-a_matching_predefined_type_should_pass.ifc) 119 | 120 | ## [FAIL] A null predefined type should always fail a specified predefined types 121 | 122 | ~~~xml 123 | 124 | 125 | IFCWALL 126 | 127 | 128 | SOLIDWALL 129 | 130 | 131 | ~~~ 132 | 133 | ~~~lua 134 | #1=IFCWALL('1NKsCXcmv0$Ao6_9NSlpjG',$,$,$,$,$,$,$,$); /* Testcase */ 135 | ~~~ 136 | 137 | [Sample IDS](fail-a_null_predefined_type_should_always_fail_a_specified_predefined_types.ids) - [Sample IFC: 1](fail-a_null_predefined_type_should_always_fail_a_specified_predefined_types.ifc) 138 | 139 | ## [FAIL] An entity not matching a specified predefined type will fail 140 | 141 | ~~~xml 142 | 143 | 144 | IFCWALL 145 | 146 | 147 | SOLIDWALL 148 | 149 | 150 | ~~~ 151 | 152 | ~~~lua 153 | #1=IFCWALL('1FtvA_VyH5v9_45ykOQxof',$,$,$,$,$,$,$,.PARTITIONING.); /* Testcase */ 154 | ~~~ 155 | 156 | [Sample IDS](fail-an_entity_not_matching_a_specified_predefined_type_will_fail.ids) - [Sample IFC: 1](fail-an_entity_not_matching_a_specified_predefined_type_will_fail.ifc) 157 | 158 | ## [FAIL] A predefined type from an enumeration must be uppercase 159 | 160 | ~~~xml 161 | 162 | 163 | IFCWALL 164 | 165 | 166 | solidwall 167 | 168 | 169 | ~~~ 170 | 171 | ~~~lua 172 | #1=IFCWALL('1UukhMMhX7wP88EGcOeBby',$,$,$,$,$,$,$,.SOLIDWALL.); /* Testcase */ 173 | ~~~ 174 | 175 | [Sample IDS](fail-a_predefined_type_from_an_enumeration_must_be_uppercase.ids) - [Sample IFC: 1](fail-a_predefined_type_from_an_enumeration_must_be_uppercase.ifc) 176 | 177 | ## [PASS] A predefined type may specify a user-defined object type 178 | 179 | ~~~xml 180 | 181 | 182 | IFCWALL 183 | 184 | 185 | WALDO 186 | 187 | 188 | ~~~ 189 | 190 | ~~~lua 191 | #1=IFCWALL('0lop$i0an22hC0GFtfkRQe',$,$,$,'WALDO',$,$,$,.USERDEFINED.); /* Testcase */ 192 | ~~~ 193 | 194 | [Sample IDS](pass-a_predefined_type_may_specify_a_user_defined_object_type.ids) - [Sample IFC: 1](pass-a_predefined_type_may_specify_a_user_defined_object_type.ifc) 195 | 196 | ## [FAIL] User-defined types are checked case sensitively 197 | 198 | ~~~xml 199 | 200 | 201 | IFCWALL 202 | 203 | 204 | WALDO 205 | 206 | 207 | ~~~ 208 | 209 | ~~~lua 210 | #1=IFCWALL('3Rdm1JzOH2vvg59Tfi$Tyl',$,$,$,'waldo',$,$,$,.USERDEFINED.); /* Testcase */ 211 | ~~~ 212 | 213 | [Sample IDS](fail-user_defined_types_are_checked_case_sensitively.ids) - [Sample IFC: 1](fail-user_defined_types_are_checked_case_sensitively.ifc) 214 | 215 | ## [PASS] A predefined type may specify a user-defined element type 216 | 217 | ~~~xml 218 | 219 | 220 | IFCWALLTYPE 221 | 222 | 223 | WALDO 224 | 225 | 226 | ~~~ 227 | 228 | ~~~lua 229 | #1=IFCWALLTYPE('0OXXtCYYbAQP9mrN_CnIKe',$,$,$,$,$,$,$,'WALDO',.USERDEFINED.); /* Testcase */ 230 | ~~~ 231 | 232 | [Sample IDS](pass-a_predefined_type_may_specify_a_user_defined_element_type.ids) - [Sample IFC: 1](pass-a_predefined_type_may_specify_a_user_defined_element_type.ifc) 233 | 234 | ## [PASS] A predefined type may specify a user-defined process type 235 | 236 | ~~~xml 237 | 238 | 239 | IFCTASKTYPE 240 | 241 | 242 | TASKY 243 | 244 | 245 | ~~~ 246 | 247 | ~~~lua 248 | #1=IFCTASKTYPE('31wzn1tiP7vh7$fnZojOsg',$,$,$,$,$,$,$,'TASKY',.USERDEFINED.,$); /* Testcase */ 249 | ~~~ 250 | 251 | [Sample IDS](pass-a_predefined_type_may_specify_a_user_defined_process_type.ids) - [Sample IFC: 1](pass-a_predefined_type_may_specify_a_user_defined_process_type.ifc) 252 | 253 | ## [FAIL] A predefined type must always specify a meaningful type, not USERDEFINED itself 254 | 255 | ~~~xml 256 | 257 | 258 | IFCWALL 259 | 260 | 261 | USERDEFINED 262 | 263 | 264 | ~~~ 265 | 266 | ~~~lua 267 | #1=IFCWALL('29XOgfwprC$B9YVqonvU4_',$,$,$,'WALDO',$,$,$,.USERDEFINED.); /* Testcase */ 268 | ~~~ 269 | 270 | [Sample IDS](fail-a_predefined_type_must_always_specify_a_meaningful_type__not_userdefined_itself.ids) - [Sample IFC: 1](fail-a_predefined_type_must_always_specify_a_meaningful_type__not_userdefined_itself.ifc) 271 | 272 | ## [PASS] Inherited predefined types should pass 273 | 274 | ~~~xml 275 | 276 | 277 | IFCWALL 278 | 279 | 280 | X 281 | 282 | 283 | ~~~ 284 | 285 | ~~~lua 286 | #1=IFCWALL('2ERMTIzsL7Lv5n4IjG0fWg',$,$,$,$,$,$,$,$); /* Testcase */ 287 | #2=IFCWALLTYPE('1wrVkTQIL0PO34wIeg9lmQ',$,$,$,$,$,$,$,'X',.USERDEFINED.); 288 | #3=IFCRELDEFINESBYTYPE('2wKaA4Ykb6lRo6ytiBOb0d',$,$,$,(#1),#2); 289 | ~~~ 290 | 291 | [Sample IDS](pass-inherited_predefined_types_should_pass.ids) - [Sample IFC: 1](pass-inherited_predefined_types_should_pass.ifc) 292 | 293 | ## [PASS] Overridden predefined types should pass 294 | 295 | ~~~xml 296 | 297 | 298 | IFCWALL 299 | 300 | 301 | X 302 | 303 | 304 | ~~~ 305 | 306 | ~~~lua 307 | #1=IFCWALL('3pd6qLf7z2t8VMwKxx26Qg',$,$,$,'X',$,$,$,.USERDEFINED.); /* Testcase */ 308 | #2=IFCWALLTYPE('2qs3jH$lzC8vxg$isYkC6C',$,$,$,$,$,$,$,$,.NOTDEFINED.); 309 | #3=IFCRELDEFINESBYTYPE('0ZtwWfPGXEL85XS7gFcCGg',$,$,$,(#1),#2); 310 | ~~~ 311 | 312 | [Sample IDS](pass-overridden_predefined_types_should_pass.ids) - [Sample IFC: 1](pass-overridden_predefined_types_should_pass.ifc) 313 | 314 | ## [PASS] Entities can be specified as an enumeration 1/3 315 | 316 | ~~~xml 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | ~~~ 326 | 327 | ~~~lua 328 | #1=IFCWALL('0tSzdGkKb89htb2XjPEbxA',$,$,$,$,$,$,$,$); /* Testcase */ 329 | ~~~ 330 | 331 | [Sample IDS](pass-entities_can_be_specified_as_an_enumeration_1_3.ids) - [Sample IFC: 1](pass-entities_can_be_specified_as_an_enumeration_1_3.ifc) 332 | 333 | ## [PASS] Entities can be specified as an enumeration 2/3 334 | 335 | ~~~xml 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | ~~~ 345 | 346 | ~~~lua 347 | #1=IFCSLAB('1iyN6FMOP7GwbozUuU42m0',$,$,$,$,$,$,$,$); /* Testcase */ 348 | ~~~ 349 | 350 | [Sample IDS](pass-entities_can_be_specified_as_an_enumeration_2_3.ids) - [Sample IFC: 1](pass-entities_can_be_specified_as_an_enumeration_2_3.ifc) 351 | 352 | ## [FAIL] Entities can be specified as an enumeration 3/3 353 | 354 | ~~~xml 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | ~~~ 364 | 365 | ~~~lua 366 | #1=IFCBEAM('2bBUe2R0b9dvOpCnq_Qfkm',$,$,$,$,$,$,$,$); /* Testcase */ 367 | ~~~ 368 | 369 | [Sample IDS](fail-entities_can_be_specified_as_an_enumeration_3_3.ids) - [Sample IFC: 1](fail-entities_can_be_specified_as_an_enumeration_3_3.ifc) 370 | 371 | ## [FAIL] Entities can be specified as a XSD regex pattern 1/2 372 | 373 | ~~~xml 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | ~~~ 382 | 383 | ~~~lua 384 | #1=IFCWALL('23RVloAM566P_TmX4fYS_M',$,$,$,$,$,$,$,$); /* Testcase */ 385 | ~~~ 386 | 387 | [Sample IDS](fail-entities_can_be_specified_as_a_xsd_regex_pattern_1_2.ids) - [Sample IFC: 1](fail-entities_can_be_specified_as_a_xsd_regex_pattern_1_2.ifc) 388 | 389 | ## [PASS] Entities can be specified as a XSD regex pattern 2/2 390 | 391 | ~~~xml 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | ~~~ 400 | 401 | ~~~lua 402 | #1=IFCWALLTYPE('19v0GfRDD2UPa5aSDxsRTZ',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); /* Testcase */ 403 | ~~~ 404 | 405 | [Sample IDS](pass-entities_can_be_specified_as_a_xsd_regex_pattern_2_2.ids) - [Sample IFC: 1](pass-entities_can_be_specified_as_a_xsd_regex_pattern_2_2.ifc) 406 | 407 | ## [PASS] Restrictions an be specified for the predefined type 1/3 408 | 409 | ~~~xml 410 | 411 | 412 | IFCWALL 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | ~~~ 421 | 422 | ~~~lua 423 | #1=IFCWALL('3_26sgRW96r8d$iSmhzJFh',$,$,$,'FOOBAR',$,$,$,.USERDEFINED.); /* Testcase */ 424 | ~~~ 425 | 426 | [Sample IDS](pass-restrictions_an_be_specified_for_the_predefined_type_1_3.ids) - [Sample IFC: 1](pass-restrictions_an_be_specified_for_the_predefined_type_1_3.ifc) 427 | 428 | ## [PASS] Restrictions an be specified for the predefined type 2/3 429 | 430 | ~~~xml 431 | 432 | 433 | IFCWALL 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | ~~~ 442 | 443 | ~~~lua 444 | #1=IFCWALL('2lcbUouZ93U9bunLnnaGJ$',$,$,$,'FOOBAZ',$,$,$,.USERDEFINED.); /* Testcase */ 445 | ~~~ 446 | 447 | [Sample IDS](pass-restrictions_an_be_specified_for_the_predefined_type_2_3.ids) - [Sample IFC: 1](pass-restrictions_an_be_specified_for_the_predefined_type_2_3.ifc) 448 | 449 | ## [FAIL] Restrictions an be specified for the predefined type 3/3 450 | 451 | ~~~xml 452 | 453 | 454 | IFCWALL 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | ~~~ 463 | 464 | ~~~lua 465 | #1=IFCWALL('1m9oC3eIX7Og9Jx6gVeY83',$,$,$,'BAZFOO',$,$,$,.USERDEFINED.); /* Testcase */ 466 | ~~~ 467 | 468 | [Sample IDS](fail-restrictions_an_be_specified_for_the_predefined_type_3_3.ids) - [Sample IFC: 1](fail-restrictions_an_be_specified_for_the_predefined_type_3_3.ifc) 469 | -------------------------------------------------------------------------------- /testcases-material.md: -------------------------------------------------------------------------------- 1 | # Material testcases 2 | 3 | These testcases are designed to help describe behaviour in edge cases and ambiguities. All valid IDS implementations must demonstrate identical behaviour to these test cases. 4 | 5 | ## [FAIL] Elements without a material always fail 6 | 7 | ~~~xml 8 | 9 | ~~~ 10 | 11 | ~~~lua 12 | #1=IFCWALL('319PHYQJ983OMIXOhty3wX',$,$,$,$,$,$,$,$); /* Testcase */ 13 | ~~~ 14 | 15 | [Sample IDS](fail-elements_without_a_material_always_fail.ids) - [Sample IFC: 1](fail-elements_without_a_material_always_fail.ifc) 16 | 17 | ## [PASS] Elements with any material will pass an empty material facet 18 | 19 | ~~~xml 20 | 21 | ~~~ 22 | 23 | ~~~lua 24 | #1=IFCWALL('319PHYQJ983OMIXOhty3wX',$,$,$,$,$,$,$,$); /* Testcase */ 25 | #2=IFCMATERIAL('Unnamed',$,$); 26 | #3=IFCRELASSOCIATESMATERIAL('2UT14UeKn8Jgvg8AVitqxV',$,$,$,(#1),#2); 27 | ~~~ 28 | 29 | [Sample IDS](pass-elements_with_any_material_will_pass_an_empty_material_facet.ids) - [Sample IFC: 1](pass-elements_with_any_material_will_pass_an_empty_material_facet.ifc) 30 | 31 | ## [FAIL] Material with no data will fail a value check 32 | 33 | ~~~xml 34 | 35 | 36 | Foo 37 | 38 | 39 | ~~~ 40 | 41 | ~~~lua 42 | #1=IFCWALL('0BRc9rmaj4b8Rpv2AtUYeQ',$,$,$,$,$,$,$,$); /* Testcase */ 43 | #2=IFCMATERIAL('Unnamed',$,$); 44 | #3=IFCRELASSOCIATESMATERIAL('0J4ry8qxH87vhK1Vg7VgHg',$,$,$,(#1),#2); 45 | ~~~ 46 | 47 | [Sample IDS](fail-material_with_no_data_will_fail_a_value_check.ids) - [Sample IFC: 1](fail-material_with_no_data_will_fail_a_value_check.ifc) 48 | 49 | ## [PASS] A material name may pass the value check 50 | 51 | ~~~xml 52 | 53 | 54 | Foo 55 | 56 | 57 | ~~~ 58 | 59 | ~~~lua 60 | #1=IFCWALL('0BRc9rmaj4b8Rpv2AtUYeQ',$,$,$,$,$,$,$,$); /* Testcase */ 61 | #2=IFCMATERIAL('Foo',$,$); 62 | #3=IFCRELASSOCIATESMATERIAL('0J4ry8qxH87vhK1Vg7VgHg',$,$,$,(#1),#2); 63 | ~~~ 64 | 65 | [Sample IDS](pass-a_material_name_may_pass_the_value_check.ids) - [Sample IFC: 1](pass-a_material_name_may_pass_the_value_check.ifc) 66 | 67 | ## [PASS] A material category may pass the value check 68 | 69 | ~~~xml 70 | 71 | 72 | Foo 73 | 74 | 75 | ~~~ 76 | 77 | ~~~lua 78 | #1=IFCWALL('0BRc9rmaj4b8Rpv2AtUYeQ',$,$,$,$,$,$,$,$); /* Testcase */ 79 | #2=IFCMATERIAL('Bar',$,'Foo'); 80 | #3=IFCRELASSOCIATESMATERIAL('0J4ry8qxH87vhK1Vg7VgHg',$,$,$,(#1),#2); 81 | ~~~ 82 | 83 | [Sample IDS](pass-a_material_category_may_pass_the_value_check.ids) - [Sample IFC: 1](pass-a_material_category_may_pass_the_value_check.ifc) 84 | 85 | ## [FAIL] A material list with no data will fail a value check 86 | 87 | ~~~xml 88 | 89 | 90 | Foo 91 | 92 | 93 | ~~~ 94 | 95 | ~~~lua 96 | #1=IFCWALL('2wkcl770zD19WuAXtn7I5e',$,$,$,$,$,$,$,$); /* Testcase */ 97 | #2=IFCMATERIALLIST((#4)); 98 | #3=IFCRELASSOCIATESMATERIAL('2Xh8a8fo12LRJMfv4$ro6D',$,$,$,(#1),#2); 99 | #4=IFCMATERIAL('Concrete',$,'CONCRETE'); 100 | ~~~ 101 | 102 | [Sample IDS](fail-a_material_list_with_no_data_will_fail_a_value_check.ids) - [Sample IFC: 1](fail-a_material_list_with_no_data_will_fail_a_value_check.ifc) 103 | 104 | ## [PASS] Any material Name in a list will pass a value check 105 | 106 | ~~~xml 107 | 108 | 109 | Foo 110 | 111 | 112 | ~~~ 113 | 114 | ~~~lua 115 | #1=IFCWALL('2wkcl770zD19WuAXtn7I5e',$,$,$,$,$,$,$,$); /* Testcase */ 116 | #2=IFCMATERIALLIST((#4,#5)); 117 | #3=IFCRELASSOCIATESMATERIAL('2Xh8a8fo12LRJMfv4$ro6D',$,$,$,(#1),#2); 118 | #4=IFCMATERIAL('Concrete',$,'CONCRETE'); 119 | #5=IFCMATERIAL('Foo',$,$); 120 | ~~~ 121 | 122 | [Sample IDS](pass-any_material_name_in_a_list_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_name_in_a_list_will_pass_a_value_check.ifc) 123 | 124 | ## [PASS] Any material Category in a list will pass a value check 125 | 126 | ~~~xml 127 | 128 | 129 | Foo 130 | 131 | 132 | ~~~ 133 | 134 | ~~~lua 135 | #1=IFCWALL('2wkcl770zD19WuAXtn7I5e',$,$,$,$,$,$,$,$); /* Testcase */ 136 | #2=IFCMATERIALLIST((#4,#5)); 137 | #3=IFCRELASSOCIATESMATERIAL('2Xh8a8fo12LRJMfv4$ro6D',$,$,$,(#1),#2); 138 | #4=IFCMATERIAL('Concrete',$,'CONCRETE'); 139 | #5=IFCMATERIAL('Bar',$,'Foo'); 140 | ~~~ 141 | 142 | [Sample IDS](pass-any_material_category_in_a_list_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_category_in_a_list_will_pass_a_value_check.ifc) 143 | 144 | ## [PASS] Any layer Name in a layer set will pass a value check 145 | 146 | ~~~xml 147 | 148 | 149 | Foo 150 | 151 | 152 | ~~~ 153 | 154 | ~~~lua 155 | #1=IFCWALL('02WPqwNff3PvOsDvPQ9aoT',$,$,$,$,$,$,$,$); /* Testcase */ 156 | #2=IFCMATERIALLAYERSET((#5),'Unnamed',$); 157 | #3=IFCRELASSOCIATESMATERIAL('0IJElgCAH5QgUZYJCIpVdF',$,$,$,(#1),#2); 158 | #4=IFCMATERIAL('Unnamed',$,$); 159 | #5=IFCMATERIALLAYER(#4,1.,$,'Foo',$,$,$); 160 | ~~~ 161 | 162 | [Sample IDS](pass-any_layer_name_in_a_layer_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_layer_name_in_a_layer_set_will_pass_a_value_check.ifc) 163 | 164 | ## [PASS] Any layer Category in a layer set will pass a value check 165 | 166 | ~~~xml 167 | 168 | 169 | Foo 170 | 171 | 172 | ~~~ 173 | 174 | ~~~lua 175 | #1=IFCWALL('02WPqwNff3PvOsDvPQ9aoT',$,$,$,$,$,$,$,$); /* Testcase */ 176 | #2=IFCMATERIALLAYERSET((#5),'Unnamed',$); 177 | #3=IFCRELASSOCIATESMATERIAL('0IJElgCAH5QgUZYJCIpVdF',$,$,$,(#1),#2); 178 | #4=IFCMATERIAL('Unnamed',$,$); 179 | #5=IFCMATERIALLAYER(#4,1.,$,'Bar',$,'Foo',$); 180 | ~~~ 181 | 182 | [Sample IDS](pass-any_layer_category_in_a_layer_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_layer_category_in_a_layer_set_will_pass_a_value_check.ifc) 183 | 184 | ## [PASS] Any material Name in a layer set will pass a value check 185 | 186 | ~~~xml 187 | 188 | 189 | Foo 190 | 191 | 192 | ~~~ 193 | 194 | ~~~lua 195 | #1=IFCWALL('02WPqwNff3PvOsDvPQ9aoT',$,$,$,$,$,$,$,$); /* Testcase */ 196 | #2=IFCMATERIALLAYERSET((#5),'Unnamed',$); 197 | #3=IFCRELASSOCIATESMATERIAL('0IJElgCAH5QgUZYJCIpVdF',$,$,$,(#1),#2); 198 | #4=IFCMATERIAL('Foo',$,$); 199 | #5=IFCMATERIALLAYER(#4,1.,$,'Bar',$,'Bar',$); 200 | ~~~ 201 | 202 | [Sample IDS](pass-any_material_name_in_a_layer_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_name_in_a_layer_set_will_pass_a_value_check.ifc) 203 | 204 | ## [PASS] Any material Category in a layer set will pass a value check 205 | 206 | ~~~xml 207 | 208 | 209 | Foo 210 | 211 | 212 | ~~~ 213 | 214 | ~~~lua 215 | #1=IFCWALL('02WPqwNff3PvOsDvPQ9aoT',$,$,$,$,$,$,$,$); /* Testcase */ 216 | #2=IFCMATERIALLAYERSET((#5),'Unnamed',$); 217 | #3=IFCRELASSOCIATESMATERIAL('0IJElgCAH5QgUZYJCIpVdF',$,$,$,(#1),#2); 218 | #4=IFCMATERIAL('Bar',$,'Foo'); 219 | #5=IFCMATERIALLAYER(#4,1.,$,'Bar',$,'Bar',$); 220 | ~~~ 221 | 222 | [Sample IDS](pass-any_material_category_in_a_layer_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_category_in_a_layer_set_will_pass_a_value_check.ifc) 223 | 224 | ## [PASS] Any profile Name in a profile set will pass a value check 225 | 226 | ~~~xml 227 | 228 | 229 | Foo 230 | 231 | 232 | ~~~ 233 | 234 | ~~~lua 235 | #1=IFCWALL('0ikno0YNn5b94GQ2O92ciQ',$,$,$,$,$,$,$,$); /* Testcase */ 236 | #2=IFCMATERIALPROFILESET('Unnamed',$,(#5),$); 237 | #3=IFCRELASSOCIATESMATERIAL('3PxleJXSj2NRcXuQJYL$_5',$,$,$,(#1),#2); 238 | #4=IFCMATERIAL('Unnamed',$,$); 239 | #5=IFCMATERIALPROFILE('Foo',$,#4,#6,$,$); 240 | #6=IFCCIRCLEPROFILEDEF(.AREA.,$,$,1.); 241 | ~~~ 242 | 243 | [Sample IDS](pass-any_profile_name_in_a_profile_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_profile_name_in_a_profile_set_will_pass_a_value_check.ifc) 244 | 245 | ## [PASS] Any profile Category in a profile set will pass a value check 246 | 247 | ~~~xml 248 | 249 | 250 | Foo 251 | 252 | 253 | ~~~ 254 | 255 | ~~~lua 256 | #1=IFCWALL('0ikno0YNn5b94GQ2O92ciQ',$,$,$,$,$,$,$,$); /* Testcase */ 257 | #2=IFCMATERIALPROFILESET('Unnamed',$,(#5),$); 258 | #3=IFCRELASSOCIATESMATERIAL('3PxleJXSj2NRcXuQJYL$_5',$,$,$,(#1),#2); 259 | #4=IFCMATERIAL('Unnamed',$,$); 260 | #5=IFCMATERIALPROFILE('Bar',$,#4,#6,$,'Foo'); 261 | #6=IFCCIRCLEPROFILEDEF(.AREA.,$,$,1.); 262 | ~~~ 263 | 264 | [Sample IDS](pass-any_profile_category_in_a_profile_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_profile_category_in_a_profile_set_will_pass_a_value_check.ifc) 265 | 266 | ## [PASS] Any material Name in a profile set will pass a value check 267 | 268 | ~~~xml 269 | 270 | 271 | Foo 272 | 273 | 274 | ~~~ 275 | 276 | ~~~lua 277 | #1=IFCWALL('0ikno0YNn5b94GQ2O92ciQ',$,$,$,$,$,$,$,$); /* Testcase */ 278 | #2=IFCMATERIALPROFILESET('Unnamed',$,(#5),$); 279 | #3=IFCRELASSOCIATESMATERIAL('3PxleJXSj2NRcXuQJYL$_5',$,$,$,(#1),#2); 280 | #4=IFCMATERIAL('Foo',$,$); 281 | #5=IFCMATERIALPROFILE('Bar',$,#4,#6,$,'Bar'); 282 | #6=IFCCIRCLEPROFILEDEF(.AREA.,$,$,1.); 283 | ~~~ 284 | 285 | [Sample IDS](pass-any_material_name_in_a_profile_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_name_in_a_profile_set_will_pass_a_value_check.ifc) 286 | 287 | ## [PASS] Any material category in a profile set will pass a value check 288 | 289 | ~~~xml 290 | 291 | 292 | Foo 293 | 294 | 295 | ~~~ 296 | 297 | ~~~lua 298 | #1=IFCWALL('0ikno0YNn5b94GQ2O92ciQ',$,$,$,$,$,$,$,$); /* Testcase */ 299 | #2=IFCMATERIALPROFILESET('Unnamed',$,(#5),$); 300 | #3=IFCRELASSOCIATESMATERIAL('3PxleJXSj2NRcXuQJYL$_5',$,$,$,(#1),#2); 301 | #4=IFCMATERIAL('Bar',$,'Foo'); 302 | #5=IFCMATERIALPROFILE('Bar',$,#4,#6,$,'Bar'); 303 | #6=IFCCIRCLEPROFILEDEF(.AREA.,$,$,1.); 304 | ~~~ 305 | 306 | [Sample IDS](pass-any_material_category_in_a_profile_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_category_in_a_profile_set_will_pass_a_value_check.ifc) 307 | 308 | ## [FAIL] A constituent set with no data will fail a value check 309 | 310 | ~~~xml 311 | 312 | 313 | Foo 314 | 315 | 316 | ~~~ 317 | 318 | ~~~lua 319 | #1=IFCWALL('0$1VfYP5z0KBH2TJ5sSRrf',$,$,$,$,$,$,$,$); /* Testcase */ 320 | #2=IFCMATERIALCONSTITUENTSET('Unnamed',$,$); 321 | #3=IFCRELASSOCIATESMATERIAL('2urDqpdqTEX8YbzokRx8Ic',$,$,$,(#1),#2); 322 | ~~~ 323 | 324 | [Sample IDS](fail-a_constituent_set_with_no_data_will_fail_a_value_check.ids) - [Sample IFC: 1](fail-a_constituent_set_with_no_data_will_fail_a_value_check.ifc) 325 | 326 | ## [PASS] Any constituent Name in a constituent set will pass a value check 327 | 328 | ~~~xml 329 | 330 | 331 | Foo 332 | 333 | 334 | ~~~ 335 | 336 | ~~~lua 337 | #1=IFCWALL('0$1VfYP5z0KBH2TJ5sSRrf',$,$,$,$,$,$,$,$); /* Testcase */ 338 | #2=IFCMATERIALCONSTITUENTSET('Unnamed',$,(#5)); 339 | #3=IFCRELASSOCIATESMATERIAL('2urDqpdqTEX8YbzokRx8Ic',$,$,$,(#1),#2); 340 | #4=IFCMATERIAL('Unnamed',$,$); 341 | #5=IFCMATERIALCONSTITUENT('Foo',$,#4,$,$); 342 | ~~~ 343 | 344 | [Sample IDS](pass-any_constituent_name_in_a_constituent_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_constituent_name_in_a_constituent_set_will_pass_a_value_check.ifc) 345 | 346 | ## [PASS] Any constituent Category in a constituent set will pass a value check 347 | 348 | ~~~xml 349 | 350 | 351 | Foo 352 | 353 | 354 | ~~~ 355 | 356 | ~~~lua 357 | #1=IFCWALL('0$1VfYP5z0KBH2TJ5sSRrf',$,$,$,$,$,$,$,$); /* Testcase */ 358 | #2=IFCMATERIALCONSTITUENTSET('Unnamed',$,(#5)); 359 | #3=IFCRELASSOCIATESMATERIAL('2urDqpdqTEX8YbzokRx8Ic',$,$,$,(#1),#2); 360 | #4=IFCMATERIAL('Unnamed',$,$); 361 | #5=IFCMATERIALCONSTITUENT('Bar',$,#4,$,'Foo'); 362 | ~~~ 363 | 364 | [Sample IDS](pass-any_constituent_category_in_a_constituent_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_constituent_category_in_a_constituent_set_will_pass_a_value_check.ifc) 365 | 366 | ## [PASS] Any material Name in a constituent set will pass a value check 367 | 368 | ~~~xml 369 | 370 | 371 | Foo 372 | 373 | 374 | ~~~ 375 | 376 | ~~~lua 377 | #1=IFCWALL('0$1VfYP5z0KBH2TJ5sSRrf',$,$,$,$,$,$,$,$); /* Testcase */ 378 | #2=IFCMATERIALCONSTITUENTSET('Unnamed',$,(#5)); 379 | #3=IFCRELASSOCIATESMATERIAL('2urDqpdqTEX8YbzokRx8Ic',$,$,$,(#1),#2); 380 | #4=IFCMATERIAL('Foo',$,$); 381 | #5=IFCMATERIALCONSTITUENT('Bar',$,#4,$,'Bar'); 382 | ~~~ 383 | 384 | [Sample IDS](pass-any_material_name_in_a_constituent_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_name_in_a_constituent_set_will_pass_a_value_check.ifc) 385 | 386 | ## [PASS] Any material Category in a constituent set will pass a value check 387 | 388 | ~~~xml 389 | 390 | 391 | Foo 392 | 393 | 394 | ~~~ 395 | 396 | ~~~lua 397 | #1=IFCWALL('0$1VfYP5z0KBH2TJ5sSRrf',$,$,$,$,$,$,$,$); /* Testcase */ 398 | #2=IFCMATERIALCONSTITUENTSET('Unnamed',$,(#5)); 399 | #3=IFCRELASSOCIATESMATERIAL('2urDqpdqTEX8YbzokRx8Ic',$,$,$,(#1),#2); 400 | #4=IFCMATERIAL('Bar',$,'Foo'); 401 | #5=IFCMATERIALCONSTITUENT('Bar',$,#4,$,'Bar'); 402 | ~~~ 403 | 404 | [Sample IDS](pass-any_material_category_in_a_constituent_set_will_pass_a_value_check.ids) - [Sample IFC: 1](pass-any_material_category_in_a_constituent_set_will_pass_a_value_check.ifc) 405 | 406 | ## [PASS] Occurrences can inherit materials from their types 407 | 408 | ~~~xml 409 | 410 | 411 | Foo 412 | 413 | 414 | ~~~ 415 | 416 | ~~~lua 417 | #1=IFCWALL('1xV32aA6bB1QfmT1UYJ5M7',$,$,$,$,$,$,$,$); /* Testcase */ 418 | #2=IFCWALLTYPE('04g7LjBs55N8_ewCD0Wbrc',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); 419 | #3=IFCRELDEFINESBYTYPE('0MmnMW2yzDrQBqAf_TIZx5',$,$,$,(#1),#2); 420 | #4=IFCMATERIAL('Foo',$,$); 421 | #5=IFCRELASSOCIATESMATERIAL('2P2pXIWmjAsvs_Rwg67q2S',$,$,$,(#2),#4); 422 | ~~~ 423 | 424 | [Sample IDS](pass-occurrences_can_inherit_materials_from_their_types.ids) - [Sample IFC: 1](pass-occurrences_can_inherit_materials_from_their_types.ifc) 425 | 426 | ## [PASS] Occurrences can override materials from their types 427 | 428 | ~~~xml 429 | 430 | 431 | Foo 432 | 433 | 434 | ~~~ 435 | 436 | ~~~lua 437 | #1=IFCWALL('32Dle6WzzFFhwvPjiS58DD',$,$,$,$,$,$,$,$); /* Testcase */ 438 | #2=IFCWALLTYPE('1qN2zbMzDCLeFthwWoeox5',$,$,$,$,$,$,$,$,.ELEMENTEDWALL.); 439 | #3=IFCRELDEFINESBYTYPE('0kAZF6dv902etnJ_Y6rjg_',$,$,$,(#1),#2); 440 | #4=IFCMATERIAL('Bar',$,$); 441 | #5=IFCRELASSOCIATESMATERIAL('1ygeyuwcLE4gjQ9TcEGvU0',$,$,$,(#2),#4); 442 | #6=IFCMATERIAL('Foo',$,$); 443 | #7=IFCRELASSOCIATESMATERIAL('3Q9uFawKP4bxJudw3HPvir',$,$,$,(#1),#6); 444 | ~~~ 445 | 446 | [Sample IDS](pass-occurrences_can_override_materials_from_their_types.ids) - [Sample IFC: 1](pass-occurrences_can_override_materials_from_their_types.ifc) 447 | --------------------------------------------------------------------------------