diff --git a/.github/workflows/ids-lint.yml b/.github/workflows/ids-lint.yml new file mode 100644 index 0000000..2efe753 --- /dev/null +++ b/.github/workflows/ids-lint.yml @@ -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 diff --git a/.github/workflows/ifc-lint.yml b/.github/workflows/ifc-lint.yml new file mode 100644 index 0000000..d6acac8 --- /dev/null +++ b/.github/workflows/ifc-lint.yml @@ -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 diff --git a/IDS/EN_Basic IDM Check.ids b/IDS/EN_Basic IDM Check.ids new file mode 100644 index 0000000..98c8e62 --- /dev/null +++ b/IDS/EN_Basic IDM Check.ids @@ -0,0 +1,114 @@ + + + + EN_Basic IDM Check + Example IDS for model validation according to the BIM Basic Information Delivery Manual (IDM) + sgolchinfar@bimcollab.com + 2024-10-29 + Specify a set of agreements that IFC models must meet according to the basic IDM. + + + + + + + IFCBUILDINGELEMENTPROXY + + + + + + + GlobalId + + + ? + + + + + + + + + Pset_WallCommon + + + IsExternal + + + False + + + + + Pset_WallCommon + + + LoadBearing + + + True + + + + + + + Pset_WallCommon + + + FireRating + + + 30 + + + + + + + + + Pset_WallCommon + + + IsExternal + + + True + + + + + + + Pset_WallCommon + + + Thermal Transmitance + + + + + + + + + IFCFLOWSEGMENT + + + + + + + AC_Pset_RenovationAndPhasing + + + Renovation Status + + + + + + diff --git a/IDS/IDS_random_example.ids b/IDS/IDS_random_example.ids new file mode 100644 index 0000000..24fd04a --- /dev/null +++ b/IDS/IDS_random_example.ids @@ -0,0 +1,81 @@ + + + + random example to show technical capabilities and usage + buildingSMART International Ltd + 2021-09-17 + + + + + + + IFCWINDOW + + + + + + + The value should be a number; a dot; another number. For example '1.1', '2.4', etc. + + + + + + NL-Sfb + + + + + + + attribute + + + OverallWidth + + + + + + + + + + + AedesUVIP + + + FireRating + + + + + + + Thirty minutes + + + + + + + Sixty minutes + + + + + + + Ninety minutes + + + + + + + + + +