├── .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 | 
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 | 
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 | 
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 | 
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 |
- **Entity Facet** (**IFC Class** is IfcWall)
- **Property Facet** (**Property Set** is Pset_WallCommon, **Name** is LoadBearing, **Value** is TRUE)
| - **Property Facet** (**Property Set** is Pset_WallCommon, **Name** is FireRating)
45 | Bedrooms should have a minimum area of 10m2 | - **Entity Facet** (**IFC Class** is IfcSpace)
- **Attribute Facet** (**Description** must contain the text "BEDROOM")
| - **Property Facet** (**Property Set** is Qto_SpaceBaseQuantities, **Name** is NetFloorArea, **Value** is >= 10)
46 | All brick wall types must be classified and follow the approved naming convention | - **Entity Facet** (**IFC Class** is IfcWallType)
- **Material Facet** (**Value** is brick)
| - **Classification Facet** (**System** is Uniclass 2015, **Value** must start with EF_25_10)
- **Attribute Facet** (**Name** is Name, **Value** must be the letters "WT" followed by 2 numbers, such as WT01, WT02, etc)
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 |
--------------------------------------------------------------------------------