Add some continuous integration config

This commit is contained in:
Bruno Postle 2026-02-24 23:19:12 +00:00
parent 6a7e6a5d84
commit 3b00c8d80e
4 changed files with 315 additions and 0 deletions

88
.github/workflows/ids-lint.yml vendored Normal file
View file

@ -0,0 +1,88 @@
name: IDS Compliance Check
on:
push:
pull_request:
workflow_dispatch:
jobs:
ids-lint:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install ifctester and idssplit
run: |
pip install ifctester
pip install --no-deps https://github.com/brunopostle/idssplit/releases/download/0.1.0/idssplit-0.1.0-py3-none-any.whl
- name: Run IDS validations
run: |
set -e
shopt -s globstar nullglob
if [ ! -d IDS ]; then
echo "No IDS/ folder found"
exit 0
fi
ids_sources=(IDS/**/*.ids)
if [ ${#ids_sources[@]} -eq 0 ]; then
echo "No IDS files found in IDS/ folder"
exit 0
fi
ifc_files=(**/*.ifc)
if [ ${#ifc_files[@]} -eq 0 ]; then
echo "No IFC files found"
exit 0
fi
mkdir -p split_ids
echo "Splitting IDS files..."
for ids in "${ids_sources[@]}"; do
idssplit "$ids" split_ids/
done
split_ids_files=(split_ids/*.ids)
if [ ${#split_ids_files[@]} -eq 0 ]; then
echo "No rules found after splitting IDS files"
exit 1
fi
echo "Running ifctester validations..."
failed=0
for rule_ids in "${split_ids_files[@]}"; do
for ifc in "${ifc_files[@]}"; do
echo "::group::Test: $rule_ids with $ifc"
echo "Testing: $rule_ids with $ifc"
output=$(python3 -m ifctester --no-color "$rule_ids" "$ifc" || true)
echo "$output"
echo "::endgroup::"
if echo "$output" | grep -q '\[FAIL\]'; then
echo "FAIL: $rule_ids with $ifc"
failed=1
else
echo "PASS: $rule_ids with $ifc"
fi
done
done
if [ "$failed" -ne 0 ]; then
echo "One or more validations failed"
exit 1
else
echo "All validations passed"
fi

32
.github/workflows/ifc-lint.yml vendored Normal file
View file

@ -0,0 +1,32 @@
name: IFC Validation
on:
push:
pull_request:
jobs:
lint-ifc:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install ifcopenshell
run: |
pip install pytest
pip install ifcopenshell
- name: Run IFC lint checks
run: |
set -e
shopt -s globstar nullglob
for file in **/*.ifc; do
echo "Validating $file..."
python3 -m ifcopenshell.validate --rules "$file"
done

114
IDS/EN_Basic IDM Check.ids Normal file
View file

@ -0,0 +1,114 @@
<?xml version="1.0" encoding="utf-8"?>
<ids xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://standards.buildingsmart.org/IDS">
<info>
<title>EN_Basic IDM Check</title>
<description>Example IDS for model validation according to the BIM Basic Information Delivery Manual (IDM)</description>
<author>sgolchinfar@bimcollab.com</author>
<date>2024-10-29</date>
<purpose>Specify a set of agreements that IFC models must meet according to the basic IDM.</purpose>
</info>
<specifications>
<specification name="(3.4) Current use of Entities" description="Run specification to get a list of all IfcBuildingElementProxy elements in your model. It is important to select the most suitable IFC Class for your elements and try to avoid using IfcBuildingElementProxy whenever possible." ifcVersion="IFC2X3 IFC4">
<applicability minOccurs="0">
<entity>
<name>
<simpleValue>IFCBUILDINGELEMENTPROXY</simpleValue>
</name>
</entity>
</applicability>
<requirements>
<attribute>
<name>
<simpleValue>GlobalId</simpleValue>
</name>
<value>
<simpleValue>?</simpleValue>
</value>
</attribute>
</requirements>
</specification>
<specification name="(4.5) Fire Safety" description="Ensures that the FireRating values are adequate for internal, load-bearing walls [ 1. Use the sections 'Property set' and 'Property name' in case you would like to modify the elements to examine. In this case, we look for internal, load-bearing wall elements. 2. In the 'Value' field, indicate the FireRating required ]" ifcVersion="IFC2X3 IFC4">
<applicability minOccurs="0">
<property>
<propertySet>
<simpleValue>Pset_WallCommon</simpleValue>
</propertySet>
<baseName>
<simpleValue>IsExternal</simpleValue>
</baseName>
<value>
<simpleValue>False</simpleValue>
</value>
</property>
<property>
<propertySet>
<simpleValue>Pset_WallCommon</simpleValue>
</propertySet>
<baseName>
<simpleValue>LoadBearing</simpleValue>
</baseName>
<value>
<simpleValue>True</simpleValue>
</value>
</property>
</applicability>
<requirements>
<property>
<propertySet>
<simpleValue>Pset_WallCommon</simpleValue>
</propertySet>
<baseName>
<simpleValue>FireRating</simpleValue>
</baseName>
<value>
<simpleValue>30</simpleValue>
</value>
</property>
</requirements>
</specification>
<specification name="(4.6) Building Physics Properties (Thermal Transmitance)" description="Check the presence of building physics properties in the selected elements. Here we test if the ThermalTransmittance (U-value) values are defined for wall elements. Other examples of common building physics properties are AcousticRating (soundproofing), SolarHeatGainTransmittance (SGGC value), and Translucency (light transmission) [ 1. Use the sections 'Property set' and 'Property Name' to modify the IFC Class and building physics properties to examine ]" ifcVersion="IFC2X3 IFC4">
<applicability minOccurs="0">
<property>
<propertySet>
<simpleValue>Pset_WallCommon</simpleValue>
</propertySet>
<baseName>
<simpleValue>IsExternal</simpleValue>
</baseName>
<value>
<simpleValue>True</simpleValue>
</value>
</property>
</applicability>
<requirements>
<property>
<propertySet>
<simpleValue>Pset_WallCommon</simpleValue>
</propertySet>
<baseName>
<simpleValue>Thermal Transmitance</simpleValue>
</baseName>
</property>
</requirements>
</specification>
<specification name="(4.8) Project specific properties" description="Determine if custom properties defined by your project requirements are present in the selected elements [ 1. Use the 'IFC Element' section to select the IFC class you would like to test. 2. Modify the values of 'Property set' and 'Property name' to indicate your custom properties ]" ifcVersion="IFC2X3 IFC4">
<applicability minOccurs="0">
<entity>
<name>
<simpleValue>IFCFLOWSEGMENT</simpleValue>
</name>
</entity>
</applicability>
<requirements>
<property>
<propertySet>
<simpleValue>AC_Pset_RenovationAndPhasing</simpleValue>
</propertySet>
<baseName>
<simpleValue>Renovation Status</simpleValue>
</baseName>
</property>
</requirements>
</specification>
</specifications>
</ids>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ids:ids xmlns:ids="http://standards.buildingsmart.org/IDS" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://standards.buildingsmart.org/IDS http://standards.buildingsmart.org/IDS/1.0/ids.xsd">
<ids:info>
<ids:title>random example to show technical capabilities and usage</ids:title>
<ids:copyright>buildingSMART International Ltd</ids:copyright>
<ids:date>2021-09-17</ids:date>
</ids:info>
<ids:specifications>
<ids:specification ifcVersion="IFC2X3 IFC4X3_ADD2" name="ramen">
<ids:applicability minOccurs="0" maxOccurs="unbounded">
<ids:entity>
<ids:name>
<ids:simpleValue>IFCWINDOW</ids:simpleValue>
</ids:name>
</ids:entity>
<ids:classification>
<ids:value>
<xs:restriction base="xs:string">
<xs:annotation>
<xs:documentation>The value should be a number; a dot; another number. For example '1.1', '2.4', etc.</xs:documentation>
</xs:annotation>
<xs:pattern value="[0-9]\.[0-9]"/>
</xs:restriction>
</ids:value>
<ids:system>
<ids:simpleValue>NL-Sfb</ids:simpleValue>
</ids:system>
</ids:classification>
</ids:applicability>
<ids:requirements>
<ids:property dataType="IFCLENGTHMEASURE">
<ids:propertySet>
<ids:simpleValue>attribute</ids:simpleValue>
</ids:propertySet>
<ids:baseName>
<ids:simpleValue>OverallWidth</ids:simpleValue>
</ids:baseName>
<ids:value>
<xs:restriction base="xs:double">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</ids:value>
</ids:property>
<ids:property dataType="IFCTEXT" uri="http://identifier.buildingsmart.org/uri/dummy-example/FireRating">
<ids:propertySet>
<ids:simpleValue>AedesUVIP</ids:simpleValue>
</ids:propertySet>
<ids:baseName>
<ids:simpleValue>FireRating</ids:simpleValue>
</ids:baseName>
<ids:value>
<xs:restriction base="xs:string">
<xs:enumeration value="30">
<xs:annotation>
<xs:documentation>
<xs:Label xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Thirty minutes</xs:Label>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="60">
<xs:annotation>
<xs:documentation>
<xs:Label xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Sixty minutes</xs:Label>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="90">
<xs:annotation>
<xs:documentation>
<xs:Label xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Ninety minutes</xs:Label>
</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</ids:value>
</ids:property>
</ids:requirements>
</ids:specification>
</ids:specifications>
</ids:ids>